考虑以下脚本tortest.py
,它反复切换 TOR 电路并检查 IP 地址是否已更改:
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import json
import time
# pip install requests[socks]
import requests
# pip install stem
from stem import Signal
from stem.control import Controller
http = requests.session()
proxies = {'http': 'socks5://127.0.0.1:9050', 'https': 'socks5://127.0.0.1:9050'}
def get_new_ip():
with Controller.from_port(port=9051) as controller:
controller.authenticate(password="xxx")
controller.signal(Signal.NEWNYM)
time.sleep(controller.get_newnym_wait())
for _ in xrange(5):
get_new_ip()
try:
ip1 = json.loads(requests.get("https://httpbin.org/ip", timeout=(5, 5), proxies=proxies).content)["origin"]
ip2 = json.loads(http.get("https://httpbin.org/ip", timeout=(5, 5), proxies=proxies).content)["origin"]
print "Without session: {}".format(ip1)
print "With session: {}".format(ip2)
print
except Exception as e:
pass
运行此脚本,我得到以下输出:
$ python2 tortest.py
Without session: 137.74.169.241
With session: 137.74.169.241
Without session: 145.249.104.203
With session: 137.74.169.241
Without session: 5.189.170.221
With session: 137.74.169.241
Without session: 192.36.27.6
With session: 137.74.169.241
Without session: 199.249.224.43
With session: 137.74.169.241
正如我们所看到的,在无会话情况下,IP 地址每次都会改变。但是,在我们使用会话对象的情况下,IP 地址仅在第一个请求时发生变化,所有后续请求都显示相同的 IP 地址,表明电路没有变化。
为什么会发生这种情况以及如何解决?如何使用request
会话而不失去切换电路的能力?