ejemplos - ¿Cómo cambiar la identidad de Tor en Python?
django (6)
Hoy, he buscado mucho sobre esta pregunta, y finalmente logré responder a mí mismo. Pero antes necesito decir que pirvoxy y tor deben configurarse correctamente. Primero script, luego un poco sobre configuración:
import urllib2
from TorCtl import TorCtl
proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support)
def newId():
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
conn.send_signal("NEWNYM")
for i in range(0, 10):
print "case "+str(i+1)
newId()
proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
urllib2.install_opener(opener)
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
El script anterior obtiene una nueva IP y lo verifica en el sitio web de ifconfig.me. Sobre la configuración: Necesitamos Privoxy . para usar TOR con conexiones HTTP, privoxy debería funcionar con tor. Podemos hacerlo agregando este archivo a / etc / privoxy / config:
forward-socks5 / localhost:9050 . #dot is important at the end
luego configuramos ControlPort en el archivo / etc / tor / torrc. Solo necesitamos descomentar esta línea:
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
entonces simplemente reiniciamos tor:
/etc/init.d/tor restart
Tengo el siguiente script:
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
que utiliza tor y SocksiPy
Ahora quiero cambiar tu identidad con cada solicitud, por ejemplo:
for i in range(0, 10):
#somehow change tor identity
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
¿Cómo puedo hacer esto?
Lo siguiente podría funcionar:
for i in range(0, 10):
#somehow change tor identity
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050+i)
socket.socket = socks.socksocket
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
Básicamente, configura el proxy antes de realizar cada conexión. Supongo que tiene diferentes servidores proxy para diferentes IP ya que no ha indicado cómo desea cambiar la IP
Otra solución simple, no se requieren bibliotecas externas, funciona tanto para IPv4 como para IPv6:
import socket
try:
tor_c = socket.create_connection((TOR_CTRL_HOST, TOR_CTRL_PORT))
tor_c.send(''AUTHENTICATE "{}"/r/nSIGNAL NEWNYM/r/n''.format(TOR_CTRL_PWD))
response = tor_c.recv(1024)
if response != ''250 OK/r/n250 OK/r/n'':
sys.stderr.write(''Unexpected response from Tor control port: {}/n''.format(response))
except Exception, e:
sys.stderr.write(''Error connecting to Tor control port: {}/n''.format(repr(e)))
Puede habilitar el servidor de control de tor sin comentar algunas líneas en
/etc/tor/torrc
Y use la biblioteca principal para enviar la señal NEWNYM para cambiar el circuito.
controller.signal(Signal.NEWNYM)
Tor escribió una nueva biblioteca de control TOR en Python, stem . Se puede encontrar en PyPI . Proporcionan algunos buenos tutoriales sobre cómo trabajar con ellos, one de ellos explica cómo cambiar su identidad:
from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
Asegúrese de que su configuración es correct .
Este es un video donde estoy usando STEM, SockSipy, Tor 100% trabajando :)
#!/usr/bin/python
import socks
import socket
import time
from stem.control import Controller
from stem import Signal
import urllib2
import sys
def info():
print "[*] Welcome to Chart-Cheat Script"
print "[*] This script works with running TOR only"
print "[*] usage is chartcheat.py domain"
print "[*] argument domain must be in format www.example.com"
print "[*] Example: chartcheat.py www.example.com"
return
if len(sys.argv)==2:
info();
counter = 0
url = str(sys.argv[1]);
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
#visiting url in infinite loop
while True:
urllib2.urlopen("http://"+url)
counter=counter+1
print "Page " + url + " visited = " + str(counter)
#wait till next identity will be available
controller.signal(Signal.NEWNYM)
time.sleep(controller.get_newnym_wait())
else:
info();
En caso de que esté ejecutando python3, el paquete urllib en python3 será el mismo que el paquete urllib2 en python2.