2012-11-22 14 views
10

Stavo usando il modulo Mechanize qualche tempo fa e ora provo a utilizzare il modulo Richieste.
(Python mechanize doesn't work when HTTPS and Proxy Authentication required)Come passare l'autenticazione proxy (richiede l'autorizzazione digest) utilizzando il modulo richieste python

Devo passare attraverso il server proxy quando accedo a Internet.
Il server proxy richiede l'autenticazione. Ho scritto i seguenti codici.

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) 

I codici sopra riportati funzionano bene quando il server proxy richiede l'autenticazione di base.
Ora voglio sapere cosa devo fare quando il server proxy richiede l'autenticazione digest.
HTTPProxyAuth sembra non essere efficace nell'autenticazione digest (r.status_code restituisce 407).

risposta

7

ho scritto la classe che può essere utilizzato in autenticazione proxy (sulla base digerire autenticazione).
Ho preso in prestito quasi tutti i codici da 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 

Usage:

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 
+2

Viene visualizzato l'errore: l'oggetto 'HTTPProxyDigestAuth' non ha attributo 'last_nonce'. Quando cerco di usare la tua classe. Lo esaminerò. – MattClimbs

+3

Non c'è bisogno di implementare il proprio adesso, 'requests' ora ha il supporto integrato per i proxy, ad es. 'proxies = {'https': 'https: // utente: password @ ip: porta'}; r = requests.get ('https: // url', proxies = proxies) 'vedi http://docs.python-requests.org/en/latest/user/advanced/ – BurnsBA

+0

@BurnsBA @MattClimbs @yutaka Posso conferma che l'uso delle richieste in Python 3 con https e 'user: password @ ip: port' funziona alla grande. – jamescampbell

0

È possibile utilizzare l'autenticazione digest utilizzando requests.auth.HTTPDigestAuth invece di requests.auth.HTTPProxyAuth

+0

Volevo passare l'autenticazione del proxy (basata sull'autent diger). Questo è diverso dal solito auth digest. Quindi ho dovuto estendere HTTPDigestAuth (vedi sotto). – yutaka

0
import requests 
import os 


# in my case I had to add my local domain 
proxies = { 
    'http': 'proxy.myagency.com:8080', 
    'https': '[email protected]:[email protected]:8080', 
} 


r=requests.get('https://api.github.com/events', proxies=proxies) 
print(r.text) 
1

Non c'è bisogno di implementare il proprio!

Ora richieste ha un supporto incorporato per i proxy:

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

vedere di più sul docs

Questa è la risposta da @BurnsBA che ha salvato la mia vita.

Nota: deve utilizzare l'IP del server proxy e non il suo nome!

Problemi correlati