248 lines
7.6 KiB
Markdown
248 lines
7.6 KiB
Markdown
# 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 自动定时切换模式
|
||
- **切换条件**:
|
||
1. 达到设定的时间间隔(默认300秒,可配置)
|
||
2. 且10秒内无活动连接(可配置)
|
||
- **切换策略**:
|
||
- 按顺序切换到下一个可用节点
|
||
- 跳过已失效或延迟过高的节点
|
||
- 记录切换历史
|
||
|
||
### 3. 代理获取方式
|
||
#### 3.1 自动获取(网络抓取)
|
||
- **默认URL**:`http://cn.freevpnnode.com/free-proxy-for-thailand/`
|
||
- **可配置**:GUI中可修改抓取URL
|
||
- **解析流程**:
|
||
1. 请求网页获取HTML内容
|
||
2. 提取表格中的代理信息(参考page.html结构)
|
||
3. 字段映射:IP地址、端口、用户名、密码、国家、协议、匿名级别、速度、运行时间、延迟、更新时间
|
||
4. 生成JSON文件保存(格式参照local.json)
|
||
|
||
#### 3.2 本地文件读取
|
||
- **文件格式**:JSON(参照local.json模板)
|
||
- **必填字段**:
|
||
```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状态码
|
||
|
||
#### 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)
|
||
```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上快速更改 |