如何使用Python和Stem获取Tor ExitNode IP

如何使用Python和Stem获取Tor ExitNode IP,ip,tor,stem,Ip,Tor,Stem,如前所述,我正在尝试获取Tor使用的外部IP。使用myip.dns.com之类的东西时,速度非常慢。我尝试了上述链接中的建议(python+stem通过控制端口控制tor),但您得到的只是电路的IP,无法确定哪个IP是exitnode上的IP,有时实际IP甚至不在结果中 任何帮助都将不胜感激 此外,在底部,胺提出了一种更新Tor中身份的方法。有一条指令,controller.get\u newnym\u wait(),他用它来等待新连接准备就绪(控制器来自steam.Control中的控件),s

如前所述,我正在尝试获取Tor使用的外部IP。使用myip.dns.com之类的东西时,速度非常慢。我尝试了上述链接中的建议(python+stem通过控制端口控制tor),但您得到的只是电路的IP,无法确定哪个IP是exitnode上的IP,有时实际IP甚至不在结果中

任何帮助都将不胜感激


此外,在底部,胺提出了一种更新Tor中身份的方法。有一条指令,controller.get\u newnym\u wait(),他用它来等待新连接准备就绪(控制器来自steam.Control中的控件),steam中没有类似的东西吗(对不起,我检查了两次/三次,没有找到任何东西)这表明Tor正在更改其标识?

您可以使用此代码检查当前IP(将SOCKS\u端口值更改为您的):


如果你想穿袜子,你应该:

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']

您可以在不调用geoip站点的情况下获取出口节点ip

但是,这是在另一个stackexchange站点上-

正如@mirimir所发布的,他下面的代码实质上附加了一个流事件侦听器函数,然后使用该函数获取电路id、电路指纹,最后是出口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

我也有类似的问题。即使没有新电路的呼叫信号,对socks5代理端口的多次呼叫也会改变ip。所以,在调用真实url之前调用geoip站点是行不通的。@EDENDEKKER如果我正确理解了你的问题,你需要朝这个方向看@ELRUSSO你是对的。这是有道理的。你可能让很多人花了好几个小时去思考它为什么会不断变化。
#!/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