7.6 KiB
7.6 KiB
WhereAmI - 多协议轮转代理工具
项目概述
项目名称:WhereAmI
项目描述:基于Python的轮转代理工具,将各种外部代理(HTTP/HTTPS/SOCKS4/SOCKS5)通过本地SOCKS5转发服务部署到127.0.0.1:8745,配合Proxifier使用
核心功能需求
1. 多协议支持
- 输入协议:HTTP、HTTPS、SOCKS4、SOCKS5
- 输出协议:统一转换为本地SOCKS5代理(127.0.0.1:8745)
- 实现方式:python先连接对应代理,然后转发到本地8745端口,应用程序连接socks5代理的8745端口即可
2. 代理切换机制
2.1 手动切换模式
- GUI界面提供代理列表,用户可手动选择并切换到指定代理
- 显示当前使用代理的详细信息(IP、端口、延迟、状态等)
2.2 自动定时切换模式
- 切换条件:
- 达到设定的时间间隔(默认300秒,可配置)
- 且10秒内无活动连接(可配置)
- 切换策略:
- 按顺序切换到下一个可用节点
- 跳过已失效或延迟过高的节点
- 记录切换历史
3. 代理获取方式
3.1 自动获取(网络抓取)
- 默认URL:
http://cn.freevpnnode.com/free-proxy-for-thailand/ - 可配置:GUI中可修改抓取URL
- 解析流程:
- 请求网页获取HTML内容
- 提取表格中的代理信息(参考page.html结构)
- 字段映射:IP地址、端口、用户名、密码、国家、协议、匿名级别、速度、运行时间、延迟、更新时间
- 生成JSON文件保存(格式参照local.json)
3.2 本地文件读取
- 文件格式:JSON(参照local.json模板)
- 必填字段:
{ "ip_address": "string", "port": "integer", "username": "string (\"no need\"表示无需认证)", "password": "string (\"no need\"表示无需认证)", "protocol": "http|https|socks4|socks5" } - 可选字段:country、anonymity、speed、uptime_percentage、response_time、latency、last_updated
4. 代理健康检测
4.1 检测方法
-
延迟测试:
- TCP连接超时:5秒
- 合格标准:< 500ms(可配置)
- 优秀标准:< 200ms
-
连通性测试:
- Google连接测试:访问
https://www.google.com/ - 超时时间:10秒
- 预期响应:204状态码
- Google连接测试:访问
4.2 检测周期
- 初始检测:获取代理后立即全量检测
- 定期复检:每60秒检测一次正在使用的代理
- 失败重试:连续失败3次标记为不可用,10分钟后重新检测
4.3 代理分级
- 可用:延迟<500ms 且 Google测试通过
- 优秀:延迟<200ms 且 Google测试通过
- 不可用:延迟>=500ms 或 Google测试失败 或 连续失败3次
5. GUI界面设计
5.1 主界面布局
-
顶部区域:
- 服务状态指示器(运行/停止)
- 当前代理信息卡片(IP、端口、协议、延迟、国家)
- 快速操作按钮(开始/停止、立即切换)
-
中部区域:
- 代理列表表格(支持排序、筛选)
- 列:IP、端口、协议、国家、延迟、状态、最后检测时间
- 状态标识:可用 🟡一般 🔴不可用
- 实时延迟趋势图(最近5分钟)
- 代理列表表格(支持排序、筛选)
-
底部区域:
- 日志输出窗口(可清空)
- 统计信息(总代理数、可用数、已切换次数)
5.2 配置面板
-
代理源设置:
- 自动获取URL输入框
- 本地文件路径选择
- 刷新间隔设置(分钟)
-
轮转策略设置:
- 切换模式:手动 / 自动
- 自动切换间隔(秒)
- 无活动等待时间(秒)
- 延迟阈值(毫秒)
-
输出设置:
- SOCKS5监听地址(默认127.0.0.1)
- SOCKS5监听端口(默认8745)
-
检测设置:
- 检测超时时间(秒)
- 连通性测试URL
- 复检间隔(秒)
5.3 交互功能
- 右键菜单:复制代理信息、标记为优先、删除
- 拖拽排序:调整代理优先级
- 导入/导出:配置文件、代理列表
- 历史记录:查看切换历史、性能统计
6. 配置管理
6.1 配置文件格式(config.yaml)
# 代理源配置
proxy_sources:
auto_fetch:
enabled: true
url: "http://cn.freevpnnode.com/free-proxy-for-thailand/"
refresh_interval: 10 # 分钟
local_file:
enabled: true
path: "local.json"
# 轮转策略
rotation:
mode: "manual" # manual | auto
auto_switch_interval: 300 # 秒
min_idle_time: 10 # 无活动连接最小等待时间(秒)
skip_high_latency: true # 跳过延迟>阈值的代理
latency_threshold: 500 # 毫秒
# 输出配置
output:
host: "127.0.0.1"
port: 8745
# 检测配置
health_check:
timeout: 5 # TCP连接超时(秒)
connectivity_test_url: "https://www.google.com/"
connectivity_timeout: 10 # 连通性测试超时(秒)
recheck_interval: 60 # 复检间隔(秒)
max_failures: 3 # 最大失败次数
retry_delay: 600 # 失败后重试延迟(秒)
# 日志配置
logging:
level: "INFO" # DEBUG | INFO | WARNING | ERROR
file: "whereami.log"
max_size: 10 # MB
backup_count: 5
3. 数据流设计
[网页/本地文件] → [ProxyManager] → [HealthChecker] → [可用代理池]
↓
[RotationEngine] ← [无活动检测] ← [SOCKS Server] ← [客户端连接]
↓
[切换代理] → [更新SOCKS Server上游]
异常处理与容错
1. 常见异常场景
-
所有代理失效:
- 提示用户并尝试重新获取代理
- 保持最后一次可用的代理继续服务
- 后台持续检测新代理
-
网络波动:
- 短暂断网(<30秒):保持当前代理,不切换
- 长时间断网(>=30秒):暂停服务,显示警告
- 网络恢复:自动重新检测并恢复服务
-
端口占用:
- 检测8745端口是否被占用
- 如被占用,提示用户关闭占用进程或更换端口
-
Proxifier未运行:
- 仅作为提示,不影响程序运行
- 在GUI中显示Proxifier状态建议
2. 数据安全
- 认证信息加密:使用Fernet对称加密存储username/password
- 日志脱敏:日志中隐藏完整的IP和密码信息
- HTTPS证书:测试时可选择跳过证书验证(配置项)
性能优化
2. 缓存策略
- 检测结果缓存:缓存60秒,避免重复检测
- 代理列表缓存:本地JSON缓存,减少网络请求
- 配置热重载:修改配置后无需重启
3. 资源控制
- 最大并发检测数:10个(可配置)
- 代理池上限:100个(可配置)
- 内存限制:超过阈值时清理旧数据
扩展性设计
1. 插件化数据源
- 定义DataSource接口,支持添加新的代理网站
- 示例:ssrfree.com、proxynova.com等
2. 自定义测试脚本
- 允许用户编写Python脚本自定义连通性测试方法
- 通过配置文件指定测试脚本路径
3. API接口(未来)
- RESTful API:获取当前代理、切换代理、获取统计
- WebSocket:实时推送代理状态变化
GUI功能细化: 实时状态显示: 当前使用的代理信息(IP、端口、协议、延迟) 可用代理列表及状态(在线/离线/延迟) 历史使用记录 操作按钮: 开始/停止服务 立即切换下一个代理 使用本地代理 获取免费代理 (使用cn.freevpnnode.com源) 获取其他代理 (预留按钮,启动scratch.py并检测) 导入/导出配置 监控图表: 延迟趋势图 切换历史记录 使用一个次级页面展示配置并且可以在GUI上快速更改