Робіть запити за допомогою Python через Tor


78

Я хочу зробити кілька запитів GET, використовуючи Tor на веб-сторінку. Я хочу використовувати інший ipaddress для кожного запиту.

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

Використовуючи це, я зробив один запит. Як я можу змінити ipaddress, щоб зробити інший?


Хіба це не те, що повинен робити tor, тобто затушувати або іншим чином ускладнювати визначення IP-адреси відправника?
mhawke

2
Використовуйте стебло stem.torproject.org
Каннінгем,

@mhawke це робить, але як тільки рукостискання підключення здійснюється, воно залишається стійким у тому наборі стрибків ip-адрес, через які він підключається, отже, чому оператор захоче знову змінити ip-адресу.
jamescampbell

Відповіді:


35

Ось код, який ви хочете використовувати (завантажте основний пакет за допомогою 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")

Удачі і, сподіваємось, це працює.


Я спробував це рішення, але отримав таку помилку: помилка (61, 'Підключення відхилено'). Здається, порт 9051 не відкритий на моїй машині, я на Mac і намагаюся зробити все, що можу, щоб відкрити цей порт, але все одно отримую цю помилку. Будь-які ідеї?
kflaw

1
@kflaw вам потрібно прокоментувати свій порт управління в torrc, а потім перезапустити tor. За замовчуванням порт управління 9051 вимкнено, оскільки він не потрібен для регулярного використання тор.
jamescampbell

дякую за відповідь, я забув згадати, що я прокоментував порт управління в torrc, а також автентифікацію за допомогою хеш-пароля. Чого мені не вистачає?
kflaw

@kflaw Чи можете ви опублікувати посилання на свій код у codepen або щось подібне, щоб я міг повторити вашу помилку? Дякую
jamescampbell

ось посилання на суть - я спробував кілька фрагментів коду, які знайшов у подібних дописах, але всі застрягають при спробі встановити порт управління. gist.github.com/kflaw/1a41654993e9692914a7fa18f8819a8f
kflaw

109

У вашому питанні є 2 аспекти -

  1. Надсилання запитів за допомогою Tor
  2. Поновлення з'єднання відповідно до вимоги (у вашому випадку після кожного запиту)

Частина 1

Перший з них легко зробити за допомогою останньої (до версії v2.10.0) requestsбібліотеки з додатковою вимогою requests[socks]щодо використання проксі-сервера socks.

Встановлення -

pip install requests requests[socks]

Основне використання -

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)

Частина 2

Щоб поновити IP-адресу Tor, тобто мати свіжий видимий вихідний IP-адресу, потрібно мати можливість підключитися до служби Tor через неї, ControlPortа потім надіслати NEWNYMсигнал.

Звичайна установка Tor не вмикає значення ControlPortза замовчуванням. Вам доведеться відредагувати файл torrc і розкоментувати відповідні рядки.

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вище вказано пароль "password". Якщо ви хочете встановити інший пароль, замініть HashedControlPasswordв torrc, зазначивши вихід, tor --hash-password "<new_password>"звідки <new_password>знаходиться пароль, який ви хочете встановити.

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

Попередження для користувачів Windows: див. Пост тут .

У Windows виникає проблема, коли налаштування для порту керування у файлі torrc ігнорується, якщо tor було встановлено за допомогою такої команди:

tor --service install

Щоб вирішити проблему, після редагування файлу torrc введіть такі команди:

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

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

Гаразд, отже, тепер, коли Tor налаштовано належним чином, вам доведеться перезапустити Tor, якщо він уже запущений.

sudo service tor restart

Tor тепер повинен працювати та працювати на 9051, ControlPortчерез який ми можемо надсилати йому команди. Я вважаю за краще використовувати офіційну стовбурну бібліотеку для управління Tor.

Встановлення -

pip install stem

Тепер ви можете відновити Tor IP, викликавши наступну функцію.

Поновити 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)

Щоб перевірити, що Tor має новий вихідний IP, просто повторіть код із Частини 1. З якоїсь невідомої мені причини вам потрібно створити новий sessionоб’єкт, щоб використовувати новий IP.

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

part1 (для тестування) вам знадобиться pip install request[socks](якщо ви отримаєте помилку pip uninstall requestта спробуєте встановити знову)
JinSnow

@AshishNitinPatil вибачте за німе запитання, але в якому файлі скрапіювання ми повинні використовувати цей код? (У settings.py, spider.py чи іншому?)
JinSnow

1
@JinSnow, це більше питання скрапінгу, ніж Tor, див. Stackoverflow.com/questions/45009940/… для отримання додаткової допомоги.
shad0w_wa1k3r

17

Ви можете використовувати torrequestбібліотеку (безсоромна вилка). Він доступний на 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

3
tr.reset_identity()не змінює IP-адресу. Мені чогось не вистачає? Чи потрібно змінювати файл конфігурації tor чи щось інше?
Шивам Гаур,

4
Я знаю, що це старе запитання та відповідь, але це спрацювало для мене. Мені просто потрібно було зробити це: за допомогою TorRequest (proxy_port = 9050, ctrl_port = 9051, password = 'password') як tr:
alex

1
tr.reset_identity () у мене не працює. Але в будь-якому випадку ви можете створити багато <code> TorRequest (proxy_port = 9050, ctrl_port = 9051, password = 'password') <code> об'єктів, кожен новий об'єкт матиме новий IP / сеанс.
Тимур Нурлыгаянов,

10

Ви можете спробувати реалізацію протоколу tor-python torpy . Не потрібен оригінальний клієнт Tor або залежність від стовбура взагалі.

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

Отже, кожного разу, коли ви отримуєте новий сеанс, ви отримуєте нову ідентифікацію (в основному ви отримуєте нову схему з новим вузлом виходу). Дивіться більше прикладів у файлі readme https://github.com/torpyorg/torpy


7

Запити підтримують проксі-сервери, що використовують протокол SOCKS версії 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)

1
Ви ніколи не встановлюєте проксі-сервіс із запитами. І коли я встановлюю проксі з запитами 2.11, я отримую помилку підключенняFailed to establish a new connection
user193661

1
Так, я пропустив параметр проксі . Виправлено, дякую за повідомлення. І я оновив запити до 2.11 і перевірив цей сценарій - він працює. Ви розпочали сервісне обслуговування? Якщо я зупиняю тор, я отримую ту ж помилку.
Карімов Дмитро

4

Ця відповідь доповнена відповіддю Ashish Nitin Patil для Windows (сміливо оновлюйте цю відповідь)

Частина 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наведено пароль. Якщо ви хочете встановити інший пароль у консолі, перейдіть \Tor Browser\Browser\TorBrowser\Torі введіть наступні команди:) tor.exe --hash-password password_XYZ | more. Це дасть вам щось на зразок HashedControlPassword 16:54C092A8...Це ваш пароль. Тепер ви можете додати його до файлу torrc ( Tor Browser\Browser\TorBrowser\Data\Tor\torrc).

Потім вам потрібно буде перезапустити Tor:

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

Щоб перевірити, чи працює це тип, netstat -anви побачите, що порт 9051 відкритий.

Зверніть увагу, що tor --service install -...це створить Tor Win32 Service. З якоїсь причини, здається, вам потрібно зупинити службу, щоб використовувати браузер (запустити services.msc)

EDIT: ви знайдете багато частин інформації тут (про номер порту і проксі, Tor, Privoxy, автоматичний вимикач агента користувача ...).


1
більше інформації тут: github.com/WiliTest/…
Дж. Чи

3

Цей код працює нормально. Використовуючи Tor, він змінює IP-адресу після кожного запиту.

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
Це справді чудовий код, але мене бентежить те, що nbrOfIpAddresses=3робиться. Це отримання списку фіксованих ip-адрес для початку?
user321627

1

requestsУ requesocksсупер старий, він не має response.json()і багато інших речей.

Я хотів би підтримувати свій код в чистоті. Однак requestsнаразі ще не підтримується socks5 (докладніше прочитайте цю тему https://github.com/kennethreitz/requests/pull/478 )

Тому я використовував Privoxyяк http-проксі, який наразі підключає Tor.

Встановіть та налаштуйте Privoxy на 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

Встановіть та налаштуйте Privoxy на 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

Тепер я можу використовувати Tor як проксі-сервер http. Нижче мій сценарій python.

import requests

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

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

на osx, останній рядок privoxy /usr/local/etc/privoxy/configповертає цю помилку2016-08-06 23:47:01.761 00000048 Error: Wrong number of parameters for forward-socks5 in configuration file.
Шохам

Запити дозволяють використовувати шкарпетки 5 проксі. Працює нормально.
jamescampbell

1

Хороша функція для оновлення вашого IP. Приклад Windows

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

Приклад використання

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.