3.2 KiB
3.2 KiB
SOCKS 代理设置工具技术文档
概述
该模块提供了一种简单的方式来为 Python 的全局网络请求设置和取消 SOCKS5 代理。通过替换 socket.socket 类,所有基于标准库 socket 的网络连接(包括 requests 等库)将自动通过指定的 SOCKS5 代理进行通信。
⚠️ 注意:此方法会影响全局 socket 行为,请谨慎使用,建议在完成代理请求后及时恢复原始设置。
依赖项
- Python 3.x
PySocks:用于支持 SOCKS 代理requests:用于发起 HTTP 请求(示例用途)
安装依赖
pip install PySocks requests
函数说明
set_socks_proxy(host, port)
启用 SOCKS5 代理,替换全局 socket.socket 实现。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
host |
str |
SOCKS5 代理服务器地址(如 '127.0.0.1') |
port |
int |
SOCKS5 代理服务端口(如 1080) |
示例
set_socks_proxy('127.0.0.1', 1080)
执行后,后续所有通过 socket 发起的连接(包括 requests.get() 等)都将通过该 SOCKS5 代理。
unset_proxy()
恢复原始的 socket.socket 实现,关闭代理。
说明
调用此函数后,所有网络连接将恢复为直连模式,不再经过代理。
示例
unset_proxy()
使用示例
import requests
from your_module import set_socks_proxy, unset_proxy
# 设置 SOCKS5 代理
set_socks_proxy('127.0.0.1', 1080)
try:
# 此请求将通过 SOCKS5 代理发送
response = requests.get('https://httpbin.org/ip')
print(response.json())
finally:
# 务必恢复原始 socket 设置
unset_proxy()
输出示例:
{
"origin": "1.2.3.4"
}
其中 IP 应为代理服务器的出口 IP。
注意事项
- 线程安全:由于修改了全局
socket.socket,在多线程环境下可能导致不可预期行为。不推荐在高并发或复杂应用中全局使用。 - 异常处理:建议在
try...finally块中使用,确保unset_proxy()被调用。 - 仅支持 SOCKS5:当前实现固定使用 SOCKS5 协议,不支持认证或其他类型代理。
- 影响范围广:所有基于
socket的库(如urllib,httplib,requests等)均会受影响。
扩展建议
- 支持更多代理类型(如 SOCKS4、HTTP)
- 添加用户名/密码认证支持
- 封装为上下文管理器以实现自动清理
class SocksProxy:
def __init__(self, host, port):
self.host = host
self.port = port
def __enter__(self):
set_socks_proxy(self.host, self.port)
def __exit__(self, *args):
unset_proxy()
# 使用方式
with SocksProxy('127.0.0.1', 1080):
requests.get('https://example.com')
版本兼容性
- Python: 3.6+
- PySocks: >=1.6.8
参考资料
📝 维护建议:在生产环境中,建议使用更精细的代理控制方式(如为 requests.Session 配置代理),避免修改全局 socket。