Files
wechat_ipad_pro/PROJECT_ANALYSIS.md

388 lines
21 KiB
Markdown
Raw Permalink 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.
# 📋 项目结构分析报告
> **项目名称**: wechat_ipad_pro_1224
> **模块名称**: `xiawan/wx`
> **技术栈**: Go 1.21 + Gin + MySQL + Redis + Protobuf + Docker
> **分析日期**: 2026-02-17
---
## 1. 项目概述
本项目是一个 **微信 iPad Pro 协议服务端**,通过逆向微信 iPad 协议实现微信功能的 HTTP API 化。服务端基于 Go 语言开发,使用 Gin 框架暴露 RESTful API,支持多账号并发登录管理,提供完整的微信消息、联系人、群管理、朋友圈、支付等功能。
### 核心特性
- 🔐 MMTLS 加密通信(微信自定义 TLS 协议)
- 📱 iPad Pro 设备模拟(支持 Mac/Car 转 iPad 模式)
- 🔄 多账号并发管理(100 并发限制)
- 📡 WebSocket + HTTP 轮询双模式消息同步
- 🐳 Docker 容器化部署
- 📖 Swagger API 文档
---
## 2. 项目目录结构
```
wechat_ipad_pro_1224/
├── main.go # 程序入口(初始化配置 → 数据库 → API 服务)
├── go.mod # Go 模块定义 (xiawan/wx, go 1.21)
├── go.sum # 依赖校验
├── Dockerfile # 多阶段 Docker 构建(golang:1.21-alpine
├── docker-compose.yaml # 编排:wxserver + redis + mysql
├── api/ # 🌐 HTTP 接口层(Gin 框架)
│ ├── apiSetup.go # API 启动入口 + 自动重连逻辑
│ ├── controller/ # 控制器层(19 个文件)
│ ├── service/ # API 业务服务层(23 个文件)
│ ├── router/ # 路由注册(router.go
│ ├── req/ # 请求模型(9 个文件)
│ ├── vo/ # 响应视图对象
│ ├── middleware/ # 中间件(CORS 等)
│ ├── swagger/ # Swagger 文档配置
│ └── utils/ # API 工具函数
├── srv/ # ⚙️ 核心业务逻辑层
│ ├── wxcore/ # 微信核心实现(14 个文件)
│ ├── wxface/ # 接口抽象层(14 个接口定义)
│ ├── wxrouter/ # 协议路由分发(25 个文件)
│ ├── wxtask/ # 后台异步任务(9 个文件)
│ ├── websrv/ # WebSocket 服务
│ ├── srvconfig/ # 全局配置管理
│ ├── defines/ # 常量定义
│ ├── wxaccount.go # 账号管理
│ └── wxfilemgr.go # 文件管理
├── clientsdk/ # 📦 微信协议 SDK
│ ├── request.go # 核心请求封装(5148 行,173KB)
│ ├── baserequest.go # 基础请求构建
│ ├── protocol.go # 协议打包/解包
│ ├── cdnprotocol.go # CDN 协议(图片/视频上传下载)
│ ├── cdnrequest.go # CDN 请求
│ ├── hybrid_request.go # 混合请求
│ ├── oplogitem.go # 操作日志项
│ ├── demo.go # 示例代码
│ ├── mmtls/ # MMTLS 加密通信(11 个文件)
│ ├── cecdh/ # ECDH 密钥交换(7 个文件)
│ ├── baseinfo/ # 基础数据结构(14 个文件)
│ ├── baseutils/ # 基础工具函数(8 个文件)
│ ├── android/ # Android 设备信息(23 个文件)
│ ├── extinfo/ # 扩展信息
│ ├── ccdata/ # CC 数据
│ ├── hybrid/ # 混合模式
│ ├── proxynet/ # 代理网络
│ └── xmltool/ # XML 工具
├── db/ # 💾 数据库层
│ ├── mysql_db.go # MySQL 操作(48KB,核心 CRUD
│ ├── redisOperation.go # Redis 操作(18KB
│ ├── cache.go # 缓存管理
│ ├── proxy.go # 代理管理
│ ├── message_callback.go # 消息回调
│ ├── callback_wrapper.go # 回调包装器
│ └── table/ # 数据表模型定义
│ ├── mysql_table.go # MySQL 表结构(ORM 模型)
│ ├── redis_table.go # Redis 数据结构
│ ├── proxy_mapping.go # 代理映射
│ ├── messageCallback.go
│ └── base.go
├── protobuf/ # 📝 Protobuf 协议定义
│ ├── wechat/ # 微信 Protobuf 消息(27 个文件)
│ ├── wechat_proto/ # 原始 Proto 定义(28 个文件)
│ └── proto_ref/ # 协议参考
├── lib/ # 🔧 工具函数库(11 个文件)
│ ├── BytesToInt.go # 字节转整数
│ ├── IntToBytes.go # 整数转字节
│ ├── MD5ToLower.go # MD5 小写
│ ├── GetFileMD5Hash.go # 文件 MD5
│ ├── Hex2Int.go # 十六进制转换
│ ├── CreateDeviceId.go # 设备 ID 生成
│ ├── Get62Data.go # 62 数据获取
│ ├── Get62Key.go # 62 密钥获取
│ ├── GetClientSeqId.go # 客户端序列号
│ ├── RandString.go # 随机字符串
│ └── ALLGather.go # 聚合工具
├── assets/ # 📁 配置和资源文件
│ ├── setting.json # 主配置文件
│ ├── setting.json.docker # Docker 环境配置
│ ├── ca-cert # CA 证书
│ └── sae.dat # SAE 数据文件
├── apns/ # 🔔 Apple 推送通知
│ ├── Apns.go
│ └── deviceToken.go
├── bin/ # 📦 预编译二进制
│ ├── linux_amd64/
│ └── windows_amd64/
└── static/ # 🌐 静态资源
├── swagger/ # Swagger UI + API 文档
├── templates/ # HTML 模板
├── doc/ # 文档
└── qrcode/ # 二维码
```
---
## 3. 分层架构
```
┌─────────────────────────────────────────────────────┐
│ HTTP Client / WebSocket │
├─────────────────────────────────────────────────────┤
│ api/router 路由注册(13 个路由组,170+ 端点) │
│ api/middleware 中间件(CORS、Recovery
│ api/controller 控制器层(参数校验 → 调用 Service) │
│ api/service API 服务层(业务编排 → 调用 srv 层) │
│ api/req & vo 请求模型 / 响应视图对象 │
├─────────────────────────────────────────────────────┤
│ srv/wxcore 核心实现(连接管理、请求调用器) │
│ srv/wxface 接口抽象(14 个 Interface 定义) │
│ srv/wxrouter 协议路由(微信协议命令分发) │
│ srv/wxtask 后台任务(好友、群消息、红包等) │
│ srv/websrv WebSocket 服务(实时消息推送) │
│ srv/srvconfig 全局配置管理 │
├─────────────────────────────────────────────────────┤
│ clientsdk/ 微信协议 SDK │
│ ├── request 协议请求封装(登录/消息/联系人等) │
│ ├── mmtls MMTLS 加密通信层 │
│ ├── cecdh ECDH 密钥交换 │
│ └── protocol 数据打包/解包 + CDN 协议 │
├─────────────────────────────────────────────────────┤
│ db/ 数据持久层 │
│ ├── mysql_db MySQL(用户信息、设备、授权、日志) │
│ ├── redis Redis(缓存、消息同步、代理) │
│ └── table ORM 模型定义 │
├─────────────────────────────────────────────────────┤
│ protobuf/ 微信 Protobuf 消息协议定义 │
└─────────────────────────────────────────────────────┘
```
---
## 4. API 路由模块总览
API 基于 Gin 框架,共 **13 个路由分组**,端点暴露在配置的 `apiVersion` 路径下。
| 路由组 | 路径前缀 | 功能 | 端点数 |
| ------------- | ------------ | ----------------------------------------- | ------ |
| **admin** | `/admin` | 授权码管理、代理映射 | 7 |
| **login** | `/login` | 二维码/设备/唤醒登录、验证码 | 9 |
| **equipment** | `/equipment` | 设备管理、安全信息 | 4 |
| **ws** | `/ws` | WebSocket 消息同步 | 1 |
| **message** | `/message` | 消息收发(文本/图片/视频/语音/卡片/表情) | 26 |
| **sns** | `/sns` | 朋友圈(发布/评论/点赞/时间线) | 17 |
| **group** | `/group` | 群管理(创建/邀请/踢人/公告/管理员) | 19 |
| **user** | `/user` | 用户信息修改(昵称/签名/头像/关键词回复) | 19 |
| **applet** | `/applet` | 公众号/小程序(关注/授权/文章阅读) | 12 |
| **other** | `/other` | 附近的人、步数、文件上传 | 7 |
| **favor** | `/favor` | 收藏管理 | 4 |
| **label** | `/label` | 标签管理 | 5 |
| **friend** | `/friend` | 好友管理(通讯录/搜索/加好友/删除) | 11 |
| **pay** | `/pay` | 微信支付(红包/转账/收款码) | 9 |
| **finder** | `/finder` | 视频号(搜索/关注) | 4 |
| **shop** | `/shop` | 微信小店(登录确认/扫码) | 4 |
| **qy** | `/qy` | 企业微信(联系人/群管理) | 23 |
---
## 5. 核心数据模型
### 5.1 MySQL 数据表
| 模型 | 说明 | 主键 |
| ------------------ | ---------------------------------------------- | -------------------- |
| `UserInfoEntity` | 用户信息(wxId、session、密钥、代理、状态等) | `wxId` |
| `DeviceInfoEntity` | 设备信息(IMEI、设备ID、品牌、系统、运营商等) | `wxid` |
| `LicenseKey` | 授权码(许可证、有效期、绑定微信号) | `id` (自增) |
| `UserLoginLog` | 登录日志 | `id` (自增) |
| `UserBusinessLog` | 业务行为日志 | `id` (自增) |
| `UserMessageLog` | 消息去重日志 | `user_name` |
| `Command` | 指令配置(自动回复、欢迎语、踢人关键词等) | `uuid` |
| `ModContactDB` | 联系人变更记录 | `user_uuid_combined` |
| `AddMsgDB` | 消息记录 | `msg_uuid_combined` |
| `BlackList` | 黑名单 | `id` |
| `CdnSnsImageInfo` | CDN 朋友圈图片信息 | `ImageMD5` |
### 5.2 Redis 数据结构
- 消息同步队列(`_syncMsg``_syncHttp``_wx_sync_msg_topic`
- 代理信息缓存(`wechat:Proxy:{UUID}`
- 登录状态缓存
- 消息去重缓存
---
## 6. 核心组件说明
### 6.1 wxcore - 微信核心实现
| 文件 | 大小 | 功能 |
| -------------------- | ----- | --------------------------------------------------- |
| `wxreqinvoker.go` | 222KB | **请求调用器**(199 个方法,覆盖所有微信 API 操作) |
| `wxconnect.go` | 38KB | 微信连接管理(长链接/短链接) |
| `wxcache.go` | 12KB | 连接缓存 |
| `wxconnectmgr.go` | 6KB | 连接池管理 |
| `wxfilehelpermgr.go` | 4KB | 文件辅助管理 |
| `wxusermsgmgr.go` | 3KB | 用户消息管理 |
| `wxmsghandler.go` | 3KB | 消息处理器 |
| `wxtaskmgr.go` | 2KB | 任务管理 |
| `wxsyncmgr.go` | 2KB | 消息同步管理 |
| `wxserver.go` | 2KB | 服务器实例 |
### 6.2 clientsdk - 协议 SDK
| 文件 | 大小 | 功能 |
| ------------------- | ----- | -------------------------------------------------------------- |
| `request.go` | 173KB | **核心请求封装**(146 个函数:登录、消息、联系人、群、支付等) |
| `cdnprotocol.go` | 47KB | CDN 协议(图片/视频上传下载) |
| `cdnrequest.go` | 39KB | CDN 请求实现 |
| `baserequest.go` | 29KB | 基础请求构建(Protobuf 序列化) |
| `protocol.go` | 28KB | 协议打包/解包 |
| `demo.go` | 18KB | 示例代码 |
| `oplogitem.go` | 15KB | 操作日志 |
| `hybrid_request.go` | 14KB | 混合请求 |
### 6.3 wxface - 接口抽象层
定义了 14 个接口,实现了面向接口编程的架构:
| 接口 | 说明 |
| ------------------ | -------------------------------- |
| `IWXReqInvoker` | 请求调用器接口(18KB,核心接口) |
| `IWXConnect` | 微信连接接口 |
| `IWXConnectMgr` | 连接管理器接口 |
| `IWXCache` | 缓存接口 |
| `IWXMsgHandler` | 消息处理接口 |
| `IWXRouter` | 路由接口 |
| `IWXServer` | 服务器接口 |
| `IWXSyncMgr` | 同步管理接口 |
| `IWXTaskMgr` | 任务管理接口 |
| `IWXUserMsgMgr` | 用户消息管理接口 |
| `IWXFileHelperMgr` | 文件助手接口 |
| `IWXGrabHBMgr` | 抢红包管理接口 |
| `IWXLongRequest` | 长请求接口 |
| `IWXResponse` | 响应接口 |
---
## 7. 配置系统
配置文件位于 `assets/setting.json`,主要配置项:
```json
{
"debug": false, // 调试模式
"host": "0.0.0.0", // 监听地址
"port": "7006", // 监听端口
"apiVersion": "", // API 版本路径前缀
"adminKey": "xxx", // 管理接口授权密钥
"mac2ipad": true, // Mac 转 iPad 模式
"version": "1.0.1", // 版本号
"workerpoolsize": 500, // 工作线程池大小
"maxworkertasklen": 1000, // 最大任务队列长度
"redisConfig": { ... }, // Redis 连接配置
"mySqlConnectStr": "...", // MySQL 连接字符串
"disabledCmdList": [...], // 禁用的命令列表
"dt": true // 设备令牌验证
}
```
---
## 8. 部署方案
### Docker Compose 架构
```
┌──────────────────────────────────────────┐
│ Docker Network: wx_network │
│ │
│ ┌──────────┐ ┌────────┐ ┌──────────┐ │
│ │ wxserver │→ │ redis │ │ mysql │ │
│ │ Port:5253 │ │ (AOF) │ │ 8.0 │ │
│ │ Go 1.21 │ │ │ │ utf8mb4 │ │
│ └──────────┘ └────────┘ └──────────┘ │
└──────────────────────────────────────────┘
```
- **wxserver**: Go 编译的二进制,多阶段构建(alpine),端口 5253
- **Redis**: 持久化 AOF 模式,无外部端口暴露
- **MySQL 8.0**: utf8mb4 字符集,无外部端口暴露
- **数据卷**: `assets/``static/``logs/``redis_data/``mysql_data/`
---
## 9. 依赖库概览
| 依赖 | 版本 | 用途 |
| --------------------- | ------- | --------------------- |
| `gin-gonic/gin` | v1.6.3 | HTTP 框架 |
| `jinzhu/gorm` | v1.9.11 | ORM |
| `gomodule/redigo` | v2.0.0 | Redis 客户端 |
| `go-sql-driver/mysql` | v1.8.1 | MySQL 驱动 |
| `gorilla/websocket` | v1.4.1 | WebSocket |
| `gogo/protobuf` | v1.2.2 | Protobuf 序列化 |
| `golang/protobuf` | v1.3.3 | Protobuf 工具 |
| `micro/go-micro` | v1.18.0 | 微服务框架 |
| `wsddn/go-ecdh` | - | ECDH 密钥交换 |
| `golang.org/x/crypto` | v0.28.0 | 加密扩展库 |
| `boombuler/barcode` | v1.0.0 | 条码/二维码生成 |
| `nfnt/resize` | - | 图片缩放 |
| `techoner/gophp` | v0.2.0 | PHP 序列化兼容 |
| `sirupsen/logrus` | v1.4.2 | 结构化日志 |
| `gogf/gf` | v1.12.3 | GoFrameRedis 配置) |
---
## 10. 安全与授权机制
1. **授权码系统**: `LicenseKey` 模型管理设备授权,支持按时长(日/周/月/季/半年/年/永久)
2. **AdminKey 认证**: 管理接口通过 `adminKey` 进行身份验证
3. **程序时效**: `main.go` 中硬编码了过期日期检查(2030-08-17),过期后程序自动退出
4. **MMTLS 加密**: 所有微信通信使用 MMTLS(微信自定义 TLS)加密
5. **ECDH 密钥交换**: 登录过程使用 ECDH 进行密钥协商
6. **代理支持**: 支持 SOCKS5 代理,每个账号可独立配置代理
---
## 11. 代码量统计
| 模块 | 文件数 | 主要大文件 |
| ------------ | --------- | ---------------------------------------------------- |
| `api/` | ~63 | `loginService.go` (63KB), `messageService.go` (43KB) |
| `srv/` | ~70 | `wxreqinvoker.go` (222KB), `wxnewsync.go` (51KB) |
| `clientsdk/` | ~90 | `request.go` (173KB), `cdnprotocol.go` (47KB) |
| `db/` | ~11 | `mysql_db.go` (48KB), `redisOperation.go` (18KB) |
| `protobuf/` | ~57 | Protobuf 生成代码 |
| `lib/` | 11 | 工具函数 |
| **总计** | **~300+** | |
---
## 12. 启动流程
```
main()
├── 过期检查 (2030-08-17)
├── srvconfig.ConfigSetUp() # 读取 assets/setting.json
├── db.InitDB() # 初始化 MySQL + 自动建表
├── go db.StartCleanupTask() # 启动定时清理任务
├── db.RedisSetup() # 初始化 Redis 连接池
└── api.WXServerGinHttpApiStart() # 启动 HTTP 服务
├── TLog() # 初始化日志
├── service.InitWXServerRouter() # 初始化微信协议路由
├── go InitAnewLogin() # 恢复已登录账号连接
│ ├── 清理缓存
│ ├── 查询所有用户信息
│ ├── 并发初始化已登录用户(100 并发限制)
│ └── 启动定期清理未登录连接(每 5 分钟)
├── router.SetUpRouter() # 注册 Gin 路由 + Swagger
└── app.Run() # 启动 Gin HTTP 服务器
```