El proxy de la oficina pide una cuenta. El sitio web que hay detrás pide otra. Requests tiene entradas separadas para esos dos inicios de sesión Basic: las credenciales en la URL del proxy y el argumento auth de la petición.

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

Las cuatro variables de cuenta provienen de la configuración de credenciales de la aplicación. Codificar por separado el usuario y la contraseña del proxy conserva caracteres como la arroba sin convertirlos en delimitadores de URL.

La clave https del diccionario selecciona esta ruta para un destino HTTPS. Su valor sigue empezando por http:// porque ese es el protocolo que se usa para llegar a este proxy de ejemplo.

En esa petición HTTPS, el inicio de sesión del proxy pertenece al intercambio CONNECT. El inicio de sesión del sitio pertenece a la petición posterior a través del túnel establecido. Dejar que el adaptador deduzca la autorización del proxy desde su propia URL la mantiene en el salto correspondiente; para este caso Basic no hace falta una clase de autenticación combinada.

Un 407 identifica el desafío del intermediario. Un 401 del sitio identifica el desafío del destino. Usa esa respuesta para decidir cuál de las dos cuentas configuradas necesita atención.

Artículos relacionados