Caracteres especiais em senhas de proxy
Codifique separadamente o usuário e a senha do proxy para que @, dois-pontos, barras e # não quebrem a URL.
Uma senha com @ ou # pode quebrar uma URL de proxy montada à mão mesmo quando as credenciais estão corretas. Esses caracteres já têm significado em uma URL; por isso, o cliente pode interpretar parte da senha como nome do host ou fragmento.
Codifique os dois campos de credenciais separadamente
Este exemplo mantém os separadores estruturais da URL e codifica apenas o usuário e a senha:
from urllib.parse import quote
username = "user@team"
password = "p:a/ss#?"
proxy_url = (
"http://"
+ quote(username, safe="")
+ ":"
+ quote(password, safe="")
+ "@203.0.113.10:8080"
)
Use seu endpoint e suas credenciais reais. O endereço mostrado é um exemplo de documentação. O argumento safe vazio importa: quote normalmente deixa a barra sem escape, mas uma barra dentro desse campo de credenciais precisa ser codificada.
Não codifique a URL inteira do proxy. Codificar os separadores do esquema e o @ entre as credenciais e o host destrói a estrutura que você tentava preservar. Evite também codificar pela segunda vez uma senha já codificada.
Use o resultado com Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Se a requisição ainda falhar, confira se o proxy está recusando o login ou se o cliente falhou antes, ao analisar ou conectar. Um desafio de autenticação 407 e uma URL inválida são falhas diferentes.
O HTTPX pode manter a autenticação separada
Um objeto Proxy do HTTPX pode receber o endpoint e as credenciais como argumentos separados:
import httpx
proxy = httpx.Proxy(
"http://203.0.113.10:8080",
auth=("user@team", "p:a/ss#?"),
)
with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
response = client.get("https://example.com/")
response.raise_for_status()
Isso evita que você construa a parte userinfo manualmente. Não criptografa as credenciais de forma independente da conexão ao proxy nem escolhe um método de autenticação aceito por todos os serviços.
Se uma lista grátis fornece apenas IP e porta, este exemplo não fornece credenciais padrão. Use autenticação somente quando o operador realmente fornecer uma conta. Mantenha URLs com credenciais fora de logs compartilhados e arquivos-fonte.