Para um desafio Basic de um proxy HTTP, use ProxyBasicAuthHandler. Este exemplo HTTP comum mantém a rota e a conta num único 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)

Use o endpoint real e a conta fornecida pelo operador. O manipulador usa o gestor de palavras-passe para o desafio do proxy; faça corresponder o URI e o realm pretendidos do proxy. A autenticação Basic no destino usa outro manipulador.

Chamar o opener diretamente mantém esta configuração local. O URL do pedido continua a ser o site, não o intermediário. Esta rota HTTP em claro não cifra uma troca Basic.

Não deduza deste exemplo suporte a túneis HTTPS. Um 407 durante CONNECT ocorre na configuração, antes de uma resposta comum do destino; a integração escolhida tem de tratar a autenticação aí. Mudar o manipulador de início de sessão do site não repara esse desafio anterior.

Os URL de proxy com credenciais são outro formato que aparece em exemplos mais antigos. Se forem usados, codifique corretamente os delimitadores do URL e mantenha o URL resultante com segredo fora dos registos.

Artigos relacionados