【问题标题】:How to get the Tor ExitNode IP with Python and Stem如何使用 Python 和 Stem 获取 Tor 出口节点 IP
【发布时间】:2015-09-08 03:18:19
【问题描述】:

我正在尝试获取 Tor 使用的外部 IP,如 here 所述。当使用 myip.dnsomatic.com 之类的东西时,这非常慢。我尝试了上述链接中的建议(python + stem 通过控制端口控制 tor),但你得到的只是电路的 IP,不能保证哪个是出口节点上的 IP,有时真正的 IP 不是甚至在结果中。

任何帮助将不胜感激。

此外,在底部的here 中,Amine 提出了一种更新 Tor 身份的方法。有一个指令,controller.get_newnym_wait(),他用它来等待新的连接准备好(控制器来自steam.control中的Control),Steam中没有类似的东西吗(抱歉,我检查了两次/三次检查,但什么也没找到)告诉你 Tor 正在改变它的身份?

【问题讨论】:

    标签: ip tor stem


    【解决方案1】:

    无需调用geoip站点即可获取出口节点ip。

    然而,这在另一个 stackexchange 网站上 - https://tor.stackexchange.com/questions/3253/how-do-i-trap-circuit-id-none-errors-in-the-stem-script-exit-used-py

    正如@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
    

    【讨论】:

      【解决方案2】:

      您可以使用此代码检查当前 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()
      

      【讨论】:

      • 我也有类似的问题。即使没有为新电路调用 Signal - 多次调用 socks5 代理端口也会更改 ip。所以在调用你的真实网址之前调用 geoip 站点是行不通的。
      • @EDENDEKKER 如果我正确理解了您的问题,您需要朝这个方向看trac.torproject.org/projects/tor/ticket/4807
      • @ELRUSSO 你是对的。那讲得通。您可能节省了很多人想知道为什么它不断变化的时间。
      【解决方案3】:

      如果你想穿袜子,你应该这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        相关资源
        最近更新 更多