面向 Python TCP 套接字的 SOCKS 感知连接器
选择一个能识别代理的套接字连接器,并让其作用范围独立于 Python 全进程的套接字实现。
原生 Python 套接字不会仅因存在 http_proxy 就去协商代理。对于使用自有 TCP 协议的应用程序,应使用能理解代理端点服务的连接器。
如果已经安装了 PySocks,请显式创建连接:
import socks
with socks.socksocket() as connection:
connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
connection.settimeout(10)
connection.connect(('example.com', 12345))
# Exchange the destination protocol here.
替换文档地址和目标端口。对于允许的公共目标,只有在确认其允许应用程序的目标端口后,才从 SOCKS5 代理列表中选择候选。请依据 PySocks 接口核对已安装的包、支持的方法和端点要求。
应用程序的其余部分通过这条已建立的连接交换其协议。如果该协议使用 TLS,应在代理协商之后启动,并验证真实的目标主机名。代理认证建立路由;它不提供目标登录或加密。
SOCKS 监听器需要 SOCKS 协商。HTTP 服务需要支持 CONNECT 的连接器来处理任意 TCP 目标,并且可能拒绝其端口。应根据实际提供的服务选择连接器,而不是在保留错误握手的同时更改地址。
保持替换的局部性。将某个类赋给 socket.socket 会影响无关的导入和库。如果套接字创建由另一个库负责,请使用其文档化的连接工厂或代理选项;一个它从不读取的字典无法改变该连接。