可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have Tor running on a remote server (Ubuntu) on port 9150 with the control port on 9151. I've confirmed both are running via netstat -ant.
Here is my code which is eliciting the SOCKS5Error: 0x01: General SOCKS server failure
error.
import socks import socket socks.set_default_proxy(socks.SOCKS5, server_ip, 9150) socket.socket = socks.socksocket
I can make requests from any library and successfully get responses back with a tor ip address.
However the following is what causes the error:
from stem import Signal from stem.control import Controller with Controller.from_port(port = 9151) as controller: controller.authenticate(password) controller.signal(Signal.NEWNYM)
If I run the above without setting up the proxy using socks (first snippet), I can issue signals with no trouble.
回答1:
Here I come to save the daaaaaaaay!
Damian is right - you can't open a new controller once you've connected to tor. However . . . try opening a controller right at the top of your script. Then both the tor connection and signaller use the same Controller object - or something like that.
Anyway this seems to work for me with 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() controller.signal(Signal.NEWNYM) def showmyip(): 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)
Bob's your Uncle.
回答2:
Your first snippet is proxying traffic over tor, but Stem's Controller.from_port() method uses the socket module too. As such Stem attempts to connect to your local control port, gets proxied through a tor exit node, then can't connect.
回答3:
I saw this error happens when you try to open a new connection to port 9051, while an old connection is still open. I solved the problem in this way.
#----------------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)--------------------------------------------
From your personal password you can create a hash with the command
tor --hash password My_Personal_Password
and the resulting string has the format
16:CA850F5648.........
This must be inserted in the file /etc/tor/torrc
under:
HashedControlPassword 16: CA850F5648 .........