【问题标题】:using tor as a SOCKS5 proxy with python urllib2 or mechanize使用 tor 作为带有 python urllib2 或 mechanize 的 SOCKS5 代理
【发布时间】:2013-01-05 04:14:35
【问题描述】:

我的目标是将python的机械化与tor SOCKS代理一起使用。

我没有使用带有以下 Ubuntu 版本的 GUI: 说明:Ubuntu 12.04.1 LTS 发布时间:12.04 代号:精确

根据 nmap 扫描,Tor 已安装并正在侦听端口 9050:

    Starting Nmap 5.21 ( http://nmap.org ) at 2013-01-22 00:50 UTC
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000011s latency).
    Not shown: 996 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    80/tcp   open  http
    3306/tcp open  mysql
    9050/tcp open  tor-socks

我也认为我是否可以远程登录到端口 9050 是合理的,我可以:

    telnet 127.0.0.1 9050
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    quit
    Connection closed by foreign host.

我对这篇文章中的建议寄予厚望,让 tor 与 urllib2 一起工作: How can I use a SOCKS 4/5 proxy with urllib2?

所以我在python中尝试了以下脚本:

    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://icanhazip.com').read()

脚本只是挂起,没有响应。

我认为由于 mechanize 似乎与 urllib2 有关,因此以下脚本可能会起作用:

    import socks
    import socket
    import mechanize
    from mechanize import Browser
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
    socket.socket = socks.socksocket
    br = Browser()
    print br.open('http://icanhazip.com').read()

我使用 urllib2 脚本得到与上面相同的结果。

我对 python 和网络非常陌生,所以我需要关于如何让 python urllib2 在非 GUI Ubuntu 服务器上使用 tor 作为 SOCKS 的第二个意见。

我运行了这个脚本并收到了预期的响应。我没有使用 tor 代理:

    In [1]: import urllib2

    In [2]: print urllib2.urlopen('http://icanhazip.com').read()
    xxxx:xxxx:xxxx:512:13b2:ccd5:ff04:c5f4

谢谢。

我发现了一些有用的东西!我不知道它为什么会起作用,但确实如此。我在这里找到了它: Python urllib over TOR?

    import socks
    import socket
    def create_connection(address, timeout=None, source_address=None):
        sock = socks.socksocket()
        sock.connect(address)
        return sock

    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)

    # patch the socket module
    socket.socket = socks.socksocket
    socket.create_connection = create_connection

    import urllib2

    print urllib2.urlopen('http://icanhazip.com').read()

    import mechanize
    from mechanize import Browser

    br = Browser()
    print br.open('http://icanhazip.com').read()

【问题讨论】:

  • 如果你解决了你的问题,你可以回答你自己的问题,这样其他人就不会进来尝试回答了!也就是说,我尝试了你所有的代码,它运行良好(即使你说的 sn-ps 也坏了)。也许您只是遇到网络问题?
  • 我的第二种方法有效。第一种方法仍然挂起。所以我只使用第二种方法。

标签: networking ubuntu urllib2 mechanize tor


【解决方案1】:

上述解决方案对我不起作用。我在 Ubuntu 14.04 上。每当我尝试运行上述脚本时,它都会抛出以下错误。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
  return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 404, in open
  response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 422, in _open
  '_open', req)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
  result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1214, in http_open
  return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1184, in do_open
  raise URLError(err)
urllib2.URLError: <urlopen error ((1, 'general SOCKS server failure'),)>

使用 nmap 命令检查 tor 是否正在运行。

Nmap scan report for localhost (127.0.0.1)
Host is up (0.00026s latency).
Not shown: 993 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
631/tcp  open  ipp
902/tcp  open  iss-realsecure
3306/tcp open  mysql
9050/tcp open  tor-socks

安装Vidalia 解决了这个问题。显然,socks 代理不允许连接通过它。希望这可以帮助面临同样问题的人。

【讨论】:

    【解决方案2】:

    见问题的结尾。

    import socks
    import socket
    def create_connection(address, timeout=None, source_address=None):
        sock = socks.socksocket()
        sock.connect(address)
        return sock
    
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
    
    # patch the socket module
    socket.socket = socks.socksocket
    socket.create_connection = create_connection
    
    import urllib2
    
    print urllib2.urlopen('http://icanhazip.com').read()
    
    import mechanize
    from mechanize import Browser
    
    br = Browser()
    print br.open('http://icanhazip.com').read()
    

    【讨论】:

    • 你为什么在答案中同时使用 urllib2 和 mechanize 来做同样的事情?
    • 我想测试一下机械化浏览器是否使用了 Tor。
    • “import socks”指的是什么模块?
    • sockipy 中包含 socks 模块:sourceforge.net/projects/socksipy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多