Una contraseña con @ o # puede romper una URL de proxy construida a mano aunque las credenciales sean correctas. Esos caracteres ya tienen significado en una URL, de modo que el cliente puede interpretar parte de la contraseña como nombre de host o fragmento.

Codifica los dos campos de credenciales por separado

Este ejemplo mantiene los separadores estructurales de la URL y codifica solo el usuario y la contraseña:

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"
)

Usa tu punto de acceso y credenciales reales. La dirección mostrada es un ejemplo de documentación. El argumento safe vacío importa: quote normalmente deja la barra sin escapar, pero dentro de este campo de credenciales debe codificarse.

No codifiques toda la URL del proxy. Codificar los separadores del esquema y el @ entre las credenciales y el host destruye la estructura que intentabas conservar. Evita también codificar por segunda vez una contraseña ya codificada.

Usa el resultado con Requests

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

Si la solicitud sigue fallando, comprueba si el proxy rechaza el inicio de sesión o si el cliente falló antes al analizar la URL o conectarse. Un desafío de autenticación 407 y una URL no válida son fallos diferentes.

HTTPX puede mantener la autenticación separada

Un objeto Proxy de HTTPX puede recibir el punto de acceso y las credenciales 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()

Así evitas construir la parte userinfo por tu cuenta. No cifra las credenciales de forma independiente de la conexión al proxy ni elige un método de autenticación compatible con todos los servicios.

Si una lista gratuita solo proporciona IP y puerto, este ejemplo no es una fuente de credenciales predeterminadas. Usa autenticación solo cuando el operador realmente proporcione una cuenta. Mantén las URL con credenciales fuera de los registros compartidos y los archivos fuente.

Artículos relacionados