onebot_qq 是一个基于 OneBot v11 的 QQ 机器人网关,负责把 NapCat 推送的消息转发给 GenericAgent,并把 Agent 回复发送回 QQ。
本项目的github仓库位于GA_onebot_qq,对于安装并且已经配置了GenericAgent的用户,可以直接克隆项目到GenericAgent的temp文件夹下,或者让GA仔细阅读部署教程—SOP进行完成项目克隆,配置并且安装napcat
- 支持私聊与群聊,可配置群聊触发模式(必须
@/ 任意消息 / 触发词)。 - 支持图片/语音/文件附件保存,并把附件类型与路径传给 Agent。
- 支持管理员与普通用户身份区分,并可按需注入权限策略提示词。
- 支持按用户排队处理消息,避免并发上下文串扰。
- 支持把触发消息前的最近
n条消息作为上下文传给 GA(n=0关闭)。 - 支持断线自动重连,支持 token 鉴权。
- 支持 Windows / Linux 双平台运行(含
.venv路径自动兼容)。
onebot_qq/
├─ src/
│ ├─ main.py # 启动入口
│ ├─ onebot_app.py # 主流程编排(连接、事件分发、队列)
│ ├─ onebot_message.py # 消息解析、@处理、提示词构建
│ ├─ onebot_attachment.py # 附件下载/保存(image, record, file)
│ ├─ onebot_ws.py # WS URL 规范化、token URL 拼接
│ ├─ onebot_async.py # Python 3.8+ 线程兼容工具
│ ├─ onebot_config.py # .env 与运行配置加载
│ ├─ onebot_state.py # 运行时状态
│ └─ onebot_paths.py # GenericAgent 路径注入
├─ .env.example
├─ .env.example-en
├─ .env
└─ README.md
- 必须放在
GenericAgent/temp目录下运行(依赖agentmain.py路径注入)。 - Python 3.8+。
- 支持系统:Windows / Linux(代码已兼容两端路径差异)。
- 安装依赖:注意可以和GenericAgent使用同一个虚拟环境则不再需要安装额外的依赖即可以跳过下面的一步,但是如果发现运行缺失库需要手动或者让GA进行安装
pip install -r requirements.txt- 进入项目目录:
# Windows
cd D:\GenericAgent\temp\onebot_qq
# Linux
cd ~/GenericAgent/temp/onebot_qq- 复制配置模板:
# Windows
copy .env.example .env
# Linux
cp .env.example .env如需英文注释模板,可使用:
# Windows
copy .env.example-en .env
# Linux
cp .env.example-en .env-
修改
.env(至少确认ONEBOT_WS_URL;建议确认ONEBOT_GROUP_REQUIRE_AT、ONEBOT_GROUP_TRIGGER_WORDS、ONEBOT_CONTEXT_MESSAGES)。 -
在 NapCat 中启用 OneBot v11 WebSocket(见下一节)。
-
启动:
# Windows
python src/main.py
# Linux(若系统默认 python 指向 Python2,请使用 python3)
python3 src/main.py建议使用 OneBot v11 正向 WS(NapCat 作为 WS 服务端,本项目作为客户端连接)。
- 推荐地址:
ws://127.0.0.1:8080/onebot/v11/ws - 若你在 NapCat 配置了
access_token,请保证与.env中ONEBOT_ACCESS_TOKEN完全一致。 - 建议消息格式设为
array(本项目对string/array都兼容,但array更稳定)。
如果你看到日志提示 token 验证失败(如 retcode=1403),优先检查 token 是否一致。
以下以 正向 WS 为例(推荐):
- 启动 NapCat,并登录你的 QQ 机器人账号。
- 打开 NapCat WebUI(通常是
http://127.0.0.1:6099,也可能以控制台输出为准)。 - 进入网络/适配器配置,找到 OneBot v11。
- 启用 WebSocket 服务端(正向 WS)。
- 配置监听参数:
host:127.0.0.1port:8080(或你自定义端口)path:/onebot/v11/ws
- 配置
access_token(可选):- 如果设置了 token,必须与
.env的ONEBOT_ACCESS_TOKEN完全一致。 - 如果不设置 token,
.env里也留空。
- 如果设置了 token,必须与
- 消息格式建议设为
array。 - 保存配置并确认 OneBot 服务已启用。
- 回到本项目,确保
.env:ONEBOT_WS_URL=ws://127.0.0.1:8080/onebot/v11/wsONEBOT_ACCESS_TOKEN=<与你在 NapCat 填的一致>
- 启动
python src/main.py
- 私聊机器人一句话,确认有回复。
- 群里发一句话,按你的触发策略验证可回复(
@/ 触发词 / 任意消息)。 - 发一张图/一段语音/一个文件,确认
data/image|record|file有落盘。 - 若失败,先看
temp/onebot_YYYYMMDD_HHMMSS.log是否出现retcode=1403或连接拒绝(每次启动会生成新的时间戳日志)。
| 键 | 默认值 | 必填 | 说明 |
|---|---|---|---|
ONEBOT_WS_URL |
ws://127.0.0.1:8080/onebot/v11/ws |
是 | NapCat OneBot WS 地址。若只填到端口,程序会自动补 /onebot/v11/ws。 |
ONEBOT_ADMIN_QQ |
空 | 建议 | 管理员 QQ,多个用逗号分隔。 |
ONEBOT_ALLOWED_USERS |
* |
否 | 允许使用的用户列表;* 表示全部。管理员总是放行。 |
ONEBOT_ALLOW_GROUP |
1 |
否 | 是否启用群聊消息处理。 |
ONEBOT_ALLOWED_GROUPS |
* |
否 | 允许处理的群号列表;* 表示全部群。 |
ONEBOT_GROUP_REQUIRE_AT |
空 | 否 | 群聊触发模式。1/true=需 @(触发词也可触发);0/false/空=任意消息可触发。 |
ONEBOT_GROUP_TRIGGER_WORDS |
空 | 否 | 群聊触发词,逗号分隔,命中任一即可触发回复。 |
ONEBOT_CONTEXT_MESSAGES |
0 |
否 | 向 GA 传递触发前历史消息条数。0 关闭,最大 20。 |
ONEBOT_ACCESS_TOKEN |
空 | 按需 | NapCat WS token。设置后会同时用于 Header 与 URL query。 |
ONEBOT_PLAIN_TEXT_HINT |
内置提示 | 否 | 附加给 Agent 的文本提示。设为 0/false/off 可关闭。 |
ONEBOT_MAX_MSG_LENGTH |
500 |
否 | 单条消息最大长度。 |
ONEBOT_MAX_QUEUE_SIZE |
5 |
否 | 每个用户的待处理队列上限。 |
ONEBOT_DATA_DIR |
data |
否 | 附件保存目录。相对路径基于当前运行目录解析。 |
ONEBOT_MAX_FILE_BYTES |
10485760 |
否 | 单附件最大字节数(默认 10MB)。 |
-
仅
@机器人才回复(群内更克制)ONEBOT_GROUP_REQUIRE_AT=1ONEBOT_GROUP_TRIGGER_WORDS=ONEBOT_CONTEXT_MESSAGES=0
-
任意群消息都可触发(测试联调常用)
ONEBOT_GROUP_REQUIRE_AT=(留空)ONEBOT_GROUP_TRIGGER_WORDS=ONEBOT_CONTEXT_MESSAGES=0
-
@或触发词触发,并附带最近 3 条上下文(推荐)ONEBOT_GROUP_REQUIRE_AT=1ONEBOT_GROUP_TRIGGER_WORDS=小宇,助手,botONEBOT_CONTEXT_MESSAGES=3
- 支持段类型:
image、record、file。 - 保存路径:
data/imagedata/recorddata/file
- 下载源优先级:
data.url(http/https)- 本地
data.path或本地data.file base64://...或data:...;base64,...
- 成功保存后会把附件信息注入提示词,格式如下:
attachment1: type=image path=D:\...\data\image\xxx.jpg size=123KB
# Linux 示例:
# attachment1: type=image path=/home/you/GenericAgent/temp/onebot_qq/data/image/xxx.jpg size=123KB
- 当配置了
ONEBOT_ADMIN_QQ时,网关会识别管理员/非管理员身份并写入提示词。 - 当
ONEBOT_ADMIN_QQ为空时,不向 GA 注入管理员相关策略提示词。 - 非管理员请求文件级/进程级/硬件级操作时,期望 Agent 拒绝并提示联系管理员。
- 入口层不做危险关键词硬拦截,避免误伤正常对话。
启动后建议按顺序验证:
- 私聊发送文本,确认可回复。
- 群聊发送文本,按当前触发配置验证可回复。
- 发送图片/语音/文件,确认
data/*有落盘文件。 - 查看回复内容,确认 Agent 能看到附件路径信息。
- 检查 NapCat 是否启动并开启 OneBot WS。
- 检查
ONEBOT_WS_URL的 host/port/path。
- 检查 NapCat token 与
ONEBOT_ACCESS_TOKEN是否一致。
- 若
ONEBOT_GROUP_REQUIRE_AT=1,确认消息有@机器人或命中触发词。 - 若希望任意群消息都触发,设置
ONEBOT_GROUP_REQUIRE_AT=(留空)或0。 - 确认
ONEBOT_ALLOW_GROUP=1。 - 确认群号在
ONEBOT_ALLOWED_GROUPS(或使用*)。
- 检查 NapCat 上报段是否包含
url/path/file/base64中至少一种可用来源。 - 检查
ONEBOT_MAX_FILE_BYTES是否过小。
- 已兼容
additional_headers/extra_headers差异。 - 仍有问题时,建议升级
websockets到较新版本后重试。
- 若
ONEBOT_ADMIN_QQ留空,网关不会向 GA 注入管理员策略提示词(这是当前设计)。 - 如需启用该策略,请给
ONEBOT_ADMIN_QQ配置至少一个管理员 QQ。
- 优先确认是否在
GenericAgent的虚拟环境中运行。 - 已兼容
.venv/Lib/site-packages(Windows)和.venv/lib/python*/site-packages(Linux)自动注入。
- 本项目与 GenericAgent 紧耦合,建议固定在
GenericAgent/temp/onebot_qq下运行。 - 若需二次开发,优先在
onebot_message.py(提示词策略)和onebot_attachment.py(附件策略)扩展。