Files
gitlab-instance-0a899031_ch…/README.md
2026-03-31 11:21:17 -05:00

200 lines
4.0 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.
# chatbot微信对话回调服务
本项目是一个基于 FastAPI 的微信对话开放平台回调服务,核心目标是:
- 接收并解密公众号私信回调(接口 A
- 根据关键词回复用户(支持 H5 卡片)
- 后台触发抓包接口 B 获取会话列表
- 将用户资料同步到 PocketBase
---
## 一、当前实现状态
### 1) 回调入口(接口 A
- 支持 `POST /`
- 支持 `POST /wechat/thirdapi`
- 支持加密请求体解析
- 支持解密后明文为 JSON / XML 两种格式
### 2) 关键词回复
内置规则:
- 包含 `电子书`返回“数字游民”H5 内容
- 包含 `群`返回“异度星球”H5 内容
- 其他内容:返回默认引导文案
### 3) 接口 B抓包
用于拉取会话列表(数据同步用途):
- `https://chatbot.weixin.qq.com/miniopenai/manualservice/getaccessstautuslist`
### 4) PocketBase 同步
将用户资料写入 `wechat_private_users`,字段包含:
- `userid`
- `channel_id`
- `nick`
- `avatar`
- `source_query`
- `source_message_id`
- `source_message_time`
- `matched_last_msg`
- `matched_last_msg_id`
- `matched_last_msg_time`
- `raw_contact`
---
## 二、项目结构
```text
chatbot/
├── main.py # 回调主流程、关键词逻辑、B同步、PB写库、调试接口
├── crypto_utils.py # AES加解密、签名
├── config.py # 应用配置A/B/PB
├── run.py # 启动入口8001
├── requirements.txt # 依赖
└── README.md
```
---
## 三、快速启动
### 1) 安装依赖
```bash
pip install -r requirements.txt
```
### 2) 启动
```bash
python run.py
```
默认端口:
- `http://0.0.0.0:8001`
---
## 四、配置说明config.py
### 1) 接口 A 配置
- `APP_ID`
- `TOKEN`
- `ENCODING_AES_KEY`
这些值必须与微信对话平台后台一致。
### 2) PocketBase 配置
- `PB_URL`
- `PB_ADMIN_EMAIL`
- `PB_ADMIN_PASSWORD`
- `PB_COLLECTION`
当前策略:
- Windows 本地调试默认使用 `PB_DOMAIN_URL`
- 非 Windows 默认使用 `PB_INTERNAL_URL`
- 若设置环境变量 `PB_URL`,优先使用环境变量
### 3) 接口 B 配置
- `PM_SYNC_AUTHTOKEN`
- `PM_SYNC_DEFAULT_WXBOT_BID`
说明B 是后台同步数据源,不影响 A 主回复链路。
---
## 五、回调处理流程
1. 微信平台回调到 A`/``/wechat/thirdapi`
2. 服务端读取 body 并解密
3. 解析为统一字段(`UserId``Query``Timestamp` 等)
4. 关键词命中后生成回复内容
5. 主流程优先返回(保证用户体验)
6. 后台异步触发 B 接口
7. 匹配用户并同步到 PocketBase
---
## 六、接口清单
### 1) 业务接口
- `POST /`
- `POST /wechat/thirdapi`
### 2) 调试接口
- `GET /health`
- `GET /debug/echo`
- `POST /debug/sync-test`
### 3) 调试页面
- `GET /private-message`
用于测试 B 查询、Token 分析、用户列表展示。
---
## 七、PocketBase 集合建议
集合名:`wechat_private_users`
建议索引:
- `userid + channel_id` 组合索引
-`source_message_id` 唯一索引(若来源稳定唯一)
---
## 八、常见问题排查
### Q1回调收到了但用户没看到回复
- 检查 `APP_ID/TOKEN/ENCODING_AES_KEY` 是否和后台一致
- 检查回调 URL 是否为当前服务地址
- 查看日志中是否有解密失败/解析失败
### Q2B 接口正常PB 失败
通常是 PB 地址或认证路径问题:
- 已兼容 `/api/admins/auth-with-password`
- 已兼容 `/api/collections/_superusers/auth-with-password`
### Q3B 或 PB 失败会不会影响用户回复
不会。当前设计是:
- 关键词回复优先
- B/PB 为后台任务,失败只记日志
---
## 九、参考文档
- 微信开放文档(发送客服消息):
<https://developers.weixin.qq.com/doc/aispeech/confapi/thirdkefu/sendmsg.html>
---
## 十、后续优化建议
- 将关键词规则做成数据库配置化
- 增加持久化幂等(避免服务重启后重复处理)
- 增加结构化日志和告警
- 将敏感配置迁移到环境变量统一管理