Python urllib: базовая аутентификация прокси для HTTP-запросов
Постройте явный opener urllib для запроса Basic от HTTP-прокси и отличите этот обычный обмен HTTP от аутентификации HTTPS CONNECT.
Для запроса Basic от HTTP-прокси используйте ProxyBasicAuthHandler. Этот обычный пример HTTP хранит маршрут и учётную запись в одном opener:
import os
from urllib.request import (
ProxyHandler, ProxyBasicAuthHandler,
HTTPPasswordMgrWithDefaultRealm, build_opener,
)
proxy_url = 'http://proxy.example:8080'
passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(
None, proxy_url,
os.environ['PROXY_USER'], os.environ['PROXY_PASSWORD'],
)
opener = build_opener(
ProxyHandler({'http': proxy_url}),
ProxyBasicAuthHandler(passwords),
)
with opener.open('http://example.com/', timeout=10) as response:
print(response.status)Используйте реальную конечную точку и учётную запись, выданную оператором. Обработчик использует менеджер паролей для запроса прокси; сопоставьте нужные URI и realm прокси. Базовая аутентификация на стороне назначения использует другой обработчик.
Прямой вызов opener сохраняет эту настройку локальной. URL запроса остаётся сайтом, а не посредником. Этот открытый маршрут HTTP не шифрует обмен Basic.
Не делайте из этого примера вывода о поддержке туннеля HTTPS. 407 во время CONNECT возникает на этапе настройки, до обычного ответа назначения; выбранная интеграция должна обрабатывать аутентификацию там. Замена обработчика входа на сайте не исправит тот более ранний запрос.
URL прокси с учётными данными — другой формат, встречающийся в старых примерах. Если вы его используете, корректно кодируйте разделители URL и держите получившийся URL с секретом вне журналов.