错误修复 · 1 分钟阅读

HTTP 407 代理身份验证要求:如何修复它

407 是代理——而不是网站——告诉您它需要未获得的凭据。此指南准确解释了触发它的原因,并逐步介绍了 curl、浏览器、Python、Windows 和企业代理的修复方法。

407 实际上意味着什么

HTTP 407 代理身份验证要求来自于代理,而不是目标网站。这是代理的方式在说“我会转发你的请求,但首先请证明你是谁。”它是401的代理层双胞胎:响应携带一个Proxy-Authenticate头,描述它想要的方案(通常是基本认证),你的客户端需要重新发送请求,并附上一个Proxy-Authorization头。如果凭据缺失、格式错误或错误,你会收到407。

对于像s4m的经过身份验证的代理——SOCKS5在1080端口,HTTP在3128端口,均使用USER:PASS——407几乎总是意味着四种情况之一:你没有提供凭据,你提供了错误的凭据,密码包含破坏URL解析的特殊字符,或者你使用的工具没有从你放置凭据的地方读取它们(在Puppeteer和Scrapy中是经典问题)。下面的修复按从最常见到最不常见的顺序排列。请参阅代理身份验证指南和代理概述以获取背景信息。

根据工具正确提供凭据

相同的USER:PASS,在每个工具实际读取的位置。用你的凭据替换。

bash
# curl: inline in URL, or with -U (URL-encode special chars, e.g. @ -> %40)
curl -x http://USER:PASS@proxy.s4m.online:3128 https://api.ipify.org
curl -x proxy.s4m.online:3128 -U USER:PASS https://api.ipify.org

# wget: dedicated flags
wget -e https_proxy=proxy.s4m.online:3128 \
     --proxy-user=USER --proxy-password=PASS https://example.com

# Python requests: credentials belong in the proxy URL
#   proxies = {"http": "http://USER:PASS@proxy.s4m.online:3128",
#              "https": "http://USER:PASS@proxy.s4m.online:3128"}
#   requests.get(url, proxies=proxies)

# Environment variables (many tools read these):
export HTTPS_PROXY="http://USER:PASS@proxy.s4m.online:3128"

# Special characters? URL-encode the password:
#   pa@ss  ->  pa%40ss     (Python: urllib.parse.quote(pw, safe=''))

# Verify it worked: a 200 with an IP body means auth passed.
curl -o /dev/null -s -w "%{http_code}\n" \
     -x http://USER:PASS@proxy.s4m.online:3128 https://api.ipify.org

逐步修复407错误

按此列表进行操作;大多数407错误通过第3步解决。

确认代理需要身份验证

s4m 代理需要 USER:PASS。407 表示代理没有有效的凭据 — 所以问题只是您的凭据在哪里出错,而不是是否需要身份验证。

检查凭据是否完全正确

重新复制您的仪表板上的用户和密码。尾随空格、错误字符或过期凭证都会产生407。首先在单个curl -x命令中测试它们。

对特殊字符进行 URL 编码

如果密码包含 @、:、/、# 或类似字符,请对其进行编码(@ 变为 %40)。未编码时,它们会破坏代理 URL,导致客户端发送错误或部分凭据。

将凭据放在工具可以读取的地方

一些工具忽略 URL 凭据:Puppeteer 需要 page.authenticate(),Scrapy 需要 Proxy-Authorization 头。将方法与工具匹配,而不仅仅是代理。

浏览器、Windows和企业代理

在浏览器中,407 通常表现为来自代理的登录弹窗;输入正确的用户名和密码可以清除它。在自动化浏览器时,这个弹窗就是整个问题——无头 Chromium 无法响应它,这就是为什么Puppeteer使用page.authenticate(),Playwright在其代理对象中接受凭据,而Selenium需要一个小扩展。在Windows上,检查设置中的系统代理和任何每个应用的代理,因为那里过期的保存凭据可能会在继承系统代理的工具中触发 407。

企业代理增加了一个复杂性:有些使用 NTLM 或 Kerberos 而不是基本身份验证,因此单纯的USER:PASS是不够的,你需要工具的 NTLM 选项。s4m 本身使用标准的基本USER:PASS,因此你在我们的端点上不需要 NTLM。如果凭据确实正确但仍然看到 407,请确认你正在访问正确的端口(1080 SOCKS5,3128 HTTP)并使用工具验证端点。相关的 Chrome 错误在ERR_PROXY_CONNECTION_FAILED 指南中有介绍。

FAQ

问题,已解答

407错误是网站的错误还是代理的错误?

代理的。HTTP 407 代理身份验证要求是由代理返回的,而不是目标网站,告诉您在转发请求之前需要有效的凭据。直到您进行身份验证,网站才会被访问。

为什么即使密码正确我也会收到407?

密码中最常包含特殊字符,这会破坏代理URL,因此客户端发送了错误的值。对它们进行URL编码(例如@变为%40)。还要确认工具从您放置凭据的位置读取它们。

如何在 Puppeteer、Playwright 或 Selenium 中修复 407 错误?

浏览器忽略代理标志中的凭据。在 Puppeteer 中使用 page.authenticate(),在 Playwright 中使用代理对象的用户名/密码字段,以及在 Selenium 中使用小的凭据扩展。

s4m 是否使用 NTLM 代理认证?

不。s4m 在端口 1080(SOCKS5)和 3128(HTTP)上使用标准的基本 USER:PASS 身份验证。NTLM 仅适用于某些企业代理,而不适用于我们的端点。

具有简单身份验证的代理

s4m 代理在 proxy.s4m.online 上使用普通的 USER:PASS — 没有 NTLM,没有惊喜。计量数据中心 SOCKS5 和 HTTP,提供专用 IP 选项以供白名单访问。

人们通过搜索找到此页面

此页面回答的真实搜索短语 — 链接的短语打开详细覆盖它们的页面。