# 莫荷微信「按需登录」方案 (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)
