TorCtl 和 Socksipy 库在 python 中引发异常

Posted

技术标签:

【中文标题】TorCtl 和 Socksipy 库在 python 中引发异常【英文标题】:TorCtl and Socksipy library raises exception in python 【发布时间】:2012-06-05 07:52:27 【问题描述】:

我正在用 python 编写脚本。 我的脚本使用 urllib2 来读取网页。 我正在使用Socksipy 强制 urllib2 使用 socks 代理 (TOR)。 我的问题是设置socket.socket TorCtl 后不起作用并引发异常。 不起作用的代码是(第一个 newTorId() 有效,第二个失败!):

  newTorId()      #This works
  import socks
  import socket
  socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "localhost", 9050)
  socket.socket = socks.socksocket
  newTorId()     #this Fails!

newTorId 是这样定义的:

from TorCtl import TorCtl
def newTorId():
    conn = TorCtl.connect(passphrase="test")
    conn.send_signal("NEWNYM")

例外是:

__init__() takes exactly 2 arguments (3 given)
Traceback (most recent call last):
  File "script.py", line 97, in <module>
    newTorId()
  File "script.py", line 27, in newTorId
    conn.send_signal("NEWNYM")
AttributeError: 'NoneType' object has no attribute 'send_signal'

有什么问题?

【问题讨论】:

【参考方案1】:

引发异常的是您自己的代码,而不是库。特别是,

TorCtl.connect(passphrase="test")

第二次返回None,导致在结果上调用.send_signal时出错。

我假设newTorId() 旨在请求一个新的 Tor 身份。您可能应该只调用TorCtl.Connection.send_signal(conn, "NEWNYM") 来获取新身份,而不是每次都尝试创建新连接。见Python - Controlling Tor。

【讨论】:

您对编码标准是正确的,但这不是问题(也没有解决);因为如果每次TorCtl.connect 都应该创建一个TorCtl.Connection 的新对象,所以应该没有问题! (除了未关闭的系统套接字,我认为python会在newTorId()之后关闭它们)之后,如果我删除socket.socket = socks.socksocket行,问题就会解决!所以似乎将 Tor 分配给 SocksiPY 套接字会产生问题! 我不是在谈论编码标准。显然TorCtl.connect() 正在返回None,不管它“应该”做什么。 很明显 ;-) 你是对的!我不知道为什么它以这种方式工作,但您的解决方案有效;谢谢 这如何解决问题? TorCtl.Connection.send_signal(conn, "NEWNYM") 依赖于与 conn.send_signal("NEWNYM") 相同的 conn 对象。如果是None,那么这两种解决方案都不起作用。【参考方案2】:

如前所述,TorCtl 的 connect() 方法在连接失败时提供 None。

除此之外,这个问题似乎经常出现(1,2)所以我只是添加了一个FAQ entry。 TorCtl is deprecated,所以这里有一个使用stem的例子...

from stem import Signal
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
  controller.authenticate()
  controller.signal(Signal.NEWNYM)

【讨论】:

以上是关于TorCtl 和 Socksipy 库在 python 中引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 上安装 Socks / SocksIPy?

EPPlus 和 ClosedXML 库在处理 OpenXML 方面有啥区别? [关闭]

cmake 如何知道包含文件和库在哪里?

如何使用 golang 和 mgo 库在 mongodb 中创建文本索引?

通过 Tor 连接时,SocksiP 失败

Nuget 包引用库在 Linux 和 Windows 上具有不同的名称