Stellen Sie Anfragen mit Python über Tor

77

Ich möchte mit Tor mehrere GET-Anfragen an eine Webseite stellen. Ich möchte für jede Anfrage eine andere IP-Adresse verwenden.

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

Damit habe ich eine Anfrage gestellt. Wie kann ich die IP-Adresse ändern, um eine andere zu erstellen?

Sachin Kelkar
quelle
Ist es nicht das, was der Tor tun soll, dh die IP-Adresse des Absenders verschleiern oder auf andere Weise erschweren?
Mhawke
2
Verwenden Sie stem stem.torproject.org
Padraic Cunningham
@mhawke tut es, aber sobald der Verbindungs-Handshake hergestellt ist, bleibt er in dem Satz von IP-Adress-Hops bestehen, über den er eine Verbindung herstellt, weshalb die Operation möglicherweise die IP-Adresse erneut ändern möchte.
Jamescampbell

Antworten:

35

Hier ist der Code, den Sie verwenden möchten (laden Sie das Stammpaket mit herunter 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")

Viel Glück und hoffentlich funktioniert das.

Jamescampbell
quelle
Ich habe diese Lösung ausprobiert, erhalte jedoch den folgenden Fehler: error (61, 'Verbindung abgelehnt'). Es scheint, dass Port 9051 auf meinem Computer nicht geöffnet ist. Ich bin auf einem Mac und habe versucht, alles zu tun, um diesen Port zu öffnen, aber trotzdem diesen Fehler zu erhalten. Irgendwelche Ideen?
Kflaw
1
@kflaw Sie müssen Ihren Steuerport in Torrc auskommentieren und dann tor neu starten. Standardmäßig ist der 9051-Steuerport deaktiviert, da er für die reguläre Verwendung nicht benötigt wird.
Jamescampbell
danke für die antwort, ich habe vergessen zu erwähnen, dass ich den steuerungsport in torrc sowie die authentifizierung mit hash passwort auskommentiert habe. Was vermisse ich?
Kflaw
@kflaw Kannst du einen Link zu deinem Code in Codepen oder so etwas posten, damit ich deinen Fehler wiederholen kann? Danke
Jamescampbell
Hier ist ein Link zu einem Kern - Ich habe mehrere Codefragmente ausprobiert, die ich in ähnlichen Posts gefunden habe, aber alle bleiben beim Versuch, den Steuerport einzurichten, hängen. gist.github.com/kflaw/1a41654993e9692914a7fa18f8819a8f
kflaw
109

Ihre Frage hat zwei Aspekte:

  1. Anfragen mit Tor stellen
  2. Erneuern der Verbindung nach Bedarf (in Ihrem Fall nach jeder Anfrage)

Teil 1

Die erste ist einfach mit der neuesten requestsBibliothek (ab Version 2.10.0) zu erstellen, mit der zusätzlichen Anforderung requests[socks], den Socken-Proxy zu verwenden.

Installation -

pip install requests requests[socks]

Grundlegende Verwendung -

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)

Teil 2

Um die Tor-IP zu erneuern, dh um eine neue sichtbare Exit-IP zu haben, müssen Sie in der Lage sein, über diese eine Verbindung zum Tor-Dienst herzustellen ControlPortund dann ein NEWNYMSignal zu senden .

Die normale Tor-Installation aktiviert die ControlPortStandardeinstellung nicht. Sie müssen Ihre Torrc-Datei bearbeiten und die entsprechenden Zeilen auskommentieren .

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

Bitte beachten Sie, dass das HashedControlPasswordoben Gesagte für das Passwort gilt "password". Wenn Sie ein anderes Kennwort festlegen möchten, ersetzen die HashedControlPasswordin der torrc durch Hinweis auf die Ausgabe von tor --hash-password "<new_password>"wo <new_password>ist das Passwort , das Sie einstellen möchten.

.................................................. ..............................

Warnung für Windows-Benutzer: siehe Beitrag hier .

In Windows tritt ein Problem auf, bei dem die Einstellung für den Steuerport in der Torrc-Datei ignoriert wird, wenn tor mit dem folgenden Befehl installiert wurde:

