我正在尝试使用未记录的库uwhoisd,但无法弄清楚如何在whois()对象上成功调用UWhois函数。

我通过调用具有以下内容的文件UwhoisDeamon.py来启动守护进程:

import uwhoisd
uwhoisd.main()


我给python的参数是我下载源代码时包含在额外目录中的*.ini file

通过以下输出成功启动守护进程:


  2016-04-21 19:00:19,830 INFO:uwhoisd正在读取配置文件
  '/path/to/my/ini/uwhoisd.ini'2016-04-21
  19:00:19,838 INFO:uwhoisd听0.0.0.0:4243 2016-04-21
  19:00:19,842 INFO:uwhoisd缓存已激活[2016/04/21 17:00:19]
  {柴油}警告|启动柴油


现在,我尝试通过启动一个单独的python实例在google.com上执行whois,然后被打光了(我重用了this代码):

from os import path
import uwhoisd
from uwhoisd.utils import make_config_parser

HERE = path.dirname(__file__)

def create_uwhois():
    """Prepare a UWhois object for testing."""
    config = path.join(HERE, 'uwhoisd.ini')
    parser = make_config_parser(uwhoisd.CONFIG, config)
    uwhois = uwhoisd.UWhois()
    uwhois.read_config(parser)
    return uwhois

uwhois = create_uwhois()
# uwhois = uwhoisd.UWhois()
result = uwhois.whois("google.com")
print result


结果如下:

Traceback (most recent call last):
  File "/home/user/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.9.0.201411111611/pysrc/pydevd.py", line 2183, in <module>
    globals = debugger.run(setup['file'], None, None)
  File "/home/user/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.9.0.201411111611/pysrc/pydevd.py", line 1622, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/path/to/my/project/Whois/WhoisChecker.py", line 17, in <module>
    result = uwhois.whois("google.com")
  File "/usr/local/lib/python2.7/dist-packages/uwhoisd/__init__.py", line 137, in whois
    with net.WhoisClient(server, port) as client:
  File "/usr/local/lib/python2.7/dist-packages/diesel/client.py", line 16, in __init__
    ip = self._resolve(self.addr)
  File "/usr/local/lib/python2.7/dist-packages/diesel/client.py", line 21, in _resolve
    return resolve_dns_name(addr)
  File "/usr/local/lib/python2.7/dist-packages/diesel/resolver.py", line 67, in resolve_dns_name
    except (NotFound, Timeout):
  File "/usr/local/lib/python2.7/dist-packages/diesel/util/lock.py", line 24, in __exit__
    self.release()
  File "/usr/local/lib/python2.7/dist-packages/diesel/util/lock.py", line 18, in release
    fire(self)
  File "/usr/local/lib/python2.7/dist-packages/diesel/core.py", line 92, in fire
    return current_loop.fire(*args, **kw)
AttributeError: 'NoneType' object has no attribute 'fire'


在我看来,uwhoisd用于在客户端和守护程序之间进行通信的diesel库需要一些特殊条件才能使其正常工作。从我可以看到神秘的current_loop没有运行。但是我以前从未使用过柴油,也不知道该怎么办。在我看来,我必须以某种方式启动柴油循环,然后才能执行那些whois查询。

一个有效的例子将是很好的。我选择uwhoisd的主要原因是我可以在诸如“ win.win”之类的异国网站上执行Whois。它还缓存响应,这意味着更快的速度和更少的网络。

最佳答案

这里的作者。

首先,摆脱UwhoisDeamon.py:这是一个守护进程,而不是一个库。您必须先运行该守护程序,然后使用whois客户端对其进行查询。您无需编写任何其他代码即可启动并运行。它已经安装了可以执行正确操作的工作控制台脚本。

例如,将其安装到虚拟环境中时,它将创建一个名为uwhoisd的脚本,您可以使用该脚本来运行守护程序。这是一个例子:

$ virtualenv env
$ env/bin/pip install uwhoisd
Downloading/unpacking uwhoisd
  Downloading uwhoisd-0.0.7-py2-none-any.whl
... installation log ...
Successfully installed uwhoisd diesel greenlet twiggy pyopenssl flask http-parser dnspython six cryptography Werkzeug Jinja2 itsdangerous idna pyasn1 setuptools enum34 ipaddress cffi MarkupSafe pycparser
Cleaning up...


如果不使用该守护程序,则假定已安装所有必需的系统软件包,这是应该得到的:

$ env/bin/uwhoisd
Usage: uwhoisd <config>


uwhoisd需要一个配置文件,该文件告诉它如何与需要查询的各种WHOIS服务器进行通信。您可以像这样下载文件:

$ wget https://raw.githubusercontent.com/kgaughan/uwhoisd/master/extra/uwhoisd.ini


使用此配置文件运行守护程序将为您提供以下信息:

$ env/bin/uwhoisd uwhoisd.ini
2016-05-03 17:41:25,028 INFO:uwhoisd    Reading config file at 'uwhoisd.ini'
2016-05-03 17:41:25,038 INFO:uwhoisd    Listen on 0.0.0.0:4243
2016-05-03 17:41:25,058 INFO:uwhoisd    Caching activated


第二行指示守护程序在哪个地址和端口上运行。在这种情况下,它正在端口4243上的所有接口上运行,因此您现在可以在该端口上(在另一个终端窗口中)向它发出请求:

$ whois -h localhost -p 4243 stackoverflow.com
Domain Name: STACKOVERFLOW.COM
Registry Domain ID: 108907621_DOMAIN_COM-VRSN
...


并且您应该在运行守护程序的终端中看到以下其他日志行:

2016-05-03 17:43:36,841 INFO:uwhoisd    Querying whois.verisign-grs.com about stackoverflow.com
2016-05-03 17:43:37,283 INFO:uwhoisd    Recursive query to whois.name.com about stackoverflow.com


您不应该直接使用uwhois的内部函数:它是一个守护进程,并非旨在用作库,当然也不是在柴油事件循环之外,这就是为什么您要进行追溯。但是,使用配置文件运行守护程序,您会很高兴。

不幸的是,我还没有时间为它需要的守护程序编写所有文档,但是我希望能尽快解决。

10-06 02:43