Files
AgentsMeeting/docs/WXBOT_ON_DEMAND_LOGIN.md
T
hmo 1febfd0cb5 feat: 莫荷微信按需登录——消除未登录忙循环请求腾讯的风控诱因
- init.js: DISABLE_AUTO_LOGIN=true 时不自动 bot.start(), 导出 start/stop/isRunning
- 新增 route/bot.js: POST /api/bot/login|logout, GET /api/bot/status (按需触发登录)
- login.js: bot 未运行时不展示残留二维码, 显示开始登录按钮
- wechat4u wechat.js: checkLogin 忙循环加 3s 间隔+指数退避 (原来毫秒级轰炸 login.wx.qq.com)
- puppet-wechat4u: logout 后不自动 start (原来登出即自动重登)
- 补丁脚本: deploy/linux/wxbot_on_demand_login_patch.py (可重放, 容器重建后一键恢复)
- 文档: docs/WXBOT_ON_DEMAND_LOGIN.md
- agents_health_check/self_todo_executor: 禁用 wxBotWebhook 自动重启 (重启=重登触发风控)
2026-08-14 20:39:55 +08:00

88 lines
3.8 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.
# 莫荷微信「按需登录」方案 (On-Demand Login)
> 2026-08-14 实施。目的:消除 wechat4u 因"未登录忙循环请求腾讯"导致的封号风险。
## 背景
2026-08-13 莫荷微信被微信风控("安全保护中,扫码登录受限"),限制至 2026-08-16 21:26。
根因分析:
1. **自动重启导致频繁重登**`agents_health_check.py` / `self_todo_executor.py` 检测登录异常就
`docker restart wxBotWebhook` → 重启=重登 → 08-08 单日 3 次 login → 触发风控。
(已修复:两处 fix_cmd 已置为 None,只告警不重启)
2. **未登录时忙循环请求腾讯**wechat4u 的 `bot.start()` 在容器启动时无条件执行 →
`checkLogin()` 递归无间隔 → 毫秒级轰炸 `login.wx.qq.com`,即使没人扫码也持续数小时。
这是机器人特征,微信可识别。
3. **登出后自动重登**puppet-wechat4u 在 logout 事件里自动 `wechat4u.start()` → 循环重登。
## 解决方案:按需登录
核心:**未触发登录 = 完全静默(零请求)**;点"开始登录"才请求腾讯。
| 行为 | 之前 | 现在 |
|------|------|------|
| 容器启动 | 自动 start,忙循环轮询 | 完全静默,等待 API 触发 |
| 空闲时网络请求 | 毫秒级轰炸腾讯 | **零请求**strace 验证) |
| 触发登录 | 无 | `POST /api/bot/login` |
| 登录窗口期轮询 | 忙循环(无间隔) | 3s 间隔,10 次后指数退避至 30s |
| 登出/停止 | 自动重登 | 回到静默,清空二维码 |
## 改动的容器文件
| 文件 | 改动 |
|------|------|
| `/app/src/wechaty/init.js` | `DISABLE_AUTO_LOGIN=true` 时不自动 start;导出 `start/stop/isRunning` |
| `/app/main.js` | 解构新导出 + 传 `isRunning` |
| `/app/src/route/bot.js` | **新增**`POST /api/bot/login``POST /api/bot/logout``GET /api/bot/status` |
| `/app/src/route/index.js` | 注册 bot 路由 + 传 `isRunning` |
| `/app/src/route/login.js` | bot 未运行时不展示二维码(显示"开始登录"按钮) |
| `/app/node_modules/wechat4u/lib/wechat.js` | `checkLogin` 忙循环加 3s 间隔+指数退避 |
| `/app/node_modules/wechat4u/lib/util/request.js` | UA→Chrome/126 Windows、keep-alive、补全浏览器 headers |
| `/app/node_modules/wechat4u/lib/util/global.js` | DeviceID 持久化(不再每次随机) |
| `/app/node_modules/wechaty-puppet-wechat4u/.../puppet-wechat4u.js` | logout 后不自动 start |
| `/app/.env` | `DISABLE_AUTO_LOGIN=true` |
> 注:容器内所有改动均有 `.bak` / `.orig` 备份。
> 容器由 `docker run` 启动(无 compose),重建容器后需重新打补丁。
## 使用
### 触发登录
```bash
# 获取二维码 (触发登录流程)
curl -X POST "http://192.168.1.246:3001/api/bot/login?token=mowechat_fixed_token_001"
# 或浏览器打开 (显示"开始登录"按钮, 点击触发)
# http://192.168.1.246:3001/login?token=mowechat_fixed_token_001
```
### 查询状态
```bash
curl "http://192.168.1.246:3001/api/bot/status?token=mowechat_fixed_token_001"
# → {"isLoggedIn":false,"loginUrl":"/login?token=..."}
```
### 登出回静默
```bash
curl -X POST "http://192.168.1.246:3001/api/bot/logout?token=mowechat_fixed_token_001"
```
## 重新打补丁(容器重建后)
```bash
# 在 246 上执行 (需要 docker 权限)
python3 /home/hmo/AgentsMeeting/deploy/linux/wxbot_on_demand_login_patch.py
```
脚本会:备份 → 改 10 处文件 → node --check 语法检查 → 重启容器 → 验证"等待触发登录"日志。
## 相关
- dashboard 健康检查: `http://192.168.1.246:5803` → 莫荷微信卡片 (二维码已按需显示)
- 掉线通知: `gateway/scripts/wechat_qr_notifier.py` (cron 每 30 分钟)
- 微信登录态监控: `gateway/scripts/dashboard.py` `_augment_wechat_status()`
- 自动重启已禁用: `agents_health_check.py` + `self_todo_executor.py` (fix_cmd → None)