27

少し前に Mechanize モジュールを使用していましたが、今度は Requests モジュールを使用してみます。
( HTTPS およびプロキシ認証が必要な場合、Python 機械化は機能しません)

インターネットにアクセスするとき、プロキシ サーバーを経由する必要があります。
プロキシ サーバーには認証が必要です。以下のコードを書きました。

import requests
from requests.auth import HTTPProxyAuth

proxies = {"http":"192.168.20.130:8080"}
auth = HTTPProxyAuth("username", "password")

r = requests.get("http://www.google.co.jp/", proxies=proxies, auth=auth)

上記のコードは、proxy-server が基本認証を必要とする場合にうまく機能します。
プロキシサーバーがダイジェスト認証を必要とする場合に何をしなければならないかを知りたいです。
HTTPProxyAuth はダイジェスト認証に有効ではないようです (r.status_code は 407 を返します)。

4

9 に答える 9

19

プロキシ認証(ダイジェスト認証ベース)で使えるクラスを書きました。
ほぼすべてのコードを requests.auth.HTTPDigestAuth から借用しました。

import requests
import requests.auth

class HTTPProxyDigestAuth(requests.auth.HTTPDigestAuth):
    def handle_407(self, r):
        """Takes the given response and tries digest-auth, if needed."""

        num_407_calls = r.request.hooks['response'].count(self.handle_407)

        s_auth = r.headers.get('Proxy-authenticate', '')

        if 'digest' in s_auth.lower() and num_407_calls < 2:

            self.chal = requests.auth.parse_dict_header(s_auth.replace('Digest ', ''))

            # Consume content and release the original connection
            # to allow our new request to reuse the same one.
            r.content
            r.raw.release_conn()

            r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url)
            r.request.send(anyway=True)
            _r = r.request.response
            _r.history.append(r)

            return _r

        return r

    def __call__(self, r):
        if self.last_nonce:
            r.headers['Proxy-Authorization'] = self.build_digest_header(r.method, r.url)
        r.register_hook('response', self.handle_407)
        return r

使用法:

proxies = {
    "http" :"192.168.20.130:8080",
    "https":"192.168.20.130:8080",
}
auth = HTTPProxyDigestAuth("username", "password")

# HTTP
r = requests.get("http://www.google.co.jp/", proxies=proxies, auth=auth)
r.status_code # 200 OK

# HTTPS
r = requests.get("https://www.google.co.jp/", proxies=proxies, auth=auth)
r.status_code # 200 OK
于 2012-11-22T21:54:36.710 に答える
7

ダイジェスト スキームを使用して HTTP プロキシで認証できるようにするPython モジュール (ここから入手可能) を作成しました。これは、HTTPS Web サイトに (モンキー パッチを介して) 接続するときに機能し、Web サイトでの認証も可能にします。requestsこれは、Python 2 と 3 の両方の最新のライブラリで動作するはずです。

次の例では、ユーザー名とパスワードを使用した HTTP ダイジェスト認証を必要とするHTTP プロキシ経由で Web ページhttps://httpbin.org/ipをフェッチします。1.2.3.4:8080user1password1

import requests
from requests_digest_proxy import HTTPProxyDigestAuth

s = requests.Session()
s.proxies = {
        'http': 'http://1.2.3.4:8080/',
        'https': 'http://1.2.3.4:8080/'
}
s.auth = HTTPProxyDigestAuth('user1', 'password1')

print(s.get('https://httpbin.org/ip').text)

Web サイトで何らかの HTTP 認証が必要な場合は、HTTPProxyDigestAuth次の方法でコンストラクターに指定できます。

# HTTP Basic authentication for website
s.auth = HTTPProxyDigestAuth(('user1', 'password1'),
        auth=requests.auth.HTTPBasicAuth('user1', 'password0'))
print(s.get('https://httpbin.org/basic-auth/user1/password0').text))

# HTTP Digest authentication for website
s.auth = HTTPProxyDigestAuth(('user1', 'password1'),,
        auth=requests.auth.HTTPDigestAuth('user1', 'password0'))
print(s.get('https://httpbin.org/digest-auth/auth/user1/password0').text)
于 2020-02-02T22:13:52.797 に答える
2

それでもここにたどり着く人のために、これに加えて他の一般的なリクエスト機能が組み込まれていない requests-toolbelt というプロジェクトがあるようです。

https://toolbelt.readthedocs.org/en/latest/authentication.html#httpproxydigestauth

于 2015-12-22T20:37:24.303 に答える
1

requests.auth.HTTPDigestAuthの代わりに使用することで、ダイジェスト認証を使用できます。requests.auth.HTTPProxyAuth

于 2012-11-22T16:29:44.553 に答える