it-swarm.com.de

Stellen Sie Anfragen mit Python über Tor

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 machen?

48
Sachin Kelkar

Hier ist der Code, den Sie verwenden möchten (laden Sie das Stammpaket mit pip install stem Herunter)

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 klappt das.

26
jamescampbell

Ihre Frage hat zwei Aspekte:

  1. Anfragen mit Tor stellen
  2. Erneuern der Verbindung gemäß Anforderung (in Ihrem Fall nach jeder Anforderung)

Teil 1

Die erste ist mit der neuesten (ab v2.10.0) requests Bibliothek mit der zusätzlichen Anforderung requests[socks] für einfach zu erstellen mit dem Socken Proxy.

Installation -

pip install requests requests[socks]

Grundsätzliche 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, d. H. Um eine neue sichtbare Ausgangs-IP zu haben, müssen Sie in der Lage sein, eine Verbindung zum Tor-Dienst über dessen ControlPort herzustellen und dann ein NEWNYM Signal zu senden.

Bei einer normalen Tor-Installation wird ControlPort standardmäßig nicht aktiviert. 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 HashedControlPassword für das Passwort "password" Steht. Wenn Sie ein anderes Kennwort festlegen möchten, ersetzen Sie das HashedControlPassword im Torrc, indem Sie die Ausgabe von tor --hash-password "<new_password>" Notieren, wobei <new_password> Das Kennwort ist, das Sie festlegen möchten.

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

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

Unter Windows gibt es ein Problem, 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 die folgenden Befehle ein, um das Problem zu beheben, nachdem Sie Ihre Torrc-Datei bearbeitet haben:

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 nun auf dem 9051 ControlPort laufen, über das wir Befehle an ihn senden können. Ich bevorzuge es, die offizielle Stammbibliothek zu verwenden, 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 session -Objekt erstellen, um die neue IP zu verwenden.

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
78
shad0w_wa1k3r

Sie können die Bibliothek torrequest (schamloser Plug) 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
15
Erdi Aker

Requests unterstützt Proxies Verwendung des SOCKS-Protokolls 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)
7
Karimov Dmitriy

Diese Antwort vervollständigt die von Ashish Nitin Patil für Windows (zögern Sie nicht, diese Antwort zu 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 HashedControlPassword ist das Passwort. Wenn Sie in der Konsole ein anderes Kennwort festlegen möchten, navigieren Sie zu \Tor Browser\Browser\TorBrowser\Tor Und geben Sie die folgenden Befehle ein: tor.exe --hash-password password_XYZ | more). Es wird Ihnen so etwas wie HashedControlPassword 16:54C092A8... Dies ist Ihr Passwort. Jetzt können Sie es der Torrc-Datei hinzufügen (Tor Browser\Browser\TorBrowser\Data\Tor\torrc).

Sie müssen dann Tor neu starten:

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

Um zu überprüfen, ob dies funktioniert, geben Sie netstat -an Ein. Nun sehen Sie, dass Port 9051 geöffnet ist.

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

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

3
JinSnow

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

Sie können versuchen, das Pure-Python-Tor-Protokoll zu implementieren Torpy . Kein Bedarf an originalem Tor-Client oder Stammabhängigkeit.

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

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

2
James Brown

Das requests in requesocks ist super alt, es hat kein response.json() und viele andere Sachen.

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

Also habe ich Privoxy als 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

Installiere und konfiguriere Privoxy auf 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 benutzen. Unten ist mein python script.

import requests

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

print requests.get('http://httpbin.org/ip', proxies=proxies).text
1
Tobias