[英]How to control tor, when use tor proxy
I'm trying to connect to a resource using a tor, changing identity. 我正在尝试使用Tor连接到资源,更改身份。 But after the first connection attempt to change identity causes an error.
但是在第一次连接后尝试更改身份会导致错误。 Code:
码:
import urllib2, socks, socket
from stem import Signal
from stem.control import Controller
def newI():
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
newI()
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'}
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()
newI()
I get error: 我得到错误:
File "/media/all/Run/e/c.py", line 21, in <module>
newI()
File "/media/all/Run/e/c.py", line 7, in newI
with Controller.from_port(port=9051) as controller:
File "/usr/local/lib/python2.7/dist-packages/stem/control.py", line 659, in from_port
control_port = stem.socket.ControlPort(address, port)
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 314, in __init__
self.connect()
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 187, in connect
self._socket = self._make_socket()
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 340, in _make_socket
control_socket.connect((self._control_addr, self._control_port))
File "/usr/lib/python2.7/dist-packages/socks.py", line 369, in connect
self.__negotiatesocks5(destpair[0],destpair[1])
File "/usr/lib/python2.7/dist-packages/socks.py", line 236, in __negotiatesocks5
raise Socks5Error(ord(resp[1]),_generalerrors[ord(resp[1])])
TypeError: __init__() takes exactly 2 arguments (3 given)
Maybe I need to disable the proxy. 也许我需要禁用代理。 Tell me how to do it correctly.
告诉我如何正确地做。
UPD: UPD:
With pycurl it's work: 使用pycurl可以工作:
import pycurl
import cStringIO
from stem import Signal
from stem.control import Controller
def newI():
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
newI()
buf = cStringIO.StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://google.com/')
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(pycurl.PROXY, 'localhost')
c.setopt(pycurl.PROXYPORT, 9050)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()
html = buf.getvalue()[7:]
buf.close()
newI()
The problem is caused by the socket.socket = socks.socksocket
line. 该问题是由
socket.socket = socks.socksocket
行引起的。
As a temporary solution, one can keep a backup copy of socket.socket
and use that to unset the proxy before asking Tor for a new identity, then set up the proxy again. 作为一种临时解决方案,可以保留
socket.socket
的备份副本,并使用该副本在请求Tor提供新身份之前取消设置代理,然后再次设置代理。
The code will look like this: 该代码将如下所示:
import urllib2, socks, socket
from stem import Signal
from stem.control import Controller
old_socket = socket.socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
def newI():
socket.socket = old_socket # don't use proxy
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
# set up the proxy again
socket.socket = socks.socksocket
newI()
headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'}
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()
newI()
However, I am still waiting for someone to post an explanation as to why the error occurs, and a better way to fix it. 但是,我仍在等待某人发布有关错误原因的解释,以及解决该问题的更好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.