Библиотека TorCtl и Socksipy вызывает исключение в Python

Я пишу сценарий на 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'

В чем проблема?


person Ariyan    schedule 05.06.2012    source источник


Ответы (2)


Это ваш собственный код, вызывающий исключение, а не библиотека. Особенно,

TorCtl.connect(passphrase="test")

возвращает None второй раз, что приводит к ошибке при вызове .send_signal результата.

Я предполагаю, что newTorId() предназначен для запроса нового идентификатора Tor. Вам, вероятно, следует просто позвонить TorCtl.Connection.send_signal(conn, "NEWNYM"), чтобы получить новую личность, вместо того, чтобы каждый раз пытаться создавать новое соединение. См. Python - управление Tor.

person Mechanical snail    schedule 05.06.2012
comment
Вы правы насчет стандартов кодирования, но это не проблема (и не решает ее); потому что если каждый раз TorCtl.connect должен создавать новый объект TorCtl.Connection, значит, проблем быть не должно! (За исключением незакрытых системных сокетов, которые, я думаю, python закроет их после newTorId()) После этого, если я удалю строку socket.socket = socks.socksocket, проблема будет решена! поэтому кажется, что назначение Tor сокету SocksiPY создает проблему! - person Ariyan; 05.06.2012
comment
Я не говорю о стандартах кодирования. Ясно, что TorCtl.connect() возвращает None, независимо от того, что он должен делать. - person Mechanical snail; 05.06.2012
comment
Понятно ;-) Вы правы !! Я не знаю, почему это работает таким образом, но ваше решение работает; Спасибо - person Ariyan; 05.06.2012
comment
Как это решает проблему? TorCtl.Connection.send_signal(conn, "NEWNYM") полагается на тот же объект conn, что и conn.send_signal("NEWNYM"). Если это None, то оба решения работать не будут. - person Desprit; 19.01.2017

Как упоминалось ранее, метод connect () TorCtl предоставляет None, если не удается подключиться.

Помимо этого, этот вопрос, кажется, возникает довольно часто (1, 2), поэтому я просто добавил FAQ за это. TorCtl устарел, поэтому вот пример с использованием стержень ...

from stem import Signal
from stem.control import Controller

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