Files
chatrebot_aireply_plug/skills/qq-messenger/SKILL.md
root 9dff73e7bc fix: 通过本地完整测试发现的 11 个 bug
🔴 致命(5个):
- Bug1: onebot11.json 格式错误(旧 {http:{},ws:{}} → network.httpServers/httppClients)
- Bug2: 端口映射错位(WebUI 6099, OneBot API 6097 独立端口)
- Bug3: 变量名含空格 NAP CAT_HOST → NAPCAT_HOST(14脚本+2SKILL+README)
- Bug4: heredoc 单引号阻止变量展开
- Bug5: process.py 缺失 _get_high_risk_words() 方法

🟡 重要(3个):
- Bug6: onebot11.json 默认不存在(cat > 而非 edit)
- Bug7: API 须登录后才响应(新增扫码引导步骤)
- Bug8: qqrebot systemd 依赖 napcat 服务

🟢 中等(3个):
- Bug9: Skills 占位符缺 YOUR_NAPCAT_HOST sed 覆盖
- Bug10: venv 不可用需降级方案
- Bug11: 端口 25580 冲突处理
已验证全链路:NapCat + qqrebot + 插件 + OpenClaw Gateway + AI 回复
2026-05-04 19:47:26 +08:00

104 lines
4.3 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.

# qq-messenger Skill
主动向 QQ 发送消息和文件的能力。
## 原理
[qqrebot](https://jianfgit.xyz/jianf/chat_rebot-connect-with-onebot-standard-) 使用 go-cqhttp HTTP API (`send_private_msg` / `send_group_msg`) 发送消息。NapCat4 扩展支持 `upload_group_file` / `upload_private_file` 发送文件。本技能包装了这些 API 为命令行脚本,方便 qq-agent 在需要时主动推送。
## 自动回复 vs 主动发送
| | 回复场景 | 主动发信 |
|---|---|---|
| 触发 | 用户在 QQ 上发消息给你 | 你自己决定要推送 |
| 方式 | 系统自动将回复转发到 QQ | 调用本脚本 |
| 示例 | 用户问"服务器状态",你回答"正常" | 你发现磁盘快满了,主动给管理员发告警 |
**即使不调用本脚本,用户发给你的消息你回复后,系统会自动转发回 QQ。** 本脚本只用于"非回复"场景的主动推送。
## 脚本清单
| 脚本 | 用途 | 特点 |
|---|---|---|
| `qq_send_msg.py` | 发送文本消息 | 即时发送,阻塞直到返回 |
| `qq_send_file.py` | 发送文件/图片 | 异步执行,调用后立即返回,后台复制→发送→清理 |
## 用法
### 发送私聊消息
```python
import subprocess
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_msg.py",
"--private", "YOUR_ADMIN_QQ", "--message", "消息内容"], text=True, timeout=15, capture_output=True)
```
### 发送群聊消息
```python
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_msg.py",
"--group", "YOUR_GROUP_ID", "--message", "消息内容"], text=True, timeout=15, capture_output=True)
```
### 发送文件(后台发送,立即返回)
```python
import subprocess
# 私聊发文件
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_file.py",
"--private", "YOUR_ADMIN_QQ", "/path/to/file"], text=True, timeout=5, capture_output=True)
# 群聊发文件
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_file.py",
"--group", "YOUR_GROUP_ID", "/path/to/file"], text=True, timeout=5, capture_output=True)
```
**特点**:调用后立即返回(~75ms),后台独立进程处理复制→发送。完成后通过 OpenClaw Gateway 的 `/v1/chat/completions` API 发送 `[系统通知]` 消息给 qq-agent,agent 在会话历史中看到通知。
### 发送图片
```python
import subprocess
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_file.py",
"--group", "YOUR_GROUP_ID", "--image", "/tmp/screenshot.png"], text=True, timeout=5, capture_output=True)
```
**特点**:图片用 `[CQ:image]` 发送,QQ 直接显示缩略图,不会进群文件。
```python
subprocess.run(["python3", "YOUR_WORKSPACE_PATH/scripts/qq_send_file.py",
"--group", "YOUR_GROUP_ID", "--image", "/tmp/screenshot.png"], text=True, timeout=5, capture_output=True)
```
**图片说明**:用 `[CQ:image,file=...]` 发送,QQ 直接显示缩略图,不会进群文件。
## 参数说明
| 参数 | 说明 |
|---|---|
| `--private <QQ号>` | 发送私聊,默认管理员 YOUR_ADMIN_QQ |
| `--group <群号>` | 发送群聊 |
| `--message <内容>` | 消息文本(qq_send_msg.py) |
| `--file <路径>` | 从文件读消息内容(qq_send_msg.py) |
| `--auto_escape` | 转义 CQ 码(默认不转义) |
| `<文件路径>` | 要发送的本地文件路径(qq_send_file.py) |
| `--name <显示名>` | 群文件内显示的文件名(qq_send_file.py) |
| `--image` | 作为图片发送,QQ 直接显示缩略图(qq_send_file.py) |
## 通知机制
文件发送完成/失败后,后台进程通过 **OpenClaw Gateway 的 `/v1/chat/completions` API** 推送 `[系统通知]` 给 qq-agent:
- 内容格式:`[系统通知] 给uid=YOUR_ADMIN_QQ发送文件的任务已上传完毕:文件名.ext (1.0MB) ✅`
- 使用 Gateway Token 鉴权
- Fire-and-forget:`timeout=3`,仅确认投递
- 这是 openclaw_bridge 插件用的同一个 API
- agent 在自己的会话历史中看到通知
## 注意事项
1. 消息尽量简洁,QQ 消息太长可读性差
2. 不要滥用主动推送,避免打扰管理员
3. 正常回复由系统自动转发,**无需调用本脚本**
4. 连接失败时检查 go-cqhttp 是否在运行(`http://YOUR_NAPCAT_HOST:25570`)
5. 文件发送依赖 `YOUR_SHARED_DIR` 目录(映射到 NapCat 容器内 `/app/napcat/share/`)
6. 通知走 OpenClaw Gateway API,不走 QQ 本身