WhereAmI/README.md
2026-06-15 00:49:26 +08:00

268 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WhereAmI - 多协议轮转代理工具
## 项目简介
WhereAmI 是一个基于 Python 和 PyQt6 的现代化多协议轮转代理工具能够将各种外部代理HTTP/HTTPS/SOCKS4/SOCKS5通过本地 SOCKS5 转发服务部署到 `127.0.0.1:8745`,配合 Proxifier 等工具使用。
## 核心特性
### 🚀 三步工作流程
1. **验证代理**:并发测试所有代理的连通性,对 SOCKS5 代理进行握手验证
2. **获取代理**:从验证通过的代理列表中选择可用代理作为上游代理
3. **转发到 8745 端口**:启动 SOCKS5 服务器监听 8745 端口,双向转发数据
### 🎯 主要功能
-**多协议支持**HTTP、HTTPS、SOCKS4、SOCKS5
-**自动获取代理**:从指定网页抓取代理列表
-**本地文件支持**:从 JSON 文件加载代理配置
-**健康检测**TCP 延迟测试 + Google 连通性测试
-**代理轮转**:手动切换 / 自动定时切换
-**实时状态监控**GUI 界面显示代理状态、延迟、统计信息
-**日志记录**:详细的运行日志,支持文件和控制台输出
## 技术栈
- **开发语言**: Python 3.9+
- **GUI 框架**: PyQt6
- **网络请求**: requests, aiohttp
- **HTML 解析**: BeautifulSoup4, lxml
- **配置文件**: PyYAML
- **SOCKS 支持**: PySocks
- **日志系统**: loguru
- **加密**: cryptography
## 安装步骤
### 1. 克隆项目
```bash
git clone <repository-url>
cd WhereAmI
```
### 2. 安装依赖
```bash
pip install -r requirements.txt
```
### 3. 运行程序
```bash
python main.py
```
## 使用说明
### 快速开始
1. **启动程序**
```bash
python main.py
```
2. **配置代理源**
- 点击 "⚙️ 配置" 按钮
- 设置自动获取 URL默认已配置为泰国代理网站
- 或启用本地文件模式
3. **获取代理**
- 点击 "🌐 获取免费代理" 按钮
- 程序会自动从网页抓取并检测代理
4. **启动服务**
- 点击 "▶ 开始服务" 按钮
- 服务将在 `127.0.0.1:8745` 启动 SOCKS5 代理
5. **配置 Proxifier**
- 打开 Proxifier
- 添加代理服务器:`127.0.0.1:8745`,类型选择 SOCKS5
- 设置代理规则,将需要代理的应用添加到规则中
6. **切换代理**
- 手动切换:点击 "🔄 切换下一个" 按钮
- 自动切换:在配置中设置为 auto 模式
### 配置说明
配置文件 `config.yaml` 包含以下主要配置项:
```yaml
# 代理源配置
proxy_sources:
auto_fetch:
enabled: true # 是否启用自动获取
url: "http://cn.freevpnnode.com/free-proxy-for-thailand/" # 抓取URL
refresh_interval: 10 # 刷新间隔(分钟)
local_file:
enabled: true # 是否启用本地文件
path: "local.json" # 本地文件路径
# 轮转策略
rotation:
mode: "manual" # manual | auto
auto_switch_interval: 300 # 自动切换间隔(秒)
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 # 连通性测试超时(秒)
max_failures: 3 # 最大失败次数
retry_delay: 600 # 重试延迟(秒)
```
### 本地代理文件格式
项目使用两个JSON文件来管理代理
#### 1. `proxy.json` - 自动抓取的代理(自动生成)
此文件由程序自动创建,保存从网页抓取的代理列表。**不要手动编辑此文件**,每次获取新代理时会被覆盖。
#### 2. `local.json` - 用户手动添加的代理(推荐)
此文件用于存放您自己的可靠代理。格式示例:
```json
[
{
"ip_address": "192.168.1.100",
"port": 1080,
"username": "no need",
"password": "no need",
"protocol": "socks5",
"country": "CN",
"anonymity": "elite",
"speed": "fast",
"uptime_percentage": "99%",
"response_time": "100ms",
"latency": "50ms",
"last_updated": "now"
}
]
```
**必填字段:**
- `ip_address`: 代理 IP 地址
- `port`: 代理端口
- `username`: 用户名(无认证填 "no need"
- `password`: 密码(无认证填 "no need"
- `protocol`: 协议类型http/https/socks4/socks5
**可选字段:**
- `country`: 国家代码
- `anonymity`: 匿名级别
- `speed`: 速度描述
- `uptime_percentage`: 在线率
- `response_time`: 响应时间
- `latency`: 延迟
- `last_updated`: 最后更新时间
## GUI 界面说明
### 主界面布局
#### 顶部状态栏
- **状态指示器**:显示服务运行状态(运行中/已停止)
- **当前代理信息**:显示正在使用的代理 IP、端口、协议、延迟
- **统计信息**:显示总代理数、可用数、优秀数、不可用数
#### 控制按钮区
- **▶ 开始服务**:启动 SOCKS5 代理服务(需要先选择一个代理节点)
- **⏹ 停止服务**:停止代理服务
- **🔄 切换下一个**:切换到下一个可用代理
- **🌐 获取免费代理**:从网页抓取代理并检测(默认功能)
- **📁 使用本地代理**:仅加载 `local.json` 中的代理
- **🔧 其他代理(预留)**:暂未实现,预留用于后续测试
- **⚙️ 配置**:打开配置对话框
#### 标签页
1. **代理列表**:显示所有代理的详细信息表格
-IP地址、端口、协议、国家、状态、延迟、匿名级别、速度、运行时间、最后更新
- 状态颜色:🟢 优秀、🟡 可用、🔴 不可用、⚪ 未知
- **过滤选项**"显示不可用代理"复选框,控制是否显示不可用的代理
- **选择代理**:点击表格行来选择要使用的代理节点
2. **连接日志**:显示所有通过代理的连接记录
- 格式:`[时间戳] 本地IP:端口 -> 远程代理IP:端口`
- 示例:`[2026-06-14 22:30:15] 127.0.0.1:54321 -> 192.168.1.100:1080`
- 支持清空日志
3. **日志**:显示程序运行日志
- 支持清空日志
- 显示时间戳和详细操作信息
## 常见问题
### Q1: 如何测试代理是否工作?
A: 启动服务后,使用 curl 命令测试:
```bash
curl -x socks5://127.0.0.1:8745 https://ip.sb
```
### Q2: 为什么有些代理显示为不可用?
A: 代理可能因为以下原因被标记为不可用:
- TCP 连接超时(>5秒
- Google 连通性测试失败
- 连续失败 3 次以上
### Q3: 如何添加自己的代理?
A: 编辑 `local.json` 文件,按照格式添加您的可靠代理信息。程序会自动合并 `proxy.json`(抓取的代理)和 `local.json`(手动添加的代理)。建议优先使用 `local.json` 添加稳定可靠的代理。
### Q4: 端口 8745 被占用怎么办?
A: 在配置中修改监听端口,或使用以下命令查找占用进程:
```bash
netstat -ano | findstr "8745"
```
### Q5: 如何实现自动切换代理?
A: 在配置中将 `rotation.mode` 设置为 `"auto"`,并设置 `auto_switch_interval` 为期望的切换间隔(秒)。
## 项目结构
```
WhereAmI/
├── main.py # 主入口
├── config.yaml # 配置文件
├── proxy.json # 自动抓取的代理(程序自动生成)
├── local.json # 用户手动添加的代理(推荐)
├── requirements.txt # 依赖包
├── README.md # 项目说明
├── core/ # 核心逻辑
│ ├── __init__.py
│ ├── models.py # 数据模型
│ ├── data_source.py # 数据源获取
│ ├── health_checker.py # 健康检测器
│ ├── proxy_manager.py # 代理管理器
│ └── simple_proxy_forwarder.py # 简化转发器
├── gui/ # GUI界面
│ ├── __init__.py
│ └── main_window.py # 主窗口
├── utils/ # 工具类
│ └── __init__.py
└── logs/ # 日志目录
└── whereami.log
```
## 注意事项
1. **首次运行**:请确保安装了所有依赖包
2. **代理质量**:免费代理稳定性较差,建议定期更新代理列表
3. **安全性**:不要在免费代理上登录敏感账户或传输机密数据
4. **法律合规**:请遵守当地法律法规,合理使用代理服务
## 许可证
本项目仅供学习和研究使用。
## 贡献
欢迎提交 Issue 和 Pull Request
---
**版本**: v1.0.0
**更新日期**: 2026-06-14