✨ 一个基于PHP的QQ机器人Webhook框架,支持插件扩展和Web管理后台,轻松实现多种自定义功能。
- 🔗 支持QQ开放平台Webhook接入
- 🧩 插件化架构,通过正则表达式匹配消息,便于功能扩展
- 🖥️ 内建Web管理后台:
- 📊 系统状态实时监控 (CPU, 内存, 机器人信息等)
- 📜 消息日志查看与刷新
- 🔌 插件列表与基本信息展示
- 💬 丰富的消息构造能力 (文本, 图片, 回复, Ark, Markdown, 按钮等),通过
Segment类实现 - 🔐 WebUI访问密码保护 (密码在前端进行SHA256哈希后提交)
- 📝 自动记录接收到的消息到
message.log - 🚀 简单易用,配置后快速上手
- 🐘 PHP 7.4 及以上版本
- 📦 必装PHP扩展:
curl(用于API通讯)json(通常默认启用)mbstring(用于多字节字符串处理)gd(用于MessageEvent::generateTextImage图片生成功能,如果使用到)fileinfo(用于媒体文件类型识别,例如图片上传功能)
- ⚙️ 建议开启的PHP函数:
exec(用于WebUI在Windows环境下获取更详细的系统状态如CPU/内存使用率,非必需)
- ⬇️ 克隆或下载本项目到服务器目录
- 📂 进入
config/目录,创建config.php文件 (可以参考以下结构或从config.example.php复制)。 - 📝 编辑
config/config.php文件,填写配置信息:<?php return [ 'bot' => [ 'appid' => '你的QQ机器人AppID', // 必填 'secret' => '你的QQ机器人密钥', // 必填 ], 'webui' => [ 'password' => '设置一个Web后台访问密码', // 可选,如果留空或不设置此项,则后台无需密码即可访问 ], // 图片上传配置 'image_upload' => [ 'qqbot' => [ 'channel' => '', // 子频道ID,用于QQbot图床 ], 'qqshare' => [ 'p_uin' => '', // QQ号,用于QQShare图床 'p_skey' => '', // connect.qq.com的p_skey,用于QQShare图床 ], 'bilibili' => [ 'csrf_token' => '', // bili_jct,用于B站图床 'sessdata' => '', // SESSDATA,用于B站图床 ], ], 'ffmpeg_path' => 'C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe', 'silk_v3_encoder' => 'C:\\Program Files\\ffmpeg\\bin\\silk_v3_encoder.exe', //数据库配置,用于统计bot数据 'database' => [ // 'host' => '127.0.0.1:3306', //注释此行表示不使用数据库 'dbname' => '', //数据库名 'user' => '', //数据库用户名 'password' => '', //数据库密码 'driver' => 'mysql', //可选mysql,sqlite,etc ], ];
- 🌐 在你的QQ开放平台后台,找到事件订阅(Webhook)配置,将回调地址设置为
http(s)://你的域名或IP/bot.php。 - ✅ 确保服务器的
bot.php文件可以通过公网被QQ开放平台访问,并检查Web服务器(如Nginx/Apache)配置是否正确,以及文件和目录的读写权限。 - ✍️ 确保项目根目录对于PHP进程是可写的,因为
message.log文件会自动在该目录下创建和追加。
- 启动与接收消息: 完成以上配置后,当QQ开放平台向你的回调地址推送事件时,机器人框架将自动处理。
- 访问Web管理后台:
- 在浏览器中打开
http(s)://你的域名或IP/bot.php。 - 如果设置了
webui.password,页面会提示输入密码。 - 后台提供系统状态监控、消息日志查看和已加载插件列表等功能。
- 在浏览器中打开
-
创建插件目录: 在
plugins/目录下为你的插件创建一个新目录,例如plugins/myplugin/。 -
编写主文件: 在你的插件目录中创建
main.php文件。 -
实现插件类:
- 类名应遵循
插件目录名_Plugin的格式 (例如,如果目录是myplugin,类名就是myplugin_Plugin)。 - 插件类必须实现
Plugin接口 (该接口定义在core/plugin/PluginManager.php中)。 - 实现静态方法
getRegexHandlers(),此方法返回一个数组,键是用于匹配消息内容的正则表达式,值是处理该消息的类中静态方法名。
<?php // plugins/myplugin/main.php class myplugin_Plugin implements Plugin { // 注册正则规则与对应的处理函数 public static function getRegexHandlers() { return [ '/^你好$/' => 'onHello', // 精确匹配 "你好" '/^查询\s*(.+)$/i' => 'onQuery', // 匹配 "查询 xxx" (不区分大小写) ]; } // 处理函数:当消息匹配 "/^你好$/" 时调用 public static function onHello(MessageEvent $event) { // $event 对象包含了消息的各种信息 // $event->content 是原始消息文本 // $event->sender_id 是发送者ID // $event->group_id 是群ID (如果是群消息) // 使用 Segment 类构建回复内容 $replyMessage = Segment::text('你好呀!很高兴认识你。'); $event->reply($replyMessage); // 也可以直接回复字符串,框架会自动处理为文本消息 // $event->reply('你好呀!'); } // 处理函数:当消息匹配 "/^查询\s*(.+)$/i" 时调用 public static function onQuery(MessageEvent $event) { // $event->matches 是正则表达式的匹配结果数组 // $matches[0] 是完整匹配的字符串 // $matches[1] 是第一个捕获组的内容 (即查询的关键词) $keyword = $event->matches[1]; $responseText = "正在为你查询:" . $keyword; $image = Segment::image('https://example.com/path/to/your/image.png'); // 示例图片 // 发送多段消息 $event->reply([ Segment::text($responseText), $image, Segment::text('查询结果仅供参考。') ]); } }
- 类名应遵循
-
消息处理函数:
- 处理函数必须是
public static。 - 函数接收一个
MessageEvent对象 (core/event/MessageEvent.php) 作为参数,该对象封装了接收到的消息数据和一些便捷方法。 - 使用
$event->reply($message)方法进行回复。$message参数可以是:- 一个字符串 (将作为纯文本消息发送)。
- 一个由
Segment类方法生成的单个消息段数组 (例如Segment::text('你好'))。 - 一个包含多个消息段数组的数组 (用于发送多段消息,例如
[Segment::text('第一段'), Segment::image('url')])。
- 处理函数必须是
-
使用
Segment类构造消息:Segment类 (定义于core/segment/MessageSegment.php文件中) 提供了一系列静态方法来创建不同类型的消息段,如:Segment::text(string $text): 文本消息Segment::image(string $data): 图片消息 (URL、路径或base64)Segment::reply(string $id): 回复指定消息Segment::ark(array $data): Ark 消息Segment::markdown(string|array $data): Markdown 消息Segment::button(string|array $idOrData)/Segment::keyboard(array $data): 按钮/键盘消息- 更多类型请查看
Segment类源码。
-
自动加载: 框架启动时,
PluginManager会自动扫描plugins/目录下所有符合*/main.php结构且正确实现了Plugin接口的插件,并注册它们定义的正则处理器。
LBot/
├── bot.php # Web入口文件 (Webhook处理, WebUI界面)
├── config/
│ └── config.php # 配置文件 (需用户根据说明创建和配置)
├── core/
│ ├── event/
│ │ └── MessageEvent.php # 消息事件封装与处理类
│ ├── plugin/
│ │ └── PluginManager.php# 插件加载与调度管理器
│ └── segment/
│ └── MessageSegment.php # 消息段构造类 (名为 Segment)
├── function/
│ └── Access.php # 包含 BOTAPI 等与QQ平台API交互的函数
├── plugins/ # 插件存放目录
│ └── hello/ # 示例插件 "hello"
│ └── main.php # hello插件主实现文件
├── message.log # 接收到的原始消息日志 (自动创建)
└── README.md # 本文档
- 🚫 回调地址无法访问/验证失败?
- 请检查服务器防火墙设置,确保QQ开放平台的服务器IP可以访问你的回调URL。
- 确认你的Web服务器(Nginx, Apache等)配置正确,能够将请求指向
bot.php。 - 确保域名解析正确,或IP地址可公网访问。
- ❌ 消息发送后机器人无响应?
- 仔细检查
config/config.php中的appid和secret是否从QQ开放平台正确复制。 - 登录QQ开放平台,检查机器人是否在线,以及回调地址是否配置正确且处于启用状态。
- 查看服务器的Web服务错误日志 (如 Nginx error.log, PHP-FPM error.log) 和PHP自身的错误日志,排查运行时错误。
- 检查项目根目录下的
message.log文件,确认是否有收到来自QQ平台的原始消息数据。如果日志为空或没有新消息,说明请求未到达框架。
- 仔细检查
- 🔑 忘记WebUI后台密码?
- 如果设置了
webui.password但忘记了,你需要直接编辑config/config.php文件,修改webui.password的值为新密码,或者暂时移除该行/将其值设为空字符串以取消密码验证。
- 如果设置了
- QQ群:687976465
🎉 欢迎反馈建议与贡献插件!