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?

42
demandé sur Sachin Kelkar 2015-05-17 14:17:02

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.

23
répondu jamescampbell 2015-05-25 14:15:12

il y a 2 aspects à votre question -

  1. Faire des demandes à l'aide de Tor
  2. 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>"<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)
63
répondu shad0w_wa1k3r 2017-11-02 07:10:42

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
12
répondu Erdi Aker 2016-10-18 07:44:13

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)
6
répondu Karimov Dmitriy 2016-12-06 12:48:57

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

3
répondu JinSnow 2018-02-03 18:10:19

requestsrequesocks 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
1
répondu Tobias 2016-03-11 08:47:07

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()
1
répondu N.G.Searching 2018-02-14 11:56:41