21 KiB
21 KiB
📋 项目结构分析报告
项目名称: 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,主要配置项:
{
"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 | GoFrame(Redis 配置) |
10. 安全与授权机制
- 授权码系统:
LicenseKey模型管理设备授权,支持按时长(日/周/月/季/半年/年/永久) - AdminKey 认证: 管理接口通过
adminKey进行身份验证 - 程序时效:
main.go中硬编码了过期日期检查(2030-08-17),过期后程序自动退出 - MMTLS 加密: 所有微信通信使用 MMTLS(微信自定义 TLS)加密
- ECDH 密钥交换: 登录过程使用 ECDH 进行密钥协商
- 代理支持: 支持 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 服务器