Faire des requêtes en utilisant Python over Tor
je veux faire plusieurs requêtes GET en utilisant Tor sur une page web. Je veux utiliser une adresse IP différente pour chaque requête.
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
en utilisant ceci, j'ai fait une demande. Comment puis-je changer l'adresse ip pour faire un autre?
7 réponses
voici le code que vous souhaitez utiliser (Téléchargez le paquet stem en utilisant 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")
bonne chance et espérons que ça marche.
il y a 2 aspects à votre question -
- Faire des demandes à l'aide de Tor
- Renouvellement de la connexion selon l'exigence (dans votre cas, après chaque requête)
Partie 1
la première est facile à faire avec la dernière (à la hausse de v2.10.0)--9--> bibliothèque avec une exigence supplémentaire de requests[socks]
pour l'utilisation du proxy des chaussettes.
Installation -
pip install requests requests[socks]
utilisation de Base -
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)
Partie 2
pour renouveler L'IP Tor, c'est-à-dire pour avoir une nouvelle IP de sortie visible, vous devez être capable de vous connecter au service Tor à travers son ControlPort
et ensuite envoyer un NEWNYM
signal.
l'installation normale du Tor ne permet pas le ControlPort
par défaut. Vous devrez éditer votre fichier torrc et de découpler les ligne.
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
veuillez noter que le HashedControlPassword
ci-dessus pour le mot de passe "password"
. Si vous voulez définir un mot de passe différent, remplacez le HashedControlPassword
dans le torrc en notant la sortie de tor --hash-password "<new_password>"
où <new_password>
est le mot de passe que vous souhaitez définir.
Ok, donc maintenant que nous avons Tor configuré correctement, vous devrez redémarrer Tor si il est déjà en cours d'exécution.
sudo service tor restart
Avertissement pour les utilisateurs de Windows: voir le post ici.
il y a un problème sur windows où le paramètre pour le controlport dans le fichier torrc est ignoré si tor a été installé en utilisant la commande suivante:
tor --service install
pour résoudre le problème, après avoir édité votre fichier torrc, tapez les commandes suivantes:
tor --service remove
tor --service install -options ControlPort 9051
Tor devrait maintenant être en place et en cours d'exécution sur le 9051 ControlPort
par lequel nous pouvons lui envoyer des commandes. Je préfère utiliser le officiel de la tige de la bibliothèque pour le contrôle Tor.
Installation -
pip install stem
vous pouvez maintenant renouveler L'IP Tor en appelant la fonction suivante.
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)
pour vérifier que Tor a une nouvelle adresse IP de sortie, il suffit de relire le code de la partie 1. Pour des raisons inconnues de moi, vous devez créer un nouveau session
objet afin d'utiliser la nouvelle IP.
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
Vous pouvez utiliser torrequest
bibliothèque (bouchon éhonté). Il est disponible sur 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
Requests supporte les mandataires en utilisant le protocole SOCKS de la version 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)
cette réponse complète celle D'Ashish Nitin Patil pour windows (n'hésitez pas à mettre à jour cette réponse)
Partie 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
HashedControlPassword
ci-dessus est le mot de passe. Si vous voulez définir un mot de passe différent dans la console, naviguez vers \Tor Browser\Browser\TorBrowser\Tor
et tapez les commandes suivantes: tor.exe --hash-password password_XYZ | more
). Il vous donnera quelque chose comme HashedControlPassword 16:54C092A8...
Voici votre mot de passe. Maintenant, vous pouvez l'ajouter au fichier torrc (Tor Browser\Browser\TorBrowser\Data\Tor\torrc
).
vous devrez alors redémarrer Tor:
tor --service remove
tor --service install -options ControlPort 9051
pour vérifier si cela fonctionne tapez netstat -an
vous allez maintenant voir que le port 9051 est ouvert.
Notez que tor --service install -...
créer Tor Win32 Service
. Pour une raison quelconque, il semble vous devez arrêter le service pour utiliser le navigateur(run services.msc
)
EDIT: vous trouverez de nombreuses informations ici (Sur un numéro de port & proxy, Tor Privoxy, commutateur Automatique de l'agent utilisateur...).
requests
requesocks
est super vieux, il n'a pas response.json()
et bien d'autres choses.
je voudrais garder mon code propre. Cependant, requests
n'a pas encore de prise en charge de socks5 (pour plus de détails, lire ce thread https://github.com/kennethreitz/requests/pull/478)
donc j'ai utilisé Privoxy
comme un proxy http qui connecte Tor pour le moment.
Installer et configurer Privoxy sur 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
Installer et configurer Privoxy sur 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
maintenant je peux utiliser Tor comme un proxy http. Ci-dessous mon script python.
import requests
proxies = {
'http': 'http://127.0.0.1:8118',
}
print requests.get('http://httpbin.org/ip', proxies=proxies).text
Ce code fonctionne très bien. En utilisant Tor, il modifie l'adresse IP après chaque requête.
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()