轻量、快速、优雅的 QQ 官方机器人框架,使用 AppID + AppSecret 接入
环境要求:Node.js 20+,npm。
npm install
npm run init
npm run devnpm run init 会交互式创建或更新根目录的 config.json,可填写 QQ 官方机器人的 appID、appSecret、插件列表、管理员 ID 和 Web 管理台 token。config.json 默认不提交,避免把密钥带进 Git。首次使用建议至少填写一个 ownerIds 或 adminIds。
编译运行:
npm run build
npm startQingBot 读取根目录的 config.json,仓库里的 config.example.json 是模板:
{
"appID": "YOUR_QQ_BOT_APP_ID",
"appSecret": "YOUR_QQ_BOT_APP_SECRET",
"sandbox": false,
"botName": "QingBot",
"debug": false,
"removeAt": true,
"plugins": ["ping"],
"web": {
"enabled": true,
"host": "127.0.0.1",
"port": 3300,
"token": ""
},
"ownerIds": [],
"adminIds": [],
"allowPublicControl": false,
"aliases": {
"users": {},
"groups": {}
},
"legacyIdMode": "alias",
"intents": ["GROUP_AND_C2C_EVENT"]
}常用项:
ownerIds/adminIds:管理命令权限。allowPublicControl:没有管理员时是否允许公开控制,默认false;仅建议在完全隔离的本地测试环境临时设为true。plugins:启用插件,数组项是插件目录名。pluginDir:插件目录,默认plugins,可指向外部私有插件目录。web.token:Web 管理台访问令牌;未设置时 API 只接受本机访问。aliases:旧 QQ 号到官方openid/group_openid的映射。
高级接入项按需配置:logLevel、accessTokenUrl、gatewayUrl、timeout、maxRetry、heartbeatInterval、maxRetries、reconnectDelay。通常不需要改。
已有 config.json 时再次运行 npm run init 会以当前配置作为默认值,按回车即可保留。可选本地覆盖文件:config.local.json。它会合并覆盖根 config.json,适合放本机密钥或个人调试项。
聊天里可用:
ping
#菜单
#帮助
#插件 列表
#插件 启用 插件名
#插件 禁用 插件名
#状态
#重载
#插件 重载
#插件 重载 ping
#关机
#菜单 / #帮助 是内置菜单;#插件 列表 会显示插件目录下所有插件,包括尚未启用的插件。
#插件 启用 插件名 / #插件 禁用 插件名 会写入提供 plugins 数组的配置文件:如果 config.local.json 覆盖了插件列表就写它,否则写根 config.json。
改插件代码后用 #插件 重载 插件名;改 config.json 或插件配置后用 #重载。
改 appID、appSecret、sandbox、intents、QQ 连接高级项、web.enabled、web.host、web.port 后需要重启进程。
启动后打开:
http://127.0.0.1:3300
可查看状态、启用/禁用/重载插件、编辑配置、查看收发消息、手动发送消息、模拟插件对话、重载配置和关闭进程。
配置页可以管理:
config.json:主配置。config.local.json:本地覆盖配置。plugins/<name>/config.json:插件配置。
点击“保存”只写入文件;点击“保存并重载”会保存后执行一次配置重载。web.token 保存并重载后会用于后续 Web API;监听地址、端口和 QQ 协议连接参数仍需重启进程。
公网部署最佳实践:
- 默认保持
web.host为127.0.0.1,用 SSH 隧道、内网 VPN、Tailscale 或 Cloudflare Zero Trust 访问。 - 不要把未设置
web.token的管理台通过 Nginx/Caddy 等反代暴露到公网。 - 如果必须公网访问,设置足够长的随机
web.token,反代只走 HTTPS,并额外加访问控制或 IP 白名单。 - 防火墙不要放开
3300直连端口;让管理台只被受控入口访问。 - 安全问题和凭据泄露处理见
SECURITY.md。
本地检查:
npm run check
npm audit默认只带 ping 这个最小演示插件。自己的插件放在插件目录中,并用 #插件 启用 插件名 或根配置 plugins 数组启用。插件如需释放定时器、连接等资源,可实现 dispose(ctx)。
插件可以有自己的配置文件:
plugins/my-plugin/config.json
插件如果需要额外 npm 包,可以在插件目录放自己的 package.json 并单独安装:
npm install --prefix plugins/my-pluginQingBot 会在启动和管理台插件页检测插件依赖;必需依赖缺失时不会加载该插件,并会提示缺失包和当前运行目录对应的安装命令。npm run dev 使用 plugins/<name>,npm start 使用编译后的 dist/plugins/<name>,按提示命令安装即可。
插件内直接读取当前插件配置:
import { definePlugin } from 'qingbot'
type MyConfig = {
enabled: boolean
prefix: string
}
export default definePlugin<MyConfig>({
name: 'my-plugin',
setup(ctx) {
const config = ctx.getConfig<MyConfig>({
enabled: true,
prefix: '#my',
})
ctx.command(`${config.prefix} ping`, async (event) => {
if (config.enabled) await event.reply('pong')
})
},
})可用配置 API:
ctx.config:当前插件的config.json内容。ctx.getConfig<T>(fallback):合并默认值后的当前插件配置。ctx.configPath/ctx.pluginDir:当前插件配置文件和目录路径。ctx.saveConfig(config)/ctx.updateConfig(patch):保存当前插件配置,并同步更新ctx.config。ctx.rootConfig:根目录config.json的机器人配置。ctx.command(command, fn):监听精确文本命令,默认忽略大小写并去掉首尾空白。ctx.handle(event, fn)/ctx.on(event, fn):监听消息、通知等事件。ctx.segment:QQ 官方消息段工厂。ctx.markdown(content)/ctx.replyMarkdown(event, content):创建或回复 Markdown 消息。ctx.bot.group(id).send(message)/ctx.bot.user(id).send(message):主动发送消息,自动应用 ID alias。
本地生成的数据建议放在插件目录的 data/ 或 .state/ 中,这两个目录默认不会提交。
更多事件名、消息段和主动发送示例见 plugins/README.md。
ISC