2025-10-21 20:04:19 +08:00
|
|
|
|
# 🌐 EIP IP轮换服务
|
2025-10-17 17:05:19 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
一个基于FastAPI的智能IP地址轮换管理系统,支持多省份选择、自动IP切换和Web控制面板。
|
2025-10-17 17:05:19 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
## ✨ 功能特性
|
|
|
|
|
|
|
|
|
|
|
|
### 🔄 核心功能
|
|
|
|
|
|
- **智能IP轮换**: 自动从可用设备中选择未使用的IP地址
|
|
|
|
|
|
- **多省份支持**: 支持上海、四川、广东等多个省份的城市选择
|
|
|
|
|
|
- **随机城市选择**: 从指定省份中随机选择城市进行IP轮换
|
|
|
|
|
|
- **使用记录追踪**: 基于Redis的IP使用记录,避免重复使用
|
|
|
|
|
|
- **网关路由配置**: 自动配置网关路由规则
|
|
|
|
|
|
|
|
|
|
|
|
### 🎯 Web控制面板
|
|
|
|
|
|
- **现代化UI**: 响应式设计,支持移动端访问
|
|
|
|
|
|
- **省份选择**: 可视化省份选择,支持全选/取消全选
|
|
|
|
|
|
- **实时状态**: 显示当前IP、使用统计和网关状态
|
|
|
|
|
|
- **URL参数支持**: 通过URL参数传递客户端ID
|
|
|
|
|
|
|
|
|
|
|
|
### 🔧 技术特性
|
|
|
|
|
|
- **自动重试**: 网络请求失败时自动重试,支持指数退避
|
|
|
|
|
|
- **Token管理**: 自动处理认证令牌的获取和刷新
|
|
|
|
|
|
- **容错处理**: 兼容多种后端响应格式
|
|
|
|
|
|
- **配置管理**: 支持环境变量和配置文件
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 环境要求
|
|
|
|
|
|
- Python 3.8+
|
|
|
|
|
|
- Redis服务器
|
|
|
|
|
|
- EIP服务访问权限
|
|
|
|
|
|
|
|
|
|
|
|
### 安装依赖
|
2025-10-17 17:05:19 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
### 配置环境变量
|
|
|
|
|
|
创建 `app/.env` 文件:
|
|
|
|
|
|
```env
|
|
|
|
|
|
# EIP服务配置
|
|
|
|
|
|
EIP_BASE_URL=https://smart.jdbox.xyz:58001
|
|
|
|
|
|
EIP_USERNAME=your_username
|
|
|
|
|
|
EIP_PASSWORD=your_password
|
|
|
|
|
|
EIP_GATEWAY_MAC=your_gateway_mac
|
|
|
|
|
|
EIP_DEFAULT_CITYHASH=your_default_cityhash
|
|
|
|
|
|
EIP_DEFAULT_NUM=10
|
|
|
|
|
|
|
|
|
|
|
|
# Redis配置
|
|
|
|
|
|
REDIS_URL=redis://localhost:6379/0
|
|
|
|
|
|
|
|
|
|
|
|
# 日志级别
|
|
|
|
|
|
LOG_LEVEL=INFO
|
2025-10-17 17:05:19 +08:00
|
|
|
|
```
|
2025-10-21 20:04:19 +08:00
|
|
|
|
|
|
|
|
|
|
### 启动服务
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 开发模式
|
|
|
|
|
|
python -m app.main
|
|
|
|
|
|
|
|
|
|
|
|
# 或使用uvicorn
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
2025-10-17 17:05:19 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
### 访问Web界面
|
|
|
|
|
|
- **主页**: http://localhost:8000/
|
|
|
|
|
|
- **带客户端ID**: http://localhost:8000/?id=123
|
|
|
|
|
|
- **API文档**: http://localhost:8000/docs
|
2025-10-17 17:05:19 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
## 📚 API接口
|
2025-10-17 18:33:07 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
### 核心接口
|
2025-10-17 18:33:07 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
#### 1. IP轮换
|
|
|
|
|
|
```http
|
|
|
|
|
|
POST /proxy/rotate
|
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
"id": 123,
|
|
|
|
|
|
"citys": "上海,四川,广东"
|
|
|
|
|
|
}
|
2025-10-17 18:33:07 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
**响应示例**:
|
2025-10-17 18:33:07 +08:00
|
|
|
|
```json
|
|
|
|
|
|
{
|
2025-10-21 20:04:19 +08:00
|
|
|
|
"changed": true,
|
|
|
|
|
|
"ip": "192.168.1.100",
|
|
|
|
|
|
"edge": "edge_device_001",
|
|
|
|
|
|
"status": {
|
|
|
|
|
|
"gateway_status": "active"
|
|
|
|
|
|
}
|
2025-10-17 18:33:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
#### 2. 获取状态
|
|
|
|
|
|
```http
|
|
|
|
|
|
GET /proxy/status
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**响应示例**:
|
2025-10-17 18:33:07 +08:00
|
|
|
|
```json
|
|
|
|
|
|
{
|
2025-10-21 20:04:19 +08:00
|
|
|
|
"current": {
|
|
|
|
|
|
"ip": "192.168.1.100",
|
|
|
|
|
|
"edge_id": "edge_device_001"
|
|
|
|
|
|
},
|
|
|
|
|
|
"used_today": 5,
|
|
|
|
|
|
"gateway": {
|
|
|
|
|
|
"status": "active"
|
|
|
|
|
|
}
|
2025-10-17 18:33:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
#### 3. 获取城市列表
|
|
|
|
|
|
```http
|
|
|
|
|
|
GET /proxy/cities
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**响应示例**:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"data": ["上海", "四川", "广东"]
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 健康检查
|
|
|
|
|
|
```http
|
|
|
|
|
|
GET /health
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🏗️ 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
jdeip/
|
|
|
|
|
|
├── app/
|
|
|
|
|
|
│ ├── __init__.py
|
|
|
|
|
|
│ ├── main.py # FastAPI应用入口
|
|
|
|
|
|
│ ├── config.py # 配置管理
|
|
|
|
|
|
│ ├── eip_client.py # EIP客户端
|
|
|
|
|
|
│ ├── rotation_service.py # IP轮换服务
|
|
|
|
|
|
│ ├── redis_store.py # Redis存储
|
|
|
|
|
|
│ ├── routers/
|
|
|
|
|
|
│ │ └── proxy.py # API路由
|
|
|
|
|
|
│ └── templates/
|
|
|
|
|
|
│ └── index.html # Web控制面板
|
|
|
|
|
|
├── requirements.txt # 依赖包
|
|
|
|
|
|
├── README.md # 项目文档
|
|
|
|
|
|
└── .env # 环境变量配置
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 核心模块
|
|
|
|
|
|
|
|
|
|
|
|
### EIP客户端 (`eip_client.py`)
|
|
|
|
|
|
- 处理与EIP服务的所有通信
|
|
|
|
|
|
- 自动认证和令牌管理
|
|
|
|
|
|
- 支持设备列表、网关配置等操作
|
|
|
|
|
|
- 内置重试机制和错误处理
|
|
|
|
|
|
|
|
|
|
|
|
### 轮换服务 (`rotation_service.py`)
|
|
|
|
|
|
- 核心IP轮换逻辑
|
|
|
|
|
|
- 随机城市选择算法
|
|
|
|
|
|
- 使用记录管理
|
|
|
|
|
|
- 网关路由配置
|
|
|
|
|
|
|
|
|
|
|
|
### Redis存储 (`redis_store.py`)
|
|
|
|
|
|
- IP使用记录存储
|
|
|
|
|
|
- 按天统计使用情况
|
|
|
|
|
|
- 当前状态管理
|
|
|
|
|
|
|
|
|
|
|
|
### Web控制面板
|
|
|
|
|
|
- 现代化响应式界面
|
|
|
|
|
|
- 省份可视化选择
|
|
|
|
|
|
- 实时状态显示
|
|
|
|
|
|
- 异步操作支持
|
|
|
|
|
|
|
|
|
|
|
|
## 🎨 Web界面功能
|
|
|
|
|
|
|
|
|
|
|
|
### 主要特性
|
|
|
|
|
|
- **省份选择**: 支持多选省份,默认全选
|
|
|
|
|
|
- **客户端ID**: 通过URL参数传递,支持 `?id=123`
|
|
|
|
|
|
- **实时轮换**: 一键执行IP轮换操作
|
|
|
|
|
|
- **状态显示**: 显示轮换结果和错误信息
|
|
|
|
|
|
- **响应式设计**: 支持桌面和移动设备
|
|
|
|
|
|
|
|
|
|
|
|
### 使用方式
|
|
|
|
|
|
1. 访问 `http://localhost:8000/` 进入控制面板
|
|
|
|
|
|
2. 选择需要的省份(默认全选)
|
|
|
|
|
|
3. 点击"开始IP轮换"按钮
|
|
|
|
|
|
4. 查看轮换结果
|
|
|
|
|
|
|
|
|
|
|
|
## 🔒 安全特性
|
|
|
|
|
|
|
|
|
|
|
|
- **环境变量**: 敏感信息通过环境变量管理
|
|
|
|
|
|
- **Token自动刷新**: 避免令牌过期问题
|
|
|
|
|
|
- **错误处理**: 完善的异常处理机制
|
|
|
|
|
|
- **输入验证**: 严格的参数验证
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 监控和日志
|
|
|
|
|
|
|
|
|
|
|
|
- **健康检查**: `/health` 端点提供服务状态
|
|
|
|
|
|
- **使用统计**: Redis记录IP使用情况
|
|
|
|
|
|
- **错误日志**: 详细的错误信息和调试输出
|
|
|
|
|
|
- **状态监控**: 实时网关和连接状态
|
|
|
|
|
|
|
|
|
|
|
|
## 🛠️ 开发指南
|
|
|
|
|
|
|
|
|
|
|
|
### 添加新城市
|
|
|
|
|
|
在 `config.py` 中的 `city_dict` 添加新的省份和城市:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
city_dict = {
|
|
|
|
|
|
"新省份": {
|
|
|
|
|
|
"城市1": "城市编码1",
|
|
|
|
|
|
"城市2": "城市编码2"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 自定义配置
|
|
|
|
|
|
修改 `app/.env` 文件中的配置项,或通过环境变量覆盖。
|
|
|
|
|
|
|
|
|
|
|
|
### 扩展功能
|
|
|
|
|
|
- 在 `rotation_service.py` 中添加新的轮换策略
|
|
|
|
|
|
- 在 `eip_client.py` 中添加新的EIP操作
|
|
|
|
|
|
- 在 `routers/proxy.py` 中添加新的API端点
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 更新日志
|
|
|
|
|
|
|
|
|
|
|
|
### v1.0.0
|
|
|
|
|
|
- ✅ 基础IP轮换功能
|
|
|
|
|
|
- ✅ 多省份支持
|
|
|
|
|
|
- ✅ Redis存储集成
|
|
|
|
|
|
- ✅ Web控制面板
|
|
|
|
|
|
- ✅ 自动重试机制
|
|
|
|
|
|
- ✅ 详细中文注释
|
|
|
|
|
|
|
|
|
|
|
|
## 🤝 贡献指南
|
|
|
|
|
|
|
|
|
|
|
|
1. Fork 项目
|
|
|
|
|
|
2. 创建功能分支
|
|
|
|
|
|
3. 提交更改
|
|
|
|
|
|
4. 推送到分支
|
|
|
|
|
|
5. 创建 Pull Request
|
|
|
|
|
|
|
|
|
|
|
|
## 📄 许可证
|
|
|
|
|
|
|
|
|
|
|
|
本项目采用 MIT 许可证。
|
|
|
|
|
|
|
|
|
|
|
|
## 🆘 支持
|
|
|
|
|
|
|
|
|
|
|
|
如有问题或建议,请创建 Issue 或联系开发团队。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
2025-10-17 17:05:19 +08:00
|
|
|
|
|
2025-10-21 20:04:19 +08:00
|
|
|
|
**注意**: 使用前请确保已正确配置EIP服务凭据和Redis连接。
|