# 使用python批量查询未注册ens域名

By [0x210](https://paragraph.com/@0x210) · 2022-05-03

---

这是我第一次写教程，我其实不爱写东西，但是白嫖了各位大佬各种教程，也想对一些新入这个圈子的家人们做一些贡献。

我不是程序员出身，对代码可以说完成不在行，最初加入了DFarm社区，也是想白嫖一下科学家们使用的一些工具和方法，提高自己的撸毛效率。最近一直在看DFarm社区小伟哥的一些课程文章，并加入自己的实践，写得真的蛮好的，能给自己在撸毛道路上提供一些思想和方法，完全值回票价！

这段时间不是在炒作ens的各种3位数，4位数域名吗，当时我就在想，一个一个去ens官网查询，效率太低，该如何批量查询，下面提供了3种方法和思路。

### 方法1：

使用现成的一些工具和网站，比如：

[https://www.ens.vision/](https://www.ens.vision/)

[https://ens.tools/domains](https://ens.tools/domains)

这些网站都能批量查询ens域名的一些注册情况。

### 方法2：

这是我最初想到的一个办法，就是批量请求ens官网，查询注册结果。

<1> 首先我们输入一个123.eth的域名，在chrome上打开F12查看相应信息。

![](https://storage.googleapis.com/papyrus_images/d94e4cb1e81623b32afaac707ad14e89f48d93fd8544781f149be15bcfd5ce0e.png)

点击header界面，可以看到，在ens官网点击search的时候，实际上是执行了一个post请求去查询，请求网址是

[https://api.thegraph.com/subgraphs/name/ensdomains/ens](https://api.thegraph.com/subgraphs/name/ensdomains/ens)

<2>我们再来看下请求的参数，点击Payload界面，红框中这一串花里胡哨的就是post请求携带的参数，我们注意一下其中一个值，id：0x64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107

![](https://storage.googleapis.com/papyrus_images/fcacd8a8fd4994f1704a02460fa81c536027ba3407a20e6465501a0e341862af.png)

<3>我们再看下返回的值，点击response界面，可以看到返回值有上面提到的id值，有123.eth值

![](https://storage.googleapis.com/papyrus_images/1914a01679a5e179fde348c818f3f1b5048c165aa123c5833a85d4716e4a157f.png)

PS：如果有对post，get不熟悉的，可以看看小伟哥这篇文章，我就是从这篇入门的。

[https://mirror.xyz/dfarm.eth/-0BPp9Y7AkO19wY\_QfK7aF9YkmARjHkSJ\_sJXHRhKJE](https://mirror.xyz/dfarm.eth/-0BPp9Y7AkO19wY_QfK7aF9YkmARjHkSJ_sJXHRhKJE)

<4>我们重复执行之前<1>---<3>的步骤，但是这次选取一个未注册过的域名，比如ddasdas.eth，查看header，payload，response 3个界面，对比之前的信息。

header：没啥区别，一模一样

payload：id值发生了变化

![](https://storage.googleapis.com/papyrus_images/94bdf49951deb8a997c0cf3e27d0a043e2416402c41a76c2c37feea99bbdf754.png)

response：返回一个null值

![](https://storage.googleapis.com/papyrus_images/3badb39029609902dee996449210fbbfdb44298eb45d6c914f282d22ececfbd2.png)

到这里我们基本可以推断，一个id值应该对应了一个域名，那么我们可以批量post不同的id值，根据返回的结果，判断ens是否被注册，如果返回null，那域名是未被注册的。

可以看下python执行的2次结果。

第一次，返回了123.eth的值

![](https://storage.googleapis.com/papyrus_images/9f53743983b067ca5182d0d05a53241652e1f6a786fa5aa6d8dd8e980d83f270.png)

第二次，修改id值，返回了null

![](https://storage.googleapis.com/papyrus_images/d00c6622dcbb3aca317549ad58b3ddc166ca346e8a8cb61ab8909e0cbc3f9ef3.png)

那么问题来了，id值和域名的对应关系是啥？？？我也不知道，我查了下，水平太菜，没查出这个对应关系，如果有大佬明白，还请指点一下。。。

所以，第二条路其实是没走通的…这里是提供了一种思路，也许其他链能走通呢。

### 方法3：

第二条路没走通后，想着还是把这个项目搞完吧，就又去看了下ens官方的文档，找到ens的对应python库---web3.py

![](https://storage.googleapis.com/papyrus_images/18a8c9c45fd25c3db38c18badc8a4ac64918692b6237d96089a4eef88d306db7.png)

当我们查看web3.py上ens的一些api接口，你会发现别人都给你写好了。。。直接用就是了。。。

[https://web3py.readthedocs.io/en/stable/ens\_overview.html](https://web3py.readthedocs.io/en/stable/ens_overview.html)

![](https://storage.googleapis.com/papyrus_images/232634294fc16c17a5ac1c17d0ac28354b38170df7bce3b737478eca19432d4b.png)

ns.owner这个函数可以根据域名直接查出owner的eth地址，那么我们使用测试一下。

按照官方的文档，我们一步一步执行。

![](https://storage.googleapis.com/papyrus_images/27605ef03249f2120a92351c51a403ca67196500858d3bbcc58c3a3af3f4e80e.png)

<1>首先我们要创建一个ens object，可以用3种方法创建。

我选的是第三种，因为第一种和第二种我没搞懂怎么用…..

点击api文档的providers

![](https://storage.googleapis.com/papyrus_images/a4c855984b560263e27c2ab0cd99c3455bd98babf103270747e04046a0236a64.png)

看文档的意思貌似是要连接到一个eth的provider节点，通过provider查询ens的相应信息。这个provider你可以自己搭建（走远了..），也可以连接remote node。

我们继续往下看，貌似可以免费注册infura，然后来进行api调用。infura大家是不是听着有些熟悉，对，就是前几天崩溃那个..

![](https://storage.googleapis.com/papyrus_images/16e4c01f0ef8df19601f04ee12f934953a295d68297e145a81cba0f1df11358a.png)

<2>我们先免费注册一个，注册流程我这里就不写了。

[https://infura.io/](https://infura.io/)

注册完成后，创建一个noder，选择ethereum，创建完成后，如下图，保留好你的keys

![](https://storage.googleapis.com/papyrus_images/9870b7d0f239d68b3990c958940d4346f38e1293ffbae8891dc6ea3135086e65.png)

可以看到，这里提供了https和wss两种访问方式。

<3>我们继续按照api文档一步一步执行

![](https://storage.googleapis.com/papyrus_images/c138700c2d4f6a76120c91a49f500ecec70723ecf539e0ed56329969006a9174.png)

首先我们pip安装web3.py库，然后from web3 import Web3， from ens import ENS

HTTPProvider('[**https://mainnet.infura.io/v3/xxx**](https://mainnet.infura.io/v3/xxx)')) 后面https://这段网址就是之前infura注册后，创建ethereum noder后保存的endpoints的值

![](https://storage.googleapis.com/papyrus_images/95ee4a7ea5832c5260f40c348577a58f60cb4c84c1e6da86e9f3a090b8063cb2.png)

然后直接调用ns = ENS.fromWeb3(w3)，ens的object就创建成功了。

<4>直接调用ns.owner('xxxx.eth')，括号内为需要查询的ens域名，如果返回值为0x0000000000000000000000000000000000000000，那么域名就未被注册，还是以123.eth和ddasdas.eth为例，以下是全部代码，我们看下运行结果。

![](https://storage.googleapis.com/papyrus_images/9e4d67babb92b321b2e4a8553c4de82f05f2b79a5304716909c6f93893bd9310.png)

这里可以看到，123.eth目前是注册了的，ddasdas.eth是可用的。

<5>写个循环，批量查询，即可得到我们想要查询的ens域名了，以下代码是查询51000--52000的ens域名情况，每执行一次查询，建议sleep 1s，不然会报连接错误。

![](https://storage.googleapis.com/papyrus_images/0c69b81c2a30aa22d83eaaefb4f9f4dd316b596ab51339eaafb5301188501da6.png)

最后我们再看看infura.io上的相关数据，可以看到一些请求量和方法。

![](https://storage.googleapis.com/papyrus_images/b1ef11d1e8957a360b7e15fc65e1ef885db9747cef7bcbe38f5b56bb05d9d819.png)

---

*Originally published on [0x210](https://paragraph.com/@0x210/python-ens)*
