1

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

任何帮助,将不胜感激。

此外,从这里,在底部,Amine 提出了一种在 Tor 中更新身份的方法。有一条指令,controller.get_newnym_wait(),他用它来等待新连接准备好(控制器来自 steam.control 中的 Control),Steam 中没有类似的东西吗(抱歉,我检查并加倍/triple 检查并找不到任何东西)告诉你 Tor 正在改变它的身份?

4

3 回答 3

2

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

然而,这是在不同的 stackexchange 网站上 - https://tor.stackexchange.com/questions/3253/how-do-i-trap-circuit-id-none-errors-in-the-stem-script-exit-用过的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
于 2017-10-12T11:49:00.327 回答
0

您可以使用此代码检查当前 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()
于 2015-09-19T09:32:59.570 回答
0

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

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']
于 2016-11-21T11:11:03.867 回答