【问题标题】:General SOCKS server failure when switching identity using stem使用 stem 切换身份时的一般 SOCKS 服务器故障
【发布时间】:2015-03-18 02:16:54
【问题描述】:

我在远程服务器 (Ubuntu) 上的 9150 端口上运行 Tor,控制端口在 9151 上。我已确认两者都通过 netstat -ant 运行。

这是引发SOCKS5Error: 0x01: General SOCKS server failure 错误的代码。

import socks
import socket
socks.set_default_proxy(socks.SOCKS5, server_ip, 9150)
socket.socket = socks.socksocket

我可以从任何库发出请求,并使用 Tor ip 地址成功获取响应。

但是以下是导致错误的原因:

from stem import Signal
from stem.control import Controller

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

如果我运行上述而不使用socks(第一个sn-p)设置代理,我可以毫无问题地发出信号。

【问题讨论】:

    标签: python proxy web-scraping tor socks


    【解决方案1】:

    连接到 Tor 后,您将无法打开新控制器。尝试在脚本顶部打开一个控制器。然后 Tor 连接和信号器都使用相同的控制器对象。

    这似乎适用于 Python3:

    import time
    
    import socket
    import socks
    
    import requests
    from bs4 import BeautifulSoup
    from stem import Signal
    from stem.control import Controller
    
    controller = Controller.from_port(port=9051)
    
    
    def connectTor():
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5 , "127.0.0.1", 9050, True)
        socket.socket = socks.socksocket
    
    
    def renew_tor():
        controller.authenticate(<INSERT YOUR PASSPHRASE HERE>)
        controller.signal(Signal.NEWNYM)
    
    
    def show_my_ip():
        url = "http://www.showmyip.gr/"
        r = requests.Session()
        page = r.get(url)
        soup = BeautifulSoup(page.content, "lxml")
        ip_address = soup.find("span",{"class":"ip_address"}).text.strip()
        print(ip_address)
    
    
    for i in range(10):
        renew_tor()
        connectTor()
        showmyip()
        time.sleep(10)
    

    【讨论】:

    • controller.authenticate() 将方法 renew_tor 放在 Controller.from_port() 下,以避免每次要更新连接时都进行身份验证。在创建与控制器的连接时验证一次就足够了。
    【解决方案2】:

    你的第一个 sn-p 是通过 tor 代理流量,但是 Stem 的 Controller.from_port() 方法也使用了 socket 模块。因此,Stem 尝试连接到您的本地控制端口,通过一个 Tor 出口节点进行代理,然后无法连接。

    【讨论】:

    【解决方案3】:

    我看到当您尝试打开与端口 9051 的新连接时发生此错误,而旧连接仍处于打开状态。我就是这样解决问题的。

    #----------------Cut Here----------------------
    
    import stem
    from stem import Signal
    from stem.control import Controller
    from stem.connection import connect
    import time
    #
    # Create a new controller 
    #
    controller = Controller.from_port()
    Password = "My_Personal_Password"
    #
    def renew_tor():
        global controller
        global Password
        print ('Renewing Tor Circuit')
        if "stem.control.Controller" not in str(controller):
          #if global controller exist no more
          controller = Controller.from_port()
        # debug output
        print (controller)
        # authenticare the connection with the server control port 
        controller.authenticate(Password)
        print ('Tor running version is : %s' % controller.get_version() )
        # force a new circuit
        controller.signal(Signal.NEWNYM)
        # wait for new circuit
        time.sleep(10)
        print ('New Tor circuit estabilished')
    
    if __name__ == "__main__":
        for i in range (10000):
          print ( " Attempt n. : %i " % i)  
          renew_tor()
    
    
    #----------------Cut Here(end)--------------------------------------------
    

    从您的个人密码中,您可以使用命令创建哈希

    tor --hash 密码 My_Personal_Password

    结果字符串的格式为

    16:CA850F5648.........

    这必须插入到文件/etc/tor/torrc中

    下:

    HashedControlPassword 16: CA850F5648 .........

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多