Запросы Python "отсутствуют зависимости для поддержки SOCKS" при использовании SOCKS5 из терминала

Я пытаюсь взаимодействовать с API из моей оболочки Python 2.7, используя пакет, который полагается на запросы Python. Дело в том, что удаленный адрес заблокирован моей сетью (университетской библиотекой).

так сказать к 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.

этот отрывок из adapters.py запросы модуль:

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

теперь проблема, похоже, возникла в SOCKSProxyManager urllib3.

поэтому я прочитал, что вы можете использовать SOCKSProxyManager с SOCKS5, если у вас есть install PySocks или pip установить urllib3[носки]

увы, я попробовал оба PySocks и urllib3 с носками без успеха.

любая идея другого обходного пути?

EDIT:

я тоже пробовал pip install requests[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',))

8 ответов


у меня была такая же проблема с conda и запросами 2.11 (я работаю в виртуальной машине Ubuntu за корпоративным прокси).

этот вопрос помог мне. Я изменил переменную окружения all_proxy (который изначально был установлен на прокси-сервер SOCK socks://....) к версии https в my .файл bashrc :

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

и теперь он работает.


это означает, что запросы используют socks в качестве прокси-сервера и что socks не установлен.

просто запустить pip install pysocks


добавил requests[socks]>=2.10.0 к моим требованиям.txt, обновил мой https_proxy переменная env, и наткнулся на вышеуказанную ошибку. Затем я попробовал обычный pip install requests[socks] после сброса https_proxy переменной env и . Я не уверен, почему pip install -Ur requirements.txt не удалось установить PySocks в первый раз.

после этого я смог сделать запрос в python, используя прокси-сервер socks.

похоже, что ваш сервер Socks не работает. Я бы посмотрел, можете ли вы или ваш администратор посмотрите журналы и посмотрите, на что жалуется машина.


в Ubuntu вы можете запустить:
unset all_proxy && unset ALL_PROXY


просто снимите свой all_proxy переменные среды, и это должно работать. Также вы можете обратиться к этому вопрос в github.

на Ubuntu, вы можете использовать следующую команду unset all_proxy и перезапустить терминал


Я также наткнулся на эту проблему, делая простой pip install -U pip, но информация, которую я нашел из вашего вопроса, помогла мне решить мою проблему. Я на Mac OS X.

как вы указали,adapters.py из requests пакет пытался сделать это:

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

поэтому кажется разумным искать место определения SOCKSProxyManager. Кажется, что он находится в модуле "contrib" в urllib3 и не установлен рядом с 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.

инструкции pip docs говорит Это О 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 и другие оболочки часто рассматривают его как особый характер, который должен быть экранирован, чтобы он достиг вызванной программы (в этом случае pip).


Я получил ту же ошибку несколько минут назад.Затем переустановите запрос[носки] через pip. Кажется, что отсутствовала часть носков, которая win-inet_pton. Типун установил его и проблема решена.


моя среда-Ubuntu 16.4 LTS и Python3.5.2 Я использую pip3 для установки libs, получил ту же проблему. поэтому я использую команду unset ALL_PROXY чтобы решить эту проблему, и она работает.

PS: использовать printenv | grep -i proxy показать прокси-инфо.