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 方面有啥区别? [关闭]