Je souhaite effectuer plusieurs requêtes GET à l'aide de Tor vers une page Web. Je veux utiliser une adresse IP différente pour chaque demande.
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 cela, j'ai fait une demande. Comment puis-je changer l'adresse IP pour en créer une autre?
Voici le code que vous voulez 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 j'espère que ça fonctionne.
Il y a 2 aspects à votre question -
Le premier est facile à utiliser avec la dernière (à partir de la v2.10.0) requests
bibliothèque avec une exigence supplémentaire de requests[socks]
pour utiliser le proxy 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)
Pour renouveler l'adresse IP de Tor, c'est-à-dire pour avoir une nouvelle adresse IP de sortie visible, vous devez pouvoir vous connecter au service Tor via ControlPort
, puis envoyer un signal NEWNYM
.
L'installation normale de Tor n'active pas le ControlPort
par défaut. Vous devrez éditer votre fichier torrc et décommenter les lignes correspondantes.
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 est pour le mot de passe "password"
. Si vous voulez définir un mot de passe différent, remplacez le HashedControlPassword
dans le fichier torrc en notant le résultat de tor --hash-password "<new_password>"
où <new_password>
est le mot de passe que vous souhaitez définir.
.................................................. ..............................
Avertissement pour les utilisateurs Windows: voir l'article ici .
Il y a un problème sur Windows où le paramètre de controlport dans le fichier torrc est ignoré si tor a été installé à l'aide de la commande suivante:
tor --service install
Pour résoudre le problème, après avoir modifié votre fichier torrc, tapez les commandes suivantes:
tor --service remove
tor --service install -options ControlPort 9051
.................................................. ..............................
Bon, maintenant que Tor est correctement configuré, vous devrez le redémarrer s'il est déjà en cours d'exécution.
Sudo service tor restart
Tor devrait maintenant être opérationnel sur le 9051 ControlPort
par lequel nous pouvons lui envoyer des commandes. Je préfère utiliser le bibliothèque officielle de souches pour contrôler Tor.
Installation -
pip install stem
Vous pouvez maintenant renouveler l'adresse IP de Tor en appelant la fonction suivante.
Renouveler IP -
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, relancez le code de la partie 1. Pour une raison inconnue, vous devez créer un nouvel objet session
afin de pouvoir utiliser la nouvelle adresse IP.
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
Vous pouvez utiliser la bibliothèque torrequest
(plug sans scrupule). 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 à partir 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 de Ashish Nitin Patil pour fenêtres (n'hésitez pas à mettre à jour cette réponse)
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
Le HashedControlPassword
ci-dessus est le mot de passe. Si vous souhaitez définir un mot de passe différent dans la console, accédez à \Tor Browser\Browser\TorBrowser\Tor
et tapez les commandes suivantes: tor.exe --hash-password password_XYZ | more
). Cela vous donnera quelque chose comme HashedControlPassword 16:54C092A8...
Ceci est votre mot de passe. Maintenant, vous pouvez l'ajouter au fichier torrc (Tor Browser\Browser\TorBrowser\Data\Tor\torrc
).
Vous devrez ensuite redémarrer Tor:
tor --service remove
tor --service install -options ControlPort 9051
Pour vérifier si cela fonctionne, tapez netstat -an
vous verrez maintenant que le port 9051 est ouvert.
Remarquerez que tor --service install -...
va créer Tor Win32 Service
. Pour une raison quelconque, il semble que vous devez arrêter le service pour utiliser le navigateur (exécutez services.msc
)
EDIT: vous trouverez de nombreuses informations ici (À propos du numéro de port et du proxy, Tor, Privoxy, Agent d'utilisateur à permutation automatique ...).
Ce code fonctionne bien. En utilisant Tor, il change 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()
Vous pouvez essayer l’implémentation du protocole pure-python tor Torpy . Pas besoin du client Tor original ou de la dépendance de la tige du tout.
$ pip3 install torpy
...
$ python3.7
>>> from torpy.http.requests import TorRequests
>>> with TorRequests() as tor_requests:
... print("build circuit")
... with tor_requests.get_session() as sess:
... print(sess.get("http://httpbin.org/ip").json())
... print(sess.get("http://httpbin.org/ip").json())
... print("renew circuit")
... with tor_requests.get_session() as sess:
... print(sess.get("http://httpbin.org/ip").json())
... print(sess.get("http://httpbin.org/ip").json())
...
build circuit
{'Origin': '23.129.64.190, 23.129.64.190'}
{'Origin': '23.129.64.190, 23.129.64.190'}
renew circuit
{'Origin': '198.98.50.112, 198.98.50.112'}
{'Origin': '198.98.50.112, 198.98.50.112'}
Ainsi, chaque fois que vous obtenez une nouvelle session, vous obtenez une nouvelle identité (en gros, vous obtenez un nouveau circuit avec un nouveau nœud de sortie). Voir plus d'exemples dans le fichier lisez-moi https://github.com/torpyorg/torpy
Le requests
dans requesocks
est super vieux, il n'a pas response.json()
et beaucoup d'autres choses.
Je voudrais garder mon code propre. Cependant, requests
ne supporte pas encore socks5 (pour plus de détails, lisez ce fil https://github.com/kennethreitz/requests/pull/478 )
J'ai donc utilisé Privoxy
en tant que proxy http qui connecte Tor pour le moment.
Installez et configurez 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
Installez et configurez 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. Vous trouverez 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