tor --service install

Geben Sie nach dem Bearbeiten Ihrer Torrc-Datei die folgenden Befehle ein, um das Problem zu beheben:

tor --service remove
tor --service install -options ControlPort 9051

.................................................. ..............................

Okay, jetzt, da wir Tor richtig konfiguriert haben, müssen Sie Tor neu starten, wenn es bereits läuft.

sudo service tor restart

Tor sollte jetzt auf dem 9051 betriebsbereit sein, ControlPortüber den wir Befehle an ihn senden können. Ich bevorzuge die offizielle Stammbibliothek , um Tor zu kontrollieren.

Installation -

pip install stem

Sie können jetzt die Tor-IP erneuern, indem Sie die folgende Funktion aufrufen.

IP erneuern -

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)

Um zu überprüfen, ob Tor eine neue Exit-IP hat, führen Sie einfach den Code aus Teil 1 erneut aus. Aus einem mir unbekannten Grund müssen Sie ein neues sessionObjekt erstellen , um die neue IP zu verwenden.

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
shad0w_wa1k3r
quelle
Teil1 (um es zu testen) benötigen Sie pip install request[socks](wenn Sie einen Fehler erhalten pip uninstall requestund versuchen, erneut zu installieren)
JinSnow
@AshishNitinPatil Entschuldigung für die dumme Frage, aber in welcher Scrapy-Datei sollten wir diesen Code verwenden? (In settings.py, der spider.py oder einem anderen?)
JinSnow
1
@ JinSnow, das ist eher eine Scrapy-Frage als Tor. Weitere Hilfe finden Sie unter stackoverflow.com/questions/45009940/… .
Shad0w_wa1k3r
17

Sie können die torrequestBibliothek (schamloser Stecker) verwenden. Es ist auf PyPI verfügbar.

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
Erdi Aker
quelle
3
tr.reset_identity()ändert die IP-Adresse nicht. Vermisse ich etwas Muss ich die tor-Konfigurationsdatei ändern oder so?
Shivam Gaur
4
Ich weiß, dass dies eine alte Frage und Antwort ist, aber diese hat für mich funktioniert. Ich musste dies nur tun: mit TorRequest (proxy_port = 9050, ctrl_port = 9051, password = 'password') als tr:
alex
1
tr.reset_identity () funktioniert bei mir nicht. Sie können jedoch viele <code> TorRequest-Objekte (proxy_port = 9050, ctrl_port = 9051, password = 'password') <code> erstellen. Jedes neue Objekt hat eine neue IP / Sitzung.
Timur Nurlygayanov
hat bei mir unter Windows nicht funktioniert
OfirD
9

Sie können die Implementierung des Pure -Python-Tor-Protokolls Torpy ausprobieren . Keine Notwendigkeit für den ursprünglichen Tor-Client oder die Stammabhängigkeit.

$ pip3 install torpy[requests]
...

$ 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'}

Jedes Mal, wenn Sie eine neue Sitzung erhalten, erhalten Sie eine neue Identität (im Grunde erhalten Sie eine neue Schaltung mit einem neuen Ausgangsknoten). Weitere Beispiele finden Sie in der Readme-Datei https://github.com/torpyorg/torpy

James Brown
quelle
7

Requests unterstützt Proxys mit dem SOCKS-Protokoll ab 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)
Karimov Dmitriy
quelle
1
Sie setzen den Proxy niemals mit Anfragen. Und wenn ich den Proxy mit Anfragen 2.11 setze, erhalte ich einen VerbindungsfehlerFailed to establish a new connection
user193661
1
Ja, ich habe den Proxy- Parameter verpasst . Behoben, danke für den Hinweis. Und ich habe Anfragen auf 2.11 aktualisiert und dieses Skript überprüft - es funktioniert. Haben Sie mit dem Service begonnen? Wenn ich aufhöre, erhalte ich den gleichen Fehler.
Karimov Dmitriy
4

