Как получить IP-адрес Tor ExitNode с помощью Python и Stem

Я пытаюсь получить внешний IP-адрес, который использует Tor, как уже упоминалось здесь. При использовании чего-то вроде myip.dnsomatic.com это очень медленно. Я попробовал то, что было предложено в вышеупомянутой ссылке (python + стебель для управления tor через порт управления), но все, что вы получаете, это IP-адреса схемы без уверенности в том, какой из них находится на выходном узле, а иногда реальный IP-адрес не даже среди результатов.

Любая помощь будет оценена по достоинству.

Кроме того, из здесь внизу Амин предлагает способ обновить личность в Tor. Есть инструкция controller.get_newnym_wait(), которую он использует, чтобы дождаться готовности нового соединения (контроллер из Control в steam.control), разве в Steam нет ничего подобного? (извините, я проверял и дважды/тройно проверял и ничего не нашел), который говорит вам, что Tor меняет свою личность?


person AlbertoG    schedule 08.09.2015    source источник


Ответы (3)


Вы можете получить ip выходного узла, не вызывая сайт geoip.

Однако это находится на другом сайте stackexchange здесь - https://tor.stackexchange.com/questions/3253/how-do-i-trap-circuit-id-none-errors-in-the-stem-script-exit-used-py

Как сообщил @mirimir, его код ниже, по сути, подключает функцию прослушивания событий потока, которая затем используется для получения идентификатора канала, отпечатка канала и, наконец, IP-адреса выхода -

#!/usr/bin/python

import functools
import time
from stem import StreamStatus
from stem.control import EventType, Controller

def main():
  print "Tracking requests for tor exits. Press 'enter' to end."
  print

  with Controller.from_port() as controller:
    controller.authenticate()

    stream_listener = functools.partial(stream_event, controller)
    controller.add_event_listener(stream_listener, EventType.STREAM)

    raw_input()  # wait for user to press enter

def stream_event(controller, event):
  if event.status == StreamStatus.SUCCEEDED and event.circ_id:
    circ = controller.get_circuit(event.circ_id)
    exit_fingerprint = circ.path[-1][0]
    exit_relay = controller.get_network_status(exit_fingerprint)
    t = time.localtime()

    print "datetime|%d-%02d-%02d %02d:%02d:%02d % (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
    print "website|%s" % (event.target)
    print "exitip|%s" % (exit_relay.address)
    print "exitport|%i" % (exit_relay.or_port)
    print "fingerprint|%s" % exit_relay.fingerprint
    print "nickname|%s" % exit_relay.nickname
    print "locale|%s" % controller.get_info("ip-to-country/%s" % exit_relay.address, 'unknown')
    print
person Community    schedule 12.10.2017

Вы можете использовать этот код для проверки текущего IP (измените значение SOCKS_PORT на свое):

import re

import stem.process
import requesocks

SOCKS_PORT = 9053

tor_process = stem.process.launch_tor()
proxy_address = 'socks5://127.0.0.1:{}'.format(SOCKS_PORT)
proxies = {
            'http': proxy_address,
            'https': proxy_address
        }
response = requesocks.get("http://httpbin.org/ip", proxies=proxies)
print re.findall(r'[\d.-]+', response.text)[0]
tor_process.kill()
person El Ruso    schedule 19.09.2015
comment
У меня похожая проблема. Даже без вызова Signal для нового канала - Многократные вызовы прокси-порта socks5 изменят ip. Таким образом, вызов сайта geoip перед вызовом вашего реального URL-адреса не сработает. - person ; 12.10.2017
comment
@EDENDEKKER Если я правильно понял вашу проблему, вам нужно смотреть в этом направлении trac.torproject. org/projects/tor/ticket/4807 - person El Ruso; 12.10.2017
comment
@ELRUSSO Вы правы. Это имеет смысл. Вы, вероятно, сэкономили много часов людям, задаваясь вопросом, почему он продолжает меняться. - person ; 12.10.2017

Если вы хотите использовать носки, вы должны сделать:

pip install requests[socks]

Затем вы можете сделать:

import requests
import json
import stem.process
import stem


SOCKS_PORT = "9999"

tor = stem.process.launch_tor_with_config(
    config={
        'SocksPort': SOCKS_PORT,
    },
    tor_cmd= 'absolute_path/to/tor.exe',
)

r = requests.Session()

proxies = {
    'http': 'socks5://localhost:' + SOCKS_PORT,
    'https': 'socks5://localhost:' + SOCKS_PORT
}

response = r.get("http://httpbin.org/ip", proxies=proxies)
self.current_ip = response.json()['origin']
person Jeflopo    schedule 21.11.2016