仅通过标准 python 套接字获取 Tor7.0 的新 ip

Get new ip of Tor7.0 by standard python socket only

当我尝试在 windows 10 上更新 Tor 的 ip 时,它总是失败(我已经阅读了很多堆栈溢出的帖子,比如 this and this,但没有任何效果)。

我的 torrc 的内容

# This file was generated by Tor; if you edit it, comments will not be preserved
# The old torrc file was renamed to torrc.orig.1 or similar, and Tor will ignore it

DataDirectory C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor
GeoIPFile C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\geoip
GeoIPv6File C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\geoip6
HiddenServiceStatistics 0

HashedControlPassword 16:D14CC89AD7848B8C60093105E8284A2D3AB2CF3C20D95FECA0848CFAD2
CookieAuthentication 1 #either with nor without this line, still fail

torrc-defaults 的内容

# torrc-defaults for Tor Browser
#
# DO NOT EDIT THIS FILE
#
# This file is distributed with Tor Browser and SHOULD NOT be modified (it
# may be overwritten during the next Tor Browser update). To customize your
# Tor configuration, shut down Tor Browser and edit the torrc file.
#
# If non-zero, try to write to disk less frequently than we would otherwise.
AvoidDiskWrites 1
# Where to send logging messages.  Format is minSeverity[-maxSeverity]
# (stderr|stdout|syslog|file FILENAME).
Log notice stdout
CookieAuthentication 1
## fteproxy configuration
ClientTransportPlugin fte exec TorBrowser\Tor\PluggableTransports\fteproxy --managed

## obfs4proxy configuration
ClientTransportPlugin obfs2,obfs3,obfs4,scramblesuit exec TorBrowser\Tor\PluggableTransports\obfs4proxy

## meek configuration
ClientTransportPlugin meek exec TorBrowser\Tor\PluggableTransports\terminateprocess-buffer TorBrowser\Tor\PluggableTransports\meek-client-torbrowser -- TorBrowser\Tor\PluggableTransports\meek-client

用于更新ip的脚本

import repr as reprlib
import socket
import sys

try:
   tor_c = socket.create_connection(("127.0.0.1", 9151))
   tor_c.send('AUTHENTICATE "{}"\r\n'.format("16:D14CC89AD7848B8C60093105E8284A2D3AB2CF3C20D95FECA0848CFAD2"))
   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)))

但是服务器总是回复我

来自 Tor 控制端口的意外响应:515 身份验证失败:密码与 HashedControlPassword 不匹配 身份验证 cookie。

我知道有 python 库可用于此类任务,但我只想通过 python 的标准套接字库更新 ip,我该如何正确执行此操作?谢谢

HashedControlPassword 是身份验证密码的哈希值。要进行身份验证,它将是 AUTHENTICATE "your actual password"

控制协议表面上比较简单

例如:

telnet localhost 9051
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
authenticate "password"
250 OK
signal NEWNYM
250 OK <-- identity changed for new circuits

这对我有用:

import repr as reprlib
import socket
import sys

try:
   tor_c = socket.create_connection(("127.0.0.1", 9051))
   tor_c.send("AUTHENTICATE \"{}\"\n".format("password"))
   response = tor_c.recv(1024)
   if response != '250 OK\r\n':
      sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
   tor_c.send("SIGNAL NEWNYM\n");
   response = tor_c.recv(1024)
   print(response)
except Exception, e:
   sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))

您也可以按照以下示例避免 Python:Request new identity from Windows command line