Diese Antwort vervollständigt die von Ashish Nitin Patil für Windows (Sie können diese Antwort jederzeit aktualisieren).

Teil 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

Das HashedControlPasswordobige ist das Passwort. Wenn Sie in der Konsole ein anderes Kennwort festlegen möchten, navigieren Sie zu \Tor Browser\Browser\TorBrowser\Torden folgenden Befehlen und geben Sie sie ein :) tor.exe --hash-password password_XYZ | more. Es gibt Ihnen so etwas wie HashedControlPassword 16:54C092A8...Dies ist Ihr Passwort. Jetzt können Sie es der Torrc-Datei ( Tor Browser\Browser\TorBrowser\Data\Tor\torrc) hinzufügen .

Sie müssen dann Tor neu starten:

tor --service remove
tor --service install -options ControlPort 9051

Um zu überprüfen, ob dies funktioniert, sehen netstat -anSie jetzt, dass Port 9051 geöffnet ist.

Beachten Sie, dass erstellt tor --service install -...wird Tor Win32 Service. Aus irgendeinem Grund müssen Sie den Dienst beenden, um den Browser zu verwenden (ausführen services.msc).

EDIT: Sie viele Informationen finden Sie hier (Über Portnummer & Proxy, Tor, Privoxy, Autoschalter User - Agent ...).

JinSnow
quelle
1
Weitere Informationen hier: github.com/WiliTest/…
J. Does
3

Dieser Code funktioniert gut. Mit Tor wird die IP-Adresse nach jeder Anforderung geändert.

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()
NGSuche
quelle
1
Das ist wirklich großartiger Code, aber ich bin verwirrt, was der nbrOfIpAddresses=3macht. Erhält es zunächst eine Liste fester IP-Adressen?
user321627
1

Das requestsin requesocksist super alt, es hat nicht response.json()und viele andere Sachen.

Ich möchte meinen Code sauber halten. Allerdings requestsverfügt derzeit nicht über socks5 noch unterstützt (für weitere Informationen, lesen Sie diesen Thread https://github.com/kennethreitz/requests/pull/478 )

Also habe ich Privoxyals http-Proxy verwendet, der Tor vorerst verbindet.

Installieren und konfigurieren Sie Privoxy auf einem 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

Installieren und konfigurieren Sie Privoxy unter 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

Jetzt kann ich Tor wie einen http-Proxy verwenden. Unten ist mein Python-Skript.

import requests

proxies = {
  'http': 'http://127.0.0.1:8118',
}

print requests.get('http://httpbin.org/ip', proxies=proxies).text
Tobias
quelle
auf osx, die letzte Zeile privoxy /usr/local/etc/privoxy/configgibt diesen Fehler zurück2016-08-06 23:47:01.761 00000048 Error: Wrong number of parameters for forward-socks5 in configuration file.
Shoham
Anfragen erlauben die Verwendung von Socken 5 Proxy. Funktioniert gut.
Jamescampbell
0

Eine gute Funktion, um Ihre IP zu erneuern. Windows Beispiel

def renew_tor_ip():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="aAjkaI19!!laksjd")
        controller.signal(Signal.NEWNYM)

Anwendungsbeispiel

import requests
import time
from stem import Signal
from stem.control import Controller


def get_current_ip():
    session = requests.session()

    # TO Request URL with SOCKS over TOR
    session.proxies = {}
    session.proxies['http']='socks5h://localhost:9150'
    session.proxies['https']='socks5h://localhost:9150'

    try:
        r = session.get('http://httpbin.org/ip')
    except Exception as e:
        print(str(e))
    else:
        return r.text

#16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15 to aAjkaI19!!laksjd
#cmd shell "C:\Users\Arthur\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe" --hash-password aAjkaI19!!laksjd | more
#Torcc config
#ControlPort 9051
#HashedControlPassword 16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15

def renew_tor_ip():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="aAjkaI19!!laksjd")
        controller.signal(Signal.NEWNYM)


for i in range(5):
    print(get_current_ip())
    renew_tor_ip()
    time.sleep(5)
Arthur Yakovlev
quelle