web-dev-qa-db-fra.com

Requêtes de Python "Dépendances manquantes pour le support SOCKS" lors de l'utilisation de SOCKS5 à partir de Terminal

J'essaie d'interagir avec une API de mon shell Python 2.7) à l'aide d'un package qui s'appuie sur les requêtes de Python. L'adresse distante est bloquée par mon réseau (bibliothèque universitaire).

Donc pour parler à l'API je fais ce qui suit:

~$ ssh -D 8080 [email protected]

Et puis, dans le nouveau terminal, dans l'ordinateur local:

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

Ensuite, je lance le programme dans la console Python mais échoue:

~$ 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.

Cet extrait provient du module adapters.py de demandes :

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

Maintenant, le problème semble provenir de SOCKSProxyManager de urllib3.

J'ai donc lu que vous pouvez utiliser SOCKSProxyManager avec SOCKS5 si vous avez installé PySocks ou si vous faites un pip installer urllib3 [chaussettes]

Hélas, j'ai essayé les PySocks et urllib3 avec Socks sans aucun succès.

Une idée d'une autre solution de contournement?

EDIT:

J'ai aussi essayé demandes d'installation de pip [chaussettes] (c'est-à-dire les demandes 2.10.0 avec le support de chaussettes) et j'obtiens ceci:

  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',))
31

J'ai eu le même problème avec conda et demandes 2.11 (je travaille dans un Ubuntu VM derrière un proxy d'entreprise).

Ce numéro m'a aidé. J'ai changé ma variable d'environnement all_proxy _ (défini à l'origine sur un proxy SOCK socks://....) vers la version https dans mon fichier .bashrc:

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

et maintenant ça marche.

75
Guillaume Mohr

Cela signifie que les demandes utilisent des chaussettes en tant que proxy et qu'elles ne sont pas installées.

Il suffit de courir pip install pysocks

53
louis_guitton

J'ai ajouté le requests[socks]>=2.10.0 À mon exigences.txt, mis à jour ma variable env. https_proxy Et suis tombé sur l'erreur ci-dessus. J'ai ensuite essayé un pip install requests[socks] Normal après avoir réinitialisé la variable env https_proxy Et PySocks a été installé. Je ne sais pas pourquoi le pip install -Ur requirements.txt N'a pas réussi à installer PySocks pour la première fois.

Après cela, j'ai pu faire une demande dans python en utilisant le proxy socks.

Il semble que votre serveur de chaussettes ne se comporte pas. Je voudrais voir si vous, ou votre administrateur, pouvez regarder les journaux et voir de quoi la machine se plaint.

11
Kirk

Dans Ubuntu, vous pouvez exécuter:
unset all_proxy && unset ALL_PROXY

9
GraveAccent

Je suis aussi tombé sur cette question en faisant un simple pip install -U pip, mais les informations que j'ai trouvées dans votre question m'ont aidé à résoudre mon problème. Je suis sous Mac OS X.

Comme vous l'avez fait remarquer, adapters.py du paquet requests essayait de faire ceci:

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

Il semble donc judicieux de chercher le lieu de définition de SOCKSProxyManager . Il semble être dans un module "contrib" dans urllib3 et non installé à côté de urllib3 par défaut. La docstring de ce module dit:

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.

Les instructions de pip docs disent ceci à propos des extras de 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

Alors j'ai suivi les instructions et fait:

$ pip install 'urllib3[socks]'

J'ai ensuite continué avec pip install -U pip, qui était ce que je devais faire, et maintenant ça marche.

Je me demande combien de personnes ont été trompées par les crochets, Bash et d’autres obus le considérant souvent comme un caractère spécial, qu’il faut échapper pour qu’il atteigne le programme appelé (dans ce cas, pip).

6
easoncxz

J'ai eu la même erreur il y a quelques minutes. Puis réinstallé demande [chaussettes] via pip. Il semble qu'il manque une partie des chaussettes qui est win-inet_pton. Pip l'a installé et le problème est résolu.

2
phosphorus

Vient de désinstaller votre all_proxy variable d’environnement, et cela devrait fonctionner. Vous pouvez aussi vous référer à cela numéro dans github.

Sur Ubuntu, vous pouvez utiliser la commande suivante unset all_proxy et redémarrer le terminal

1
latsha

Mon environnement est Ubuntu 16.4 LTS et Python3.5.2 J'utilise pip3 pour installer des bibliothèques qui ont le même problème. donc j'utilise la commande unset ALL_PROXY pour résoudre ce problème et cela fonctionne.

PS: utilisez printenv | grep -i proxy pour afficher les informations sur le proxy.

1
Kiah Han