如何在Python中更改Tor身份?

use*_*286 23 python tor

我有以下脚本:

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())
Run Code Online (Sandbox Code Playgroud)

使用tor和SocksiPy

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

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

我怎样才能做到这一点?

Ora*_*Tux 29

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

from stem import Signal
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
  controller.authenticate()
  controller.signal(Signal.NEWNYM)
Run Code Online (Sandbox Code Playgroud)

确保您的配置正确无误.

  • @AdrianB B它给出错误"无法建立连接,因为目标机器主动拒绝它" (2认同)
  • 我不能让这个(或任何其他有茎的东西)在 Windows 上工作 (2认同)

use*_*286 20

今天,我已经搜索了很多关于这个问题,并最终设法回答了自己.但在我需要说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())
Run Code Online (Sandbox Code Playgroud)

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

forward-socks5 / localhost:9050 . #dot is important at the end
Run Code Online (Sandbox Code Playgroud)

然后我们在/ 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
Run Code Online (Sandbox Code Playgroud)

然后我们重启tor:

/etc/init.d/tor restart
Run Code Online (Sandbox Code Playgroud)


ned*_*dim 14

另一个简单的解决方案,无需外部库,适用于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)))
Run Code Online (Sandbox Code Playgroud)

  • 套接字类有一个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')) #control密码 (2认同)