Python Requests: logins Basic separados para proxy e site
Passe o login Basic do proxy pela URL do proxy e o do site de destino pelo argumento auth do Requests.
O proxy do escritório pede uma conta. O site por trás dele pede outra. O Requests tem entradas separadas para esses dois logins Basic: as credenciais na URL do proxy e o argumento auth da requisição.
from urllib.parse import quote
import requests
proxy_url = (
f"http://{quote(proxy_user, safe='')}:"
f"{quote(proxy_password, safe='')}@proxy.example:8080"
)
response = requests.get(
"https://reports.example/private/",
proxies={"https": proxy_url},
auth=(site_user, site_password),
timeout=(5, 20),
)
response.raise_for_status()
As quatro variáveis de conta vêm da configuração de credenciais da aplicação. Codificar o usuário e a senha do proxy separadamente preserva caracteres como a arroba sem transformá-los em delimitadores de URL.
A chave https do dicionário seleciona esta rota para um destino HTTPS. Seu valor ainda começa com http:// porque esse é o protocolo usado para chegar a este proxy de exemplo.
Nessa requisição HTTPS, o login do proxy pertence à troca CONNECT. O login do site pertence à requisição posterior pelo túnel estabelecido. Deixar o adaptador derivar a autorização do proxy da própria URL a mantém no salto correspondente; para este caso Basic não é necessária uma classe de autenticação combinada.
Um 407 identifica o desafio do intermediário. Um 401 do site identifica o desafio do destino. Use essa resposta para decidir qual das duas contas configuradas precisa de atenção.