Excepción de script en Python con Tor

Tengo el siguiente script que usa SocksiPY

y Tor:

from TorCtl import TorCtl import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) socket.socket = socks.socksocket import urllib2 import sqlite3 from BeautifulSoup import BeautifulSoup def newId(): conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123") TorCtl.Connection.send_signal(conn, "NEWNYM") newId() print(urllib2.urlopen("http://www.ifconfig.me/ip").read()) 

Este código debe cambiar la identidad de Tor, pero espera un tiempo y da el siguiente error:

 tuple index out of range Traceback (most recent call last): File "template.py", line 16, in  newId() File "template.py", line 14, in newId TorCtl.Connection.send_signal(conn, "NEWNYM") TypeError: unbound method send_signal() must be called with Connection instance as first argument (got NoneType instance instead) 

Pero el script anterior se divide en 2 scripts separados:

 import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) socket.socket = socks.socksocket import urllib2 import sqlite3 from BeautifulSoup import BeautifulSoup print(urllib2.urlopen("http://www.ifconfig.me/ip").read()) 

Y:

 from TorCtl import TorCtl def newId(): conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123") TorCtl.Connection.send_signal(conn, "NEWNYM") newId() 

Cuando se llama a la segunda secuencia de comandos, a la primera se le llama, está bien. ¿Alguien puede explicar cuál es el problema y cómo solucionarlo?

Anónimo explicó muy bien esta sobrescritura de socket, la respuesta es casi perfecta excepto que tiene que cerrar el socket de control . Es más seguro debido al bucle de eventos TorCtl, pero tengo que profundizar en el código TorCtl para comprender este bucle de eventos.

Para resumir su código se convierte en:

 from TorCtl import TorCtl import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) import urllib2 import sqlite3 from BeautifulSoup import BeautifulSoup __originalSocket = socket.socket def newId(): ''' Clean circuit switcher Restores socket to original system value. Calls TOR control socket and closes it Replaces system socket with socksified socket ''' socket.socket = __originalSocket conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123") TorCtl.Connection.send_signal(conn, "NEWNYM") conn.close() socket.socket = socks.socksocket newId() print(urllib2.urlopen("http://www.ifconfig.me/ip").read()) 

La conexión al puerto de control falla y se asigna a conn el valor que los sockets de Python utilizan para indicar una falla (que aparentemente es de tipo NoneType ).

La razón es que en la statement socket.socket = socks.socksocket , aparentemente, usted está reemplazando el objeto o clase de socket predeterminado por uno que proxiza todo a través de Tor, lo que hace que el progtwig intente establecer su conexión de puerto de control.

La solución es realizar solo socket.socket = socks.socksocket después de haber abierto la conexión de control (y mantener esa conexión si la necesita más adelante) o guardar el valor original de socket.socket para que pueda cambiar entre los valores según sea necesario.