Python 在终端使用 SOCKS5时请求“丢失 SOCKS 支持的依赖项”

我尝试使用一个依赖于 Python 请求的包与 Python 2.7 shell 中的 API 进行交互。问题是远程地址被我的网络(大学图书馆)屏蔽了。

因此,对于 API,我做了以下工作:

~$ ssh -D 8080 name@myserver.com

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

~$ export http_proxy=socks5://127.0.0.1:8080 https_proxy=socks5://127.0.0.1:8080

然后我在 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.

以下节选自 Py 请求模块:

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

现在问题似乎来源于 urllib3的 SOCKSProxyManager。

所以我读到你可以使用 SOCKSProxyManager 和 SOCKS5,如果你已经安装了 派索克斯或者你做了一个 Pip install urllib3[袜子]

唉,我用 Socks 尝试了 PySocks 和 urllib3,但都没有成功。

还有别的办法吗?

编辑:

我还尝试了 安装要求[袜子](这是使用 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',))
133680 次浏览

我将 requests[socks]>=2.10.0添加到我的 requments.txt 中,更新了我的 https_proxy env 变量,然后遇到了上面的错误。然后,在重新设置了 https_proxy env 变量并安装了 PySocks之后,我尝试了常规的 pip install requests[socks]。我不知道为什么 pip install -Ur requirements.txt第一次没有安装 PySocks。

在那之后,我可以使用袜子代理在 python 中发出一个请求。

看起来你的袜子服务器运行不正常。我想看看你或者你的管理员能不能看看日志看看机器在抱怨什么。

只要取消你的 all_proxy环境变量就可以了,你也可以在 github 中参考这个 问题

在 Ubuntu 上,您可以使用以下命令 unset all_proxy并重新启动终端

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

正如你所指出的,requests软件包中的 适配器.py试图做到这一点:

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

因此,寻找 SOCKSProxyManager 的定义位置似乎是明智的。它似乎位于 urllib3中的“ Contrib”模块中,默认情况下没有与 urllib3一起安装。该模块的 docstring 说:

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.

匹普医生的说明书中提到了 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

所以我照着说明做了:

$ pip install 'urllib3[socks]'

然后我继续使用 pip install -U pip,这是我应该做的,现在它起作用了。

我想知道有多少人被方括号欺骗了,因为 Bash 和其他 shell 通常将其视为一个特殊字符,需要对其进行转义才能到达被调用的程序(在本例中是 pip)。

这意味着请求使用袜子作为代理,而没有安装袜子。

快跑 pip install pysocks

几分钟前我也出现了同样的错误,然后通过 pip 重新安装了 要求[袜子]。 似乎有一个缺失的部分,袜子是 (英语)。皮普安装了它,问题就解决了。

我的环境是 Ubuntu 16.4 LTS 和 Python 3.5.2 我用 pip3安装库时也遇到了同样的问题。所以我使用命令 unset ALL_PROXY来解决这个问题,它是有效的。

使用 printenv | grep -i proxy显示代理信息。

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

在 Ubuntu 中,我执行以下命令:

# Unset socks proxy
unset all_proxy
unset ALL_PROXY
# Install missing dependencies:
pip install pysocks
# Reset proxy
source ~/.bashrc

我使用了以上所有的方法,但只有这个对我有效:

set | grep -i all_proxy

它回来了:

ALL_PROXY=socks://127.0.0.1:1080/
all_proxy=socks://127.0.0.1:1080/

然后,我做了这个:

export all_proxy=""

最后,它没有再次出现错误。

在 debian 10中,Python 3:

pip3 install pysocks

我在使用 Anaconda Python 3.7时遇到了同样的问题,即 Missing dependencies for SOCKS support.错误

由于 conda命令工作正常,我使用 conda install pysocks命令安装了 pysocks

这解决了问题。

您必须使用 python requests库添加袜子支持:

pip install requests[socks]

在报告问题之后得到了相同的错误,即 pysocks不会被 requests[socks]>=0.23.0需求拖动。

我可以(深奥地)修复它,删除 requests>=0.23.0的要求,我也有在同一个 requirements.txt

在 Debian 上运行 Python3.7,而报告错误的用户在 Ubuntu 上运行 Python3.6。

在补丁之前

$ cat requirements.txt
requests>=2.23.0
requests[socks]>=2.23.0
$ python3 -m venv venv
$ . venv/bin/activate
(venv) $ pip --no-cache-dir install -r requirements.txt
Collecting requests>=2.23.0 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl (61kB)
100% |████████████████████████████████| 71kB 202kB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl (127kB)
100% |████████████████████████████████| 133kB 617kB/s
Collecting idna<3,>=2.5 (from requests>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl (58kB)
100% |████████████████████████████████| 61kB 2.8MB/s
Collecting chardet<4,>=3.0.2 (from requests>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |████████████████████████████████| 143kB 10.4MB/s
Collecting certifi>=2017.4.17 (from requests>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl (156kB)
100% |████████████████████████████████| 163kB 4.7MB/s
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2020.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.10

补丁之后

现在应用以下补丁:

diff --git a/sauron/requirements.txt b/sauron/requirements.txt
index a0c901b..f38d18f 100644
--- a/sauron/requirements.txt
+++ b/sauron/requirements.txt
@@ -1,2 +1 @@
-requests>=2.23.0
requests[socks]>=2.23.0
$ cat requirements.txt
requests[socks]>=2.23.0
$ cat requirements.txt
requests[socks]>=2.23.0
(venv) $ pip --no-cache-dir install -r requirements.txt
Collecting requests[socks]>=2.23.0 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl (61kB)
100% |████████████████████████████████| 71kB 234kB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests[socks]>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl (127kB)
100% |████████████████████████████████| 133kB 678kB/s
Collecting chardet<4,>=3.0.2 (from requests[socks]>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |████████████████████████████████| 143kB 2.3MB/s
Collecting idna<3,>=2.5 (from requests[socks]>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl (58kB)
100% |████████████████████████████████| 61kB 6.2MB/s
Collecting certifi>=2017.4.17 (from requests[socks]>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl (156kB)
100% |████████████████████████████████| 163kB 4.8MB/s
Collecting PySocks!=1.5.7,>=1.5.6; extra == "socks" (from requests[socks]>=2.23.0->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl
Installing collected packages: urllib3, chardet, idna, certifi, PySocks, requests
Successfully installed PySocks-1.7.1 certifi-2020.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.10

袜子被有效地拉开了。

我的解决方案是: 取消终端代理之后,安装运行良好。

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

吸毒

apt-get update && apt-get install  python-socks

而不是

pip install pysocks