webdevqa.jp.net

ターミナルからSOCKS5を使用する場合のPythonのリクエスト「SOCKSサポートの依存関係がありません」

Pythonのリクエストに依存するパッケージを使用して、Python 2.7シェルからAPIと対話しようとしています。これは、リモートアドレスがネットワーク(大学ライブラリ)によってブロックされているということです。

APIに話すには、次のことを行います。

~$ ssh -D 8080 [email protected]

そして、新しいターミナルで、ローカルコンピューターで:

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

現在、問題はurllib3のSOCKSProxyManagerで発生しているようです。

SOCKS5でSOCKSProxyManagerを使用できるのは、 PySocks をインストールしている場合、またはpip install urllib3 [socks]を実行している場合

残念ながら、PySocksとurllib3の両方をSocksで試しましたが、成功しませんでした。

別の回避策のアイデアはありますか?

編集:

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

Condaで同じ問題が発生し、2.11をリクエストしました(企業プロキシの背後でUbuntu VMを使用しています)。

この問題 助けてくれました。 .bashrcファイルで、環境変数all_proxy(元々はSOCKプロキシsocks://....に設定されていました)をhttpsバージョンに変更しました。

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

そして今、それは動作します。

75
Guillaume Mohr

これは、リクエストがプロキシとしてソックスを使用しており、ソックスがインストールされていないことを意味します。

pip install pysocksを実行するだけです

53
louis_guitton

requests[socks]>=2.10.0をrequirements.txtに追加し、https_proxy env変数を更新しましたが、上記のエラーに遭遇しました。 pip install requests[socks] env変数をリセットし、PySocksをインストールした後、通常のhttps_proxyを試しました。 pip install -Ur requirements.txtが初めてPySocksをインストールできなかった理由はわかりません。

その後、ソックスプロキシを使用してpythonでリクエストを行うことができました。

ソックスサーバーが動作していないようです。あなたまたはあなたの管理者がログを見て、マシンが不満を持っているものを見ることができるかどうかを確認します。

11
Kirk

Ubuntuでは次を実行できます:
unset all_proxy && unset ALL_PROXY

9
GraveAccent

また、簡単なpip install -U pipを実行しているときにこの問題に出くわしましたが、あなたの質問から見つけた情報が問題の解決に役立ちました。 Mac OS Xを使用しています。

ご指摘のとおり、requestsパッケージの 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の「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.

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)に到達するためにエスケープする必要があります。

6
easoncxz

数分前に同じエラーが発生しました。その後、pip経由でrequest [socks]を再インストールしました。 win-inet_ptonである靴下の欠落部分があったようです。 Pipはそれをインストールし、問題は解決しました。

2
phosphorus

all_proxy環境変数の設定を解除するだけで、これは機能するはずです。また、githubでこれを参照できます issue .

Ubuntuでは、次のコマンドunset all_proxyを使用してターミナルを再起動できます

1
latsha

私の環境はUbuntu 16.4 LTSとPython3.5.2で、pip3を使用してlibをインストールすると同じ問題が発生します。そこで、この問題を解決するためにコマンドunset ALL_PROXYを使用します。

PS:printenv | grep -i proxyを使用してプロキシ情報を表示します。

1
Kiah Han