当使用来自终端的SOCKS5时,Python的请求"缺少对SOCKS支持的依赖性"

Bri*_*e64 33 socks urllib3 python-2.7 python-requests

我正在尝试使用依赖于Python请求的包与我的Python 2.7 shell中的API进行交互.事情是我的网络(大学图书馆)阻止了远程地址.

所以说到API,我会做以下事情:

~$ ssh -D 8080 name@myserver.com
Run Code Online (Sandbox Code Playgroud)

然后,在新的终端,在本地计算机:

~$ export http_proxy=socks5://127.0.0.1:8080 https_proxy=socks5://127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)

然后我在Python控制台中运行该程序但失败了:

~$ python
>>> import myscript
>>> id = '1213'
>>> token = 'jd87jd9'
>>> connect(id,token)

File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 518, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 370, in send
    conn = self.get_connection(request.url, proxies)
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 273, in get_connection
    proxy_manager = self.proxy_manager_for(proxy)
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 169, in proxy_manager_for
    **proxy_kwargs
  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 43, in SOCKSProxyManager
    raise InvalidSchema("Missing dependencies for SOCKS support.")
requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support.
Run Code Online (Sandbox Code Playgroud)

这段摘录来自adapters.py请求模块:

> try:
>     from .packages.urllib3.contrib.socks import SOCKSProxyManager except ImportError:
>     def SOCKSProxyManager(*args, **kwargs):
>         raise InvalidSchema("Missing dependencies for SOCKS support.")
Run Code Online (Sandbox Code Playgroud)

现在问题似乎起源于urllib3的SOCKSProxyManager.

所以我读到你可以使用SOCKSProxyManager和SOCKS5,如果你已经安装了PySocks,或者你做了一个pip install urllib3 [socks]

唉,我用Socks尝试了PySocks和urllib3,没有任何成功.

任何另一种解决方法的想法?

编辑:

我也尝试了pip install requests [socks](这是带有Socks支持的请求2.10.0),我得到了这个:

  File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 467, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: SOCKSHTTPSConnectionPool(host='api-server.com', port=443): Max retries exceeded with url: /auth (Caused by NewConnectionError('<requests.packages.urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x95c7ccc>: Failed to establish a new connection: SOCKS5 proxy server sent invalid data',))
Run Code Online (Sandbox Code Playgroud)

小智 76

我遇到了与conda相同的问题并请求2.11(我在公司代理后面的Ubuntu VM中工作).

这个问题对我有帮助.我将环境变量all_proxy(最初设置为SOCK代理socks://....)更改为.bashrc文件中的https版本:

export all_proxy="https://<proxy>:<port>/"

现在它的工作原理.

  • 要么这个,要么`pip install pysocks` (7认同)
  • 给菜鸟的提示:`echo $ all_proxy`以查看您的机器当前设置为什么。它可能是`socks:// &lt;proxy&gt;:&lt;port&gt; /`,因此您所要做的就是替换前缀。 (2认同)

lou*_*ton 60

这意味着请求使用socks作为代理并且未安装socks.

赶紧跑 pip install pysocks

  • 这对我有用,但是,我们需要先关闭代理才能安装此模块。 (3认同)
  • 你可以先使用 tarball 安装 pysocks (3认同)
  • 这就是问题所在,如果“pip install”不通过代理,我该如何安装“pysocks” (2认同)
  • 哇,我第二次遇到这个问题,谷歌搜索,找到你的答案,这是我总是忘记的解决方案:)如果只有 stackoverflow 允许多次投票,我会投票一千次:) (2认同)

小智 12

在Ubuntu中,您可以运行:
unset all_proxy && unset ALL_PROXY


Kir*_*irk 11

我添加了requests[socks]>=2.10.0我的requirements.txt,更新了我的https_proxyenv变量,并遇到了上述错误.然后pip install requests[socks]在重置https_proxyenv变量后我尝试了常规并PySocks安装了.我不确定为什么pip install -Ur requirements.txt第一次无法安装PySocks.

之后,我能够使用socks代理在python中发出请求.

看起来你的socks服务器没有表现.我会看看你或你的管理员是否可以观看日志,看看机器在抱怨什么.


小智 10

使用 apt-get 代替 pip 怎么样?
当我使用 apt-get 时,我可以忽略代理设置,因此以下内容对我很有用。

使用

apt-get update && apt-get install  python-socks
Run Code Online (Sandbox Code Playgroud)

代替

pip install pysocks
Run Code Online (Sandbox Code Playgroud)


小智 7

在 debian 10、Python 3 中:

pip3 install pysocks
Run Code Online (Sandbox Code Playgroud)


eas*_*cxz 6

我在做一个简单的过程中偶然发现了这个问题pip install -U pip,但是我从你的问题中找到的信息帮助我解决了我的问题.我在Mac OS X上.

正如你所指出的那样,adapters.pyrequests包中试图做到这一点:

try:
    from .packages.urllib3.contrib.socks import SOCKSProxyManager
except ImportError:
    def SOCKSProxyManager(*args, **kwargs):
        raise InvalidSchema("Missing dependencies for SOCKS support.")
Run Code Online (Sandbox Code Playgroud)

因此,寻找SOCKSProxyManager的定义位置似乎是明智.它似乎在urllib3中的"contrib"模块中,默认情况下不与urllib3一起安装.该模块的文档字符串说:

This module contains provisional support for SOCKS proxies from within
urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and
SOCKS5. To enable its functionality, either install PySocks or install this
module with the ``socks`` extra.
Run Code Online (Sandbox Code Playgroud)

pip文档的说明说明了关于setuptools附加内容:

6. Install a package with setuptools extras.

$ pip install SomePackage[PDF]
$ pip install git+https://git.repo/some_pkg.git#egg=SomePackage[PDF]
$ pip install SomePackage[PDF]==3.0
$ pip install -e .[PDF]==3.0  # editable project in current directory
Run Code Online (Sandbox Code Playgroud)

所以我按照说明做了:

$ pip install 'urllib3[socks]'
Run Code Online (Sandbox Code Playgroud)

然后我继续pip install -U pip,这是我应该做的,现在它的工作原理.

我想知道有多少人被方括号搞砸了,因为Bash和其他shell经常将它视为一个特殊字符,需要将其转义才能到达被调用的程序(在本例中为pip).


pho*_*rus 5

几分钟前我遇到了同样的错误。然后通过 pip重新安装了request[socks]。似乎袜子缺少了win-inet_pton 的一部分。pip 安装好了,问题解决了。

  • `pip install request[socks]` 不起作用,但 `pip install -U requests[socks]` 起作用 (4认同)