requests - Hacer peticiones usando Python sobre Tor
pip install tor (7)
Aquí está el código que desea usar (descargue el paquete stem usando pip install stem
)
from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password=''your password set for tor controller port in torrc'')
print("Success!")
controller.signal(Signal.NEWNYM)
print("New Tor connection processed")
Buena suerte y espero que funcione.
Quiero hacer varias solicitudes GET usando Tor a una página web. Quiero usar una dirección ip diferente para cada solicitud.
import socks
import socket
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
import requests
print (requests.get(''http://icanhazip.com'')).content
Usando esto, hice una petición. ¿Cómo puedo cambiar la dirección ip para hacer otra?
Esta respuesta completa la de Ashish Nitin Patil para Windows (no dude en actualizar esta respuesta)
Parte 2
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
El HashedControlPassword
anterior es la contraseña. Si desea establecer una contraseña diferente en la consola, vaya a /Tor Browser/Browser/TorBrowser/Tor
y escriba los siguientes comandos: tor.exe --hash-password password_XYZ | more
tor.exe --hash-password password_XYZ | more
). Le dará algo como HashedControlPassword 16:54C092A8...
Esta es su contraseña. Ahora puede agregarlo al archivo torrc ( Tor Browser/Browser/TorBrowser/Data/Tor/torrc
).
Necesitarás entonces reiniciar Tor:
tor --service remove
tor --service install -options ControlPort 9051
Para comprobar si funciona, escriba netstat -an
ahora verá que el puerto 9051 está abierto.
Tenga en cuenta que tor --service install -...
creará el servicio Tor Win32 Service
. Por alguna razón, parece que tiene que detener el servicio para usar el navegador (ejecute services.msc
)
EDITAR: encontrará mucha información here (sobre número de puerto y proxy, Tor, Privoxy, agente de usuario de cambio automático ...).
Este código funciona bien. Usando Tor, cambia la dirección IP después de cada solicitud.
import time, socks, socket
from urllib2 import urlopen
from stem import Signal
from stem.control import Controller
nbrOfIpAddresses=3
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password = ''my_pwd'')
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
for i in range(0, nbrOfIpAddresses):
newIP=urlopen("http://icanhazip.com").read()
print("NewIP Address: %s" % newIP)
controller.signal(Signal.NEWNYM)
if controller.is_newnym_available() == False:
print("Waitting time for Tor to change IP: "+ str(controller.get_newnym_wait()) +" seconds")
time.sleep(controller.get_newnym_wait())
controller.close()
Las requests
en requesocks
son super antiguas, no tienen response.json()
y muchas otras cosas.
Me gustaría mantener mi código limpio. Sin embargo, las requests
actualmente no tienen socks5 admitido todavía (para obtener más detalles, lea este hilo https://github.com/kennethreitz/requests/pull/478 )
Así que usé Privoxy
como un proxy http que conecta Tor por ahora.
Instalar y configurar Privoxy en Mac
brew install privoxy
vim /usr/local/etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
privoxy /usr/local/etc/privoxy/config
Instalar y configurar Privoxy en Ubuntu
sudo apt-get install privoxy
sudo vim /etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
sudo /etc/init.d/privoxy restart
Ahora puedo usar Tor como un proxy http. A continuación se muestra mi script de python.
import requests
proxies = {
''http'': ''http://127.0.0.1:8118'',
}
print requests.get(''http://httpbin.org/ip'', proxies=proxies).text
Puede utilizar la biblioteca torrequest
(conector descarado). Está disponible en PyPI.
from torrequest import TorRequest
with TorRequest() as tr:
response = tr.get(''http://ipecho.net/plain'')
print(response.text) # not your IP address
tr.reset_identity()
response = tr.get(''http://ipecho.net/plain'')
print(response.text) # another IP address, not yours
Su pregunta tiene 2 aspectos:
- Hacer peticiones usando Tor
- Renovación de la conexión según el requisito (en su caso, después de cada solicitud)
Parte 1
La primera es fácil de hacer con la última (más de v2.10.0) biblioteca de requests
con un requisito adicional de requests[socks]
para usar el proxy de calcetines.
Instalación -
pip install requests requests[socks]
Uso básico -
import requests
def get_tor_session():
session = requests.session()
# Tor uses the 9050 port as the default socks port
session.proxies = {''http'': ''socks5://127.0.0.1:9050'',
''https'': ''socks5://127.0.0.1:9050''}
return session
# Make a request through the Tor connection
# IP visible through Tor
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
# Above should print an IP different than your public IP
# Following prints your normal public IP
print(requests.get("http://httpbin.org/ip").text)
Parte 2
Para renovar la Tor Tor IP, es decir, para tener una IP de salida visible nueva, debe poder conectarse al servicio Tor a través de su ControlPort
y luego enviar una señal NEWNYM
.
La instalación normal de Tor no habilita el ControlPort
por defecto. Tendrás que editar tu archivo torrc y descomentar las líneas correspondientes.
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
Tenga en cuenta que el HashedControlPassword
anterior es para la contraseña "password"
. Si desea establecer una contraseña diferente, reemplace HashedControlPassword
en el torrc anotando la salida de tor --hash-password "<new_password>"
donde <new_password>
es la contraseña que desea establecer.
Bien, ahora que hemos configurado Tor correctamente, tendrás que reiniciar Tor si ya se está ejecutando.
sudo service tor restart
Advertencia para los usuarios de Windows: ver post here .
Hay un problema en Windows donde la configuración para el controlport en el archivo torrc se ignora si tor se instaló usando el siguiente comando:
tor --service install
Para resolver el problema, después de editar el archivo torrc, escriba los siguientes comandos:
tor --service remove
tor --service install -options ControlPort 9051
Tor debería estar ahora en funcionamiento en el ControlPort
9051 a través del cual podemos enviarle comandos. Prefiero usar la biblioteca de vástagos oficial para controlar Tor.
Instalación -
pip install stem
Ahora puede renovar el Tor IP llamando a la siguiente función.
from stem import Signal
from stem.control import Controller
# signal TOR for a new connection
def renew_connection():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="password")
controller.signal(Signal.NEWNYM)
Para verificar que Tor tiene una nueva IP de salida, simplemente vuelva a ejecutar el código de la Parte 1. Por alguna razón que desconozco, debe crear un nuevo objeto de session
para poder usar la nueva IP.
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
Las solicitudes admiten proxies utilizando el protocolo SOCKS de la versión 2.10.0.
import requests
proxies = {
''http'': ''socks5://localhost:9050'',
''https'': ''socks5://localhost:9050''
}
url = ''http://httpbin.org/ip''
print(requests.get(url, proxies=proxies).text)