连接住宅代理本该是五分钟的事,却经常花掉一下午,通常是因为某个供应商的文档采用了另一家的约定。其中只有四个可变部分:主机、端口、用户名和密码。不同供应商之间的差异在于用户名里塞进了多少信息,而在这样的网关上,几乎一切都体现在用户名中。
下面是具体格式、各部分的作用,以及出错时该如何解读。
四个组成部分
| 部分 | 值 |
|---|---|
| 主机 | p.shifter.io |
| 端口 | 443 |
| 用户名 | customer-USERNAME 加上可选的定向标记 |
| 密码 | 来自控制面板 |
主机和端口不会变化。无论是切换国家,还是使用粘性会话,或是把 HTTP 换成 SOCKS5,都不会改变。每个请求都发往同一个端点,你想要的配置通过用户名来表达。这是需要理解的最重要一点,因为它与旧式的、每种配置对应不同地址的基于端口的产品有着最大的不同。
HTTP(S) 和 SOCKS5 都使用同一个主机和端口。你的凭据可以在控制面板的 Residential Proxies 下找到。
最简单的请求
先从这里开始,确认能正常工作后再添加其他内容:
curl -x customer-USERNAME:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
它会返回描述你所获得出口地址的 JSON。运行两次,你应该会看到两个不同的地址,因为轮换是默认行为。如果这一步正常,说明你的凭据无误,其余都只是配置问题。
在用户名中添加定向参数
标记通过连字符附加到用户名后面。顺序不重要,值一律小写,多个单词的值用下划线连接。
customer-USERNAME # 轮换,不指定地理位置
customer-USERNAME-country-de # 德国出口
customer-USERNAME-country-us-city-new_york # 城市级别
customer-USERNAME-country-us-asn-7922 # 指定网络
customer-USERNAME-sid-abc123 # 粘性会话
customer-USERNAME-sid-abc123-ttl-600 # 粘性会话,持续10分钟
customer-USERNAME-country-gb-sid-abc123-ttl-600 # 组合使用
国家代码采用 ISO 3166-1 alpha-2 标准,所以英国是 gb 而不是 uk,这是最常见的拼写错误。sid 可以是你自选的任意字符串,它会让后续请求保持同一个出口地址;ttl 用于设置持续时间(单位为秒),只有和 sid 一起使用时才有效,默认值为 120。完整参考见地理定向文档和会话文档,两者在概念上的区别见粘性代理与轮换代理对比。
还有一点有用的补充:默认情况下,如果某一时刻没有匹配到非常精确的过滤条件,网关会回退到更广泛的池子,从而让你的请求仍然能够完成。当精确的地理匹配比请求成功更重要时,可以加上 strict-true,这样你会得到 502 而不是默默的回退。
你会遇到的两种格式
代理凭据有两种书写方式,而在两者之间转换正是让人出错的地方。
URL 形式,大多数库和 curl 使用:
http://customer-USERNAME-country-de:PASSWORD@p.shifter.io:443
冒号分隔形式,许多桌面工具和浏览器扩展使用,它们通常需要把各部分填入不同字段:
p.shifter.io:443:customer-USERNAME-country-de:PASSWORD
两者携带的信息完全相同。如果工具要求填四个字段,就用第二种格式;如果要求填一个字符串,就用第一种。
代码示例
import requests
USER = "customer-USERNAME-country-de"
PROXY = f"http://{USER}:PASSWORD@p.shifter.io:443"
r = requests.get("https://ipinfo.io/json",
proxies={"http": PROXY, "https": PROXY}, timeout=20)
print(r.json())
http 和 https 两个条目都要设置。只设置其中一个是导致”部分请求正常、部分不正常”的常见原因,因为普通请求和安全请求走的是不同路径。
如果你的密码中包含在 URL 中有特殊含义的字符,比如 @、:、/ 或 #,请在嵌入之前先做百分号编码,否则 URL 会被错误解析,即使凭据完全正确也会出现身份验证错误。
对于 SOCKS5,保持相同的主机、端口和凭据,只需更换协议方案。请使用在代理端而非本地解析主机名的那种变体,因为另一种会泄漏你的 DNS 并可能返回地区错误的结果,详见防止 DNS 泄漏。
其他技术栈的可用配置见集成文档,Python 方面的具体内容见在 Python 中使用住宅代理。
解读错误信息
几乎所有配置问题都可以归为四种响应,每一种都指向不同的地方。
407 Proxy Authentication Required 表示网关拒绝了你的凭据。要么凭据本身有误,要么用户名中的某个标记格式不正确,因为无法识别的值会导致整个用户名无法解析。先去掉所有标记,测试裸用户名:如果可以正常工作,问题就出在标记上,然后可以逐个加回来定位问题。完整的排查流程见修复 407 与凭据错误。
502 Bad Gateway 表示你的凭据没有问题,但当时没有匹配到你的过滤条件。可以放宽条件,把城市级别改为国家级别,或者去掉 strict-true。
509 Bandwidth Limit Exceeded 表示套餐额度已用尽,且未启用超额。连接本身没有问题。
连接被拒绝或超时 表示你根本没有连接到网关。请检查你连接的是 p.shifter.io:443 而不是旧式的基于端口的主机,并在怀疑是代理问题之前,先用 nc -vz p.shifter.io 443 测试原始连通性。
验证是否真正生效
开始时值得进行两项检查。
确认轮换:在不带 sid 的情况下多次发送同一请求,确认地址会发生变化。如果没有变化,通常原因是你的 HTTP 客户端复用了同一个连接,而不是代理没有轮换,详见 IP 不轮换。
确认地理位置:请求某个国家,检查返回的地址是否定位在该国,更有意义的是检查一个对地理位置敏感的目标网站是否表现得如同你确实身处那里。更完整的方法见测试速度、成功率和位置准确性。
结论
一个主机,一个端口,其余都在用户名里。先让裸请求跑通,再逐个添加定向标记,并记住国家代码采用 ISO 标准,所以英国是 gb。同时设置 HTTP 和 HTTPS 两个代理条目,对含特殊字符的密码做百分号编码,如果使用 SOCKS5,选择在远端解析的那种变体。出现故障时,状态码会告诉你该往哪里查:407 是凭据或标记格式错误,502 是过滤条件没有匹配结果,509 是带宽问题,连接被拒绝则说明你根本没有连接到网关。
这个网关是通往住宅代理的入口,国家、城市、ASN 和会话都是同一连接上的参数,按每 GB计费,因此配置的改变不会影响你的费用。如果你刚接触这一切,可以从住宅代理入门指南开始了解。