【问题标题】:python: how to perform whois with uwhoisd proxypython:如何使用 uwhoisd 代理执行 whois
【发布时间】:2016-04-28 18:40:19
【问题描述】:

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

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

import uwhoisd
uwhoisd.main()

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

启动守护进程成功,输出如下:

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

现在我正在尝试通过启动一个单独的 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。它还缓存响应,这意味着更快的速度和更少的网络。

【问题讨论】:

    标签: python proxy network-programming client whois


    【解决方案1】:

    uwhoisd 的作者在这里。

    首先,摆脱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 的内部结构:它是一个守护进程,并非旨在用作库,当然也不能像这样在柴油的事件循环之外使用,这就是您获得该回溯的原因。但是,使用配置文件运行守护程序,您将获得成功。

    很遗憾,我没有时间为它需要的守护进程编写所有文档,但我希望能尽快解决这个问题。

    【讨论】:

    • 非常感谢!我想这意味着我必须自己解析输出,但这不是什么大问题。
    • 恐怕无法避免,尽管对于 gTLD,如今有一种易于解析的固定格式:icann.org/resources/pages/… 对于精简注册管理机构(.com、.net、.jobs 等),不幸的是,并非所有注册商都使用这种格式。对于 ccTLD(两个字母的域名),这完全是废话。 :-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多