有些应用要求填写 IP:port,另一些则需要以 http:// 或 socks5:// 开头的 URL。浏览器设置通常将地址和端口分成两个字段。因此,同一个端点可以有多种表示格式,地址本身并未改变。

一条 IPv4 记录

假设HTTP 代理列表给出的示例 HTTP 代理是 203.0.113.10:8080。

应用要求填写内容
主机或 IP203.0.113.10
端口8080
HTTP 代理 URLhttp://203.0.113.10:8080

不要重复填写端口。如果应用已有端口输入框,却把 203.0.113.10:8080 填入主机框,它可能会尝试将整个字符串作为主机名解析。同样,明确只接受 IP 地址的字段不应添加 scheme。

scheme 必须与服务匹配。转换地址前,先根据客户端支持情况选择 HTTP 或 SOCKS5。在 HTTP 端点前加上 socks5:// 会改变客户端发送的内容,却不会让服务器启用 SOCKS5。

URL 中的 IPv6 地址需要方括号

IPv6 地址本身含有冒号,因此 URL 要先用方括号括住地址,再添加端口:

http://[2001:db8::10]:8080
socks5://[2001:db8::10]:1080

没有方括号,地址与端口的分界就不明确。字段分开的应用通常要求主机填 2001:db8::10、端口填 8080;请遵循应用自己的输入格式。这里使用的两个地址都是文档示例,并非可用的在线代理。

解析 URL,不要遇到冒号就拆分

一小段 Python 脚本可以利用标准 URL 解析器处理 IPv4 URL 和带方括号的 IPv6 URL:

from urllib.parse import urlsplit

proxy = urlsplit("http://[2001:db8::10]:8080")
print(proxy.scheme)
print(proxy.hostname)
print(proxy.port)

hostname 属性返回不含方括号的地址。如果按每个冒号拆分原字符串,就会破坏这个示例。在实际导入程序中,还应拒绝缺失主机、不支持的 scheme,以及超出 1–65535 的端口。解析 URL 能得到其组成部分,但不能证明服务存在。

列表包含用户名和密码时

常见的 URL 格式为 http://username:password@host:port。凭据中的 @、#、/ 等字符需要正确进行 URL 编码。如果客户端提供独立的凭据字段,使用这些字段通常比手工拼接 URL 更容易。

转换冒号分隔的凭据字符串前,请先核对提供方的原始格式。四个冒号分隔字段并没有通用含义,而且密码本身也可能包含冒号。为普通 IP:port 行设计的解析器不应默默猜测其他格式的含义。

相关文章