Как пройти прокси-аутентификацию (требуется digest auth) с помощью модуля запросов python
некоторое время назад я использовал модуль Mechanize, а теперь пытаюсь использовать модуль запросов.
(Python mechanize не работает, когда требуется аутентификация HTTPS и прокси)
Я должен пройти через прокси-сервер, когда я получить доступ в интернет.
Прокси-сервер требует аутентификации. Я написал следующие коды.
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)
вышеуказанные коды работают хорошо, когда прокси-сервер требует базовой аутентификации.
Теперь я хочу знать, что мне делать. Когда прокси-сервер требует дайджест-аутентификации.
HTTPProxyAuth кажется неэффективным в дайджест-аутентификации (r.status_code возвращает 407).
5 ответов
Я написал класс, который можно использовать в аутентификации прокси (на основе digest 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
нет необходимости реализовывать свои собственные!
теперь запросы встроены в поддержку прокси:
proxies = { 'https' : 'https://user:password@proxyip:port' }
r = requests.get('https://url', proxies=proxies)
подробнее на docs
Это ответ от @BurnsBA, который спас мне жизнь.
Примечание: необходимо использовать ip прокси-сервера не его имя!
для тех из вас, кто все еще оказывается здесь, кажется, есть проект под названием requests-toolbelt, который имеет это плюс другие общие, но не встроенные функции запросов.
https://toolbelt.readthedocs.org/en/latest/authentication.html#httpproxydigestauth
Вы можете использовать дайджест-проверки подлинности с помощью requests.auth.HTTPDigestAuth
вместо requests.auth.HTTPProxyAuth
import requests
import os
# in my case I had to add my local domain
proxies = {
'http': 'proxy.myagency.com:8080',
'https': 'user@localdomain:password@proxy.myagency.com:8080',
}
r=requests.get('https://api.github.com/events', proxies=proxies)
print(r.text)