Respuesta rápida
¿Qué significa 407 Proxy Authentication Required con un proxy?
407 Proxy Authentication Required significa que el proxy rechazó tu solicitud porque no recibió credenciales o recibió unas incorrectas. El sitio web destino nunca fue contactado. Con los proxies residenciales de CrawlRelay, revisa tres cosas: que el nombre de usuario sea el mostrado en tu panel, que la contraseña coincida y que cualquier carácter especial en cualquiera de los dos esté codificado en URL. Reintentar la misma solicitud nunca soluciona un 407.
407 Proxy Authentication Required en pocas palabras
| Error | 407 Proxy Authentication Required |
|---|---|
| Tipo | Código de estado HTTP (4xx, error del cliente) |
| Enviado por | La puerta de enlace proxy, nunca el sitio web destino |
| Definido en | RFC 9110, section 15.5.8 (headers: Proxy-Authenticate 11.7.1, Proxy-Authorization 11.7.2) |
| ¿Reintentar? | No. Las mismas credenciales vuelven a fallar; arréglalas primero |
| Primera comprobación | Ejecuta la prueba curl a continuación con solo el nombre de usuario y sin parámetros de destino |
¿Qué significa 407 Proxy Authentication Required?
Un 407 viene del proxy, no del sitio al que quieres acceder. El RFC 9110 lo describe como la versión proxy del 401: el cliente debe autenticarse con el proxy antes de que suceda cualquier otra cosa. El proxy envía un encabezado Proxy-Authenticate que indica el esquema que acepta, casi siempre Basic. Tu cliente responde con un encabezado Proxy-Authorization que lleva username:password codificado en Base64.
Para un destino HTTPS, el 407 llega en respuesta a la solicitud CONNECT que abre el túnel. Por eso muchas librerías lo reportan como un error de túnel o conexión y no como un estado HTTP: la sesión TLS con el sitio web nunca comenzó.
¿Cómo se ve a 407 en Python, curl, Node.js y navegadores?
El mismo fallo se muestra de forma diferente en cada herramienta. Estos son los mensajes que debes buscar en tus registros:
- Python requests:
ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required')) - curl:
curl: (56) CONNECT tunnel failed, response 407 - Scrapy:
TunnelError: Could not open CONNECT tunnel with proxy ... [{'status': 407, 'reason': b'Proxy Authentication Required'}] - Chrome, Playwright, Puppeteer:
net::ERR_TUNNEL_CONNECTION_FAILED, o un pop-up de login en un navegador visible - Clientes Node.js sobre un destino http://:
Request failed with status code 407
¿Qué causa a 407?
Lo más probable al principio:
- Nombre de usuario o contraseña incorrectos. Un error tipográfico, una contraseña antigua tras un restablecimiento, o credenciales de otro subusuario.
- Caracteres especiales sin codificar. Una contraseña que contiene
@,:,/o#rompe la URLuser:pass@host. Codifícala en porcentaje:@se convierte en%40,:en%3A. - Un sufijo de targeting roto. Las puertas de enlace que leen el targeting desde el nombre de usuario ven un nombre de usuario largo. Un error tipográfico en una clave o código de país lo convierte en un nombre que el proxy no reconoce.
- Credenciales que nunca salen de tu código. Chrome ignora un usuario y contraseña escritos dentro de
--proxy-server. Puppeteer necesitapage.authenticate(), y Selenium un reenviador local. - Saldo vacío. Comprueba que tu cuenta aún tiene tráfico antes de depurar el código.
¿Cómo diagnostico a 407 paso a paso?
- Prueba las credenciales con curl sin ningún targeting (comando más abajo). Una línea
HTTP/1.1 407en la salida verbose confirma un problema de credenciales. - Añade los parámetros de targeting uno a uno, haciendo la prueba tras cada uno.
- Registra la URL del proxy que construye tu programa, con la contraseña oculta, y compárala carácter a carácter con la del panel.
- Si curl funciona y tu programa falla, la librería no está enviando las credenciales. Lee la solución para tu herramienta abajo.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL¿Cómo soluciono a 407?
- Codifica las credenciales con
urllib.parse.quote(value, safe='')en Python oencodeURIComponent()en JavaScript antes de construir la URL. - En navegadores: pasa
usernameypassworden la opciónproxyde Playwright, llamapage.authenticate()en Puppeteer, y usa un reenviador local para Selenium. Consulta las guías de Playwright y Puppeteer. - Variables de entorno: si usas
HTTPS_PROXY, pon toda la value entre comillas en la shell para que@y$se mantengan. - Rota la contraseña en el panel si sospechas una fuga, y actualiza todos los scrapers que la usan.
from urllib.parse import quote
import requests
user = "USERNAME-country-us"
password = "p@ss:word/1" # example containing special characters
# safe="" also encodes "/", "@" and ":" inside the credentials
proxy = "http://{}:{}@gw.crawlrelay.com:7777".format(
quote(user, safe=""), quote(password, safe="")
)
proxies = {"http": proxy, "https": proxy} # http:// for both keys
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(10, 30))
print(r.status_code, r.text)from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.crawlrelay.com:7777",
"username": "USERNAME-country-us",
"password": "PASSWORD",
})
page = browser.new_page()
response = page.goto("https://api.ipify.org")
print(response.status, page.inner_text("body"))
browser.close()¿Debo reintentar después de a 407?
No reintentes un 407 automáticamente. Un reintento con las mismas credenciales devuelve la misma respuesta, y un bucle de reintentos solo llena tus logs. Trata el 407 como un error de configuración: para el trabajo, arregla las credenciales y reinicia. Si el 407 aparece de repente en un trabajo que funcionaba días, probablemente la contraseña cambió o se desactivó el subusuario.
¿Cómo se aplica 407 Proxy Authentication Required a CrawlRelay?
La puerta de enlace de CrawlRelay lee el nombre y contraseña en cada conexión nueva. El targeting y las sesiones viven en el nombre de usuario, así que una contraseña válida puede fallar si el sufijo está mal formado. Construye el nombre de usuario en una función auxiliar y registra su resultado al inicio. La página de inicio rápido muestra el formato exacto.
Gateway: gw.crawlrelay.com, puerto 7777 (HTTP, HTTPS a través de CONNECT) y puerto 7778 (SOCKS5). Formato de usuario: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Relacionado: 401 vs 407 · ERR_TUNNEL_CONNECTION_FAILED · No se puede conectar al proxy.
407 Proxy Authentication Required: preguntas que hacen los desarrolladores
¿Un 407 lo envía el sitio que estoy scrapeando?
No. Un 407 siempre lo envía un proxy entre tú y el sitio. La solicitud nunca llega al sitio, así que este no ve tu tráfico, ni lo cuenta ni te bloquea por ello. Si el sitio quisiera un login, respondería 401. Arregla las credenciales del proxy y el 407 desaparece.
¿Por qué mi código recibe 407 cuando curl funciona con el mismo proxy?
Tu librería no está enviando las credenciales, o las envía en forma distinta. Las causas usuales son credenciales en una bandera del navegador que las ignora, una variable de entorno que perdió caracteres especiales o una contraseña sin codificar en URL. Imprime la URL del proxy que construye tu código, con la contraseña oculta, y compárala con el comando curl.
¿Un 407 usa tráfico de mi plan?
Una respuesta 407 mide unos cientos de bytes, y la petición nunca llega al destino, por lo que no se descarga ninguna página. El coste está en otro lado: un scraper atascado en un bucle de reintentos 407 pierde tiempo y llena tus logs. Convierte el 407 en una parada estricta en tu manejo de errores.
Otros errores de proxy en esta referencia
Códigos de estado HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Errores de navegador y cliente
Errores de conexión y TLS
Proxies residenciales con documentación que cubre los casos de fallo
CrawlRelay proxies residenciales de 0,50 US$/GB, tráfico que nunca expira.