web-dev-qa-db-fra.com

Effectuer des requêtes en utilisant Python sur Tor

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?

48
Sachin Kelkar

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.

26
jamescampbell

Il y a 2 aspects à votre question -

  1. Faire des demandes en utilisant Tor
  2. Renouveler la connexion selon les besoins (dans votre cas, après chaque demande)

Partie 1

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)

Partie 2

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>"<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)
78
shad0w_wa1k3r

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
15
Erdi Aker

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)
7
Karimov Dmitriy

Cette réponse complète celle de Ashish Nitin Patil pour fenêtres (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

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 ...).

3
JinSnow

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()
3
N.G.Searching

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

2
James Brown

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
1
Tobias