Python >> Tutoriel Python >  >> Python Tag >> Requests

Comment passer l'authentification proxy (nécessite une authentification digest) en utilisant le module de requêtes python

Pas besoin d'implémenter le vôtre ! dans la plupart des cas

Requests a intégré la prise en charge des proxys, pour l'authentification de base :

proxies = { 'https' : 'https://user:[email protected]:port' } 
r = requests.get('https://url', proxies=proxies) 

voir plus sur les docs

Ou au cas où vous auriez besoin d'une authentification digest HTTPDigestAuth peut aider.
Ou vous devrez peut-être essayer de l'étendre comme yutaka2487 l'a fait ci-dessous.

Remarque :vous devez utiliser l'adresse IP du serveur proxy et non son nom !


J'ai écrit la classe qui peut être utilisée dans l'authentification proxy (basée sur l'authentification digest).
J'ai emprunté presque tous les codes de 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

Utilisation :

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

J'ai écrit un module Python (disponible ici) qui permet de s'authentifier avec un proxy HTTP en utilisant le schéma digest. Cela fonctionne lors de la connexion à des sites Web HTTPS (via la correction de singe) et permet également de s'authentifier auprès du site Web. Cela devrait fonctionner avec le dernier requests bibliothèque pour Python 2 et 3.

L'exemple suivant récupère la page Web https://httpbin.org/ip via le proxy HTTP 1.2.3.4:8080 qui nécessite une authentification HTTP digest en utilisant le nom d'utilisateur user1 et mot de passe password1 :

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)

Si le site Web nécessite une sorte d'authentification HTTP, cela peut être spécifié à HTTPProxyDigestAuth constructeur de cette façon :

# 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)