代理 IP 和端口:你的应用需要哪种格式?
将代理列表条目转换为 HTTP 或 SOCKS URL,处理独立的主机与端口字段,并正确书写 IPv6 地址。
有些应用要求填写 IP:port,另一些则需要以 http:// 或 socks5:// 开头的 URL。浏览器设置通常将地址和端口分成两个字段。因此,同一个端点可以有多种表示格式,地址本身并未改变。
一条 IPv4 记录
假设HTTP 代理列表给出的示例 HTTP 代理是 203.0.113.10:8080。
| 应用要求 | 填写内容 |
|---|---|
| 主机或 IP | 203.0.113.10 |
| 端口 | 8080 |
| HTTP 代理 URL | http://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 行设计的解析器不应默默猜测其他格式的含义。