Selenium WebDriver + Tor в качестве прокси со Stem?

Мне нужно подтвердить, что если Stem можно использовать для запуска процесса Tor, который предоставляет 127.0.0.1:port, то используйте его в сценариях селена в качестве прокси (SOCKS).

Я использую Python 3.4.2, Stem 1.3.0 и Tor (экспертный пакет tor-win32-tor-0.2.5.10) в Windows.

Этот фрагмент кода работает со стандартным прокси-сервером SOCKS.

from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '127.0.0.1')
profile.set_preference('network.proxy.socks_port', 9000)

driver = webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get('http://www.reddit.com')

Но мне не удается заставить его работать с Tor в качестве моего прокси. Я попытался создать процесс Tor, и его создали. Но я не знаю, работает ли он правильно. Я не получаю ошибки в моем tor_error_log.txt

# File: stem_process.py
import stem.process
import stem

stem.process.launch_tor_with_config(
  config = {
    'SocksPort': '9000',
    'ControlPort': '9051',
    'ExitNodes': '{us}',
    'Log': [
      'NOTICE stdout',
      'ERR file c:\\tor-win32-tor-0.2.5.10\\Tor\\tor_error_log.txt',
    ],
  },
  tor_cmd = 'C:\\tor-win32-tor-0.2.5.10\\Tor\\tor.exe',
)

Затем я попробовал два способа создания соединения или аутентификации. Первый использует with а также stem.control.controller, И второй на более низком уровне с stem.socket а также stem.connection

Первый:

# File: stem_test1.py
from stem.control import Controller

with Controller.from_port(address='127.0.0.1', port=9051) as controller: #port = 9051
  controller.authenticate()

  print("Tor is running version %s" % controller.get_version())

'''
# Output:
Tor is running version 0.2.5.10 (git-13318a95ddfbbf8d)
'''

Второй:

# File: stem_test2.py
import sys
import stem
import stem.connection
import stem.socket

if __name__ == '__main__':
  try:
    control_socket = stem.socket.ControlPort(port = 9051)
    stem.connection.authenticate(control_socket)
  except stem.SocketError as exc:
    print('Unable to connect to tor on port 9051: %s' % exc)
    sys.exit(1)
  except stem.connection.AuthenticationFailure as exc:
    print('Unable to authenticate: %s' % exc)
    sys.exit(1)

  print("Issuing 'GETINFO version' query...\n")
  control_socket.send('GETINFO version')
  print(control_socket.recv())

'''
# Output:
Issuing 'GETINFO version' query...

version=0.2.5.10 (git-13318a95ddfbbf8d)
OK
'''

И оба работают без ошибок... Но когда я использую код для вызова экземпляра Firefox WebDriver с 127.0.0.1:9000 как прокси (тоже пробовал с 127.0.0.1:9051потому что я действительно не знаю разницу между socksPort а также controlPort) Это не работает.

1 ответ

Решение

Stem не может создать процесс tor, это всего лишь библиотека для подключения к существующему серверу tor для проверки / контроля через порт управления.

Чтобы создать сам процесс tor, вам нужно, чтобы ваша система запустила его с помощью upstart/launchctl/etc. Кроме того, вы можете просто набрать tor из командной строки, если он установлен, и он будет работать на переднем плане.

С этим, чтобы использовать stem вам нужно отредактировать ваш torrc в. включить ControlPort и б. установить метод аутентификации (cookieauth или хешированный пароль, сохраненный в вашем torrc). По умолчанию для SocksPort установлено значение 9050, а для ControlPort - 9051.

SocksPort - это тот, через который вы маршрутизируете свой трафик (то есть firefox), а ControlPort - это то, к чему вы подключаетесь. Имейте в виду, только если вам даже нужен Steam, поскольку кажется, что вы пытаетесь запустить экземпляр Tor с ним (и это невозможно), если вы запустите его на своей системе vanilla, он будет работать с Селен / Firefox, как вы его настроили (ну, по умолчанию порт 9050, а не 9000)

Другие вопросы по тегам