【问题标题】:How to change Tor identity in Python?如何在 Python 中更改 Tor 身份?
【发布时间】:2012-04-10 20:44:43
【问题描述】:

我有以下脚本:

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2

print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

使用tor和SocksiPy

现在我想为每个请求更改 Tor 身份,例如:

for i in range(0, 10):
   #somehow change tor identity
   print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

我该怎么做?

【问题讨论】:

标签: python tor


【解决方案1】:

Tor 用 Python 编写了一个新的 TOR 控件库,stem。可以在PyPI 上找到它。他们提供了一些很好的教程如何使用它,one 其中解释了如何更改您的身份:

from stem import Signal
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
  controller.authenticate()
  controller.signal(Signal.NEWNYM)

确保你的配置是correct

【讨论】:

  • @AdrianB B 它给出错误“无法建立连接,因为目标机器主动拒绝它”
  • 我无法在 Windows 上使用这个(或其他任何东西)
  • 我知道这是一个旧帖子,但只是为了澄清一下:如果机器“拒绝”连接,你的端口不正确,或者你没有运行 Tor
【解决方案2】:

今天,我对这个问题进行了很多搜索,终于设法回答了自己。但在我需要说 pirvoxy 和 tor 应该正确配置之前。第一个脚本,然后是关于配置的一点点:

import urllib2
from TorCtl import TorCtl

proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support) 

def newId():
    conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
    conn.send_signal("NEWNYM")

for i in range(0, 10):
    print "case "+str(i+1)
    newId()
    proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
    urllib2.install_opener(opener)
    print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

以上脚本获取新 IP 并从 ifconfig.me 网站检查它。关于配置: 我们需要Privoxy。要将 TOR 与 HTTP 连接一起使用,privoxy 应该与 tor 一起使用。我们可以通过将 thi 添加到 /etc/privoxy/config 文件来做到这一点:

forward-socks5 / localhost:9050 . #dot is important at the end

然后我们在 /etc/tor/torrc 文件中配置 ControlPort。我们只需要取消注释这一行:

ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C

那我们就重启一下tor:

/etc/init.d/tor restart

【讨论】:

  • 感谢您的解决方案,但我有一个小问题:为什么我们需要 Privoxy?为什么我不能像你的问题那样使用 SocksiPy?
  • 我遇到了问题,我也在这里问过:stackoverflow.com/questions/9925381/…
  • @MikhailD 没有问题。对于未来的读者:直接使用 SOCKS(无需 Privoxy)。
  • 上面用的是什么类型的hash?
  • 抱歉打扰了。对于那些搜索哈希密码详细信息的人,您可以通过执行命令 tor --hash-password "<new_password>" 并从结果输出中记下新哈希来为不同于 'your_password' 的密码生成不同的哈希。
【解决方案3】:

另一个简单的解决方案,不需要外部库,适用于 IPv4 和 IPv6:

import socket

try:
    tor_c = socket.create_connection((TOR_CTRL_HOST, TOR_CTRL_PORT))
    tor_c.send('AUTHENTICATE "{}"\r\nSIGNAL NEWNYM\r\n'.format(TOR_CTRL_PWD))
    response = tor_c.recv(1024)
    if response != '250 OK\r\n250 OK\r\n':
        sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
except Exception, e:
    sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))

【讨论】:

  • socket 类确实有一个 connect() 方法可以接受一个元组,调用 socket.create_connection() 代替。我的代码看起来像 tor_ctrl = socket.create_connection(('127.0.0.1', '9151')) tor_ctrl.send('AUTHENTICATE "{}"\r\nSIGNAL NEWNYM\r\n'.format('tor_control_pass')) # 控制密码
  • 我已经尝试过了,但得到了这个错误:连接到 Tor 控制端口时出错:错误(61,'连接被拒绝')。有什么想法吗?
  • 我试过这个并得到以下错误——“来自 Tor 控制端口的意外响应:515 身份验证失败:密码与 HashedControlPassword 身份验证 cookie 不匹配。”。我按以下格式输入密码--“16:7FA1766AE1DC149A603309B1BF8EBBAAA3F44C237898EF82D19908BD9‌​2”
【解决方案4】:

This is a video 我使用 STEM、SockSipy、Tor 100% 工作 :)

#!/usr/bin/python
import socks
import socket
import time
from stem.control import Controller
from stem import Signal
import urllib2
import sys

def info():
    print "[*] Welcome to Chart-Cheat Script"
    print "[*] This script works with running TOR only"
    print "[*] usage is chartcheat.py domain"
    print "[*] argument domain must be in format www.example.com"
    print "[*] Example: chartcheat.py www.example.com"
    return

if len(sys.argv)==2:
    info();
    counter = 0
    url = str(sys.argv[1]);
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate()
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
        socket.socket = socks.socksocket
        #visiting url in infinite loop      
        while True:
            urllib2.urlopen("http://"+url)
            counter=counter+1
            print "Page " + url + " visited = " + str(counter)
            #wait till next identity will be available
            controller.signal(Signal.NEWNYM)
            time.sleep(controller.get_newnym_wait())            
else:
    info();

如果你运行的是python3,python3中的urllib包将与python2中的urllib2包相同。

【讨论】:

    【解决方案5】:

    您可以通过取消注释中的几行来启用tor控制服务器

    /etc/tor/torrc
    

    并使用stem库发送NEWNYM信号改变电路。

    controller.signal(Signal.NEWNYM)
    

    You can read tutorial here.

    【讨论】:

    • 定义few lines,教程链接失效。
    【解决方案6】:

    你可以这样写:

    def renew_connection():
        with Controller.from_port(port=9051) as controller:
            controller.authenticate(password='password')
            controller.signal(Signal.NEWNYM)
            controller.close()
    
    def request_tor(url, headers):
        renew_connection()
        session = requests.session()
        session.proxies = {}
        session.proxies['http'] = 'socks5h://localhost:9050'
        print((session.get(url)).text)
    
    

    【讨论】:

    • 您能否通过澄清为什么这会解决问题来帮助使这个答案更有用?
    • 每次发送新请求时,信号都会为您提供一个新 ip,每 4 秒后您可以添加一个 time.sleep(4) 为每个请求创建一个新 ip,您可以使用fake_useragent 库为您随机创建假代理。 @SimasJoneliunas
    【解决方案7】:

    以下方法可行:

    for i in range(0, 10):
       #somehow change tor identity
       socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050+i)
       socket.socket = socks.socksocket
    
       print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
    

    您基本上在建立每个连接之前设置了代理。我假设您对不同的 IP 有不同的代理,因为您没有说明您打算如何更改 IP

    【讨论】:

    • 我只是想用不同的IP使用tor发出请求,我的意思是在随机的时间间隔内,我需要使用changeTorIdentity()函数。我需要这个 changeTorIdentity() 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多