PHP开发基于Mirai的QQ机器人
博客和更新地址:PHP开发基于Mirai的QQ机器人
前言
在完成配置开源安卓QQ协议库Mirai后,便可使用已有开源项目来部署自己的QQ机器人,但自行开发显然更符合需求。借助mirai-api-http插件提供的接口,可以很方便的开发机器人,开发语言根据自己的意愿选择即可,这里以PHP为例。
配置Mirai-Api-Http插件
mirai-api-http插件将mirai-core-api的所有功能封装为http服务,提供的HTTP接口供所有语言使用mirai,从而大大的降低了开发门槛,使得开发QQ机器人更加容易和灵活。
关于mirai-api-http在Mirai生态中的作用可以看官方的Mirai生态介绍文档,文档详细介绍了Mirai的生态中各个框架和应用的关系,相信读完后会对Mirai生态有更为清晰的了解。
如使用Mirai Console Loader启动mirai的话,可直接在mirai所在根目录执行
./mcl --update-package net.mamoe:mirai-api-http --channel stable --type plugin
注意!以上方法下载的mirai-api-http插件为最新版2.x,2.x的api有所改动,本文章仅适合1.x版本,需手动下载!!!
请在Releases页面使用1.x的最新版,下载mirai-api-http-v1.xx.x.mirai.jar放入’pulgins’文件夹内。
如果已经使用了以上方法下载了2.x版本,请输入以下命令卸载:
.\mcl --remove-package net.mamoe:mirai-api-http
将1.x版本的’mirai-api-http’放入’pulgins’文件夹后输入./mcl
启动mirai,启动完成后会在"config/net.mamoe.mirai-api-http"目录下生成配置文件"setting.yml",此时输入stop
停止mirai,编辑该配置文件
# CORS跨域域名配置,默认允许所有域名
cors: - '*'
# 地址,一般不需要改
host: 0.0.0.0
# 使用端口
port: 8080
# 认证Key
authKey: xxxxxxxxxx
# 缓存大小
cacheSize: 4096
# 是否开启websocket
enableWebsocket: false
# 消息上报配置
report: # 总开关enable: true# 群消息上报groupMessage: report: true# 好友消息上报friendMessage: report: true# 临时消息上报tempMessage: report: true# 事件上报eventMessage: report: true# 上报URLdestinations:- 'https://xxx.xxx.xxx'# 上报时的额外HeaderextraHeaders:xxxxxx: xxxxxx## 心跳(即每隔一段时间上报消息表明插件工作状态)
heartbeat: # 总开关enable: false# 启动延迟delay: 10# 心跳间隔period: 15# 心跳上报URLdestinations: []# 上报时的额外信息extraBody: {}# 上报时的额外头extraHeaders: {}
注释中已包含对参数的说明,更详细的说明参考官方文档。其中"authKey"是与mirai-api-http接口认证的重要参数,"消息上报"是实现与QQ机器人互动的重要功能,"上报URL"是当消息上报时的上报地址,注意开放相应端口,配置完成后保存文件并重启mirai。
PHP实现QQ机器人
完成mirai-api-http插件配置后就能使用其提供的接口,通过向指定接口发送特定请求便能实现想要的操作,具体参考接口的详细文档。
使用PHP开发首先需要能运行PHP的环境(以下代码需要PHP7以上),这里不多赘述。然后在Web服务器监听目录下新建文件Bot.class.php,编辑该文件
<?phpnamespace Mirai;use Exception;/*** Mirai QQ机器人* @param string $_url MiraiHTTP接口地址* @param string $_authKey Mirai认证Key* @param string $_sessionKey Mirai会话Key*/
class Bot
{private $_url;private $_authKey;private $_sessionKey;/*** 构造函数 * @param string $url MiraiHTTP接口地址* @param string $authKey Mirai认证Key*/function __construct(string $url, string $authKey){$this->_url = $url;$this->_authKey = array('authKey' => $authKey);}/*** cURL获取数据* @param string $url 发送请求的链接* @param int $ifPost 是否为post请求(1||0)* @param mixed $postFields post的数据* @param string $cookie 发送请求携带的cookie* @param mixed $cookieFile cookie文件* @param int $ifHeader 是否获取响应头信息(1||0)* @throws Exception 请求失败* @return mixed 响应结果*/public function httpRequest(string $url, int $ifPost = 0, $postFields = '', string $cookie = '', $cookieFile = '', int $ifHeader = 0){// 模拟http请求header头$header = array("Connection: Keep-Alive","Accept: text/html, application/xhtml+xml, */*","Pragma: no-cache","Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3","User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");// 初始化一个cURL会话$ch = curl_init();// 设置cURL传输选项curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, $ifHeader);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);$ifPost && curl_setopt($ch, CURLOPT_POST, $ifPost);$ifPost && curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$cookie && curl_setopt($ch, CURLOPT_COOKIE, $cookie); // 发送cookie变量$cookieFile && curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 发送cookie文件$cookieFile && curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 写入cookie到文件curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 允许执行的最长秒数curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);// 执行cURL会话$result = curl_exec($ch);// 失败则抛出异常if ($result === false) {throw new Exception('Sending request to ' . $url . ' failed!');}// 关闭 cURL 会话curl_close($ch);// 释放$chunset($ch);return $result;}/*** 进行认证* @throws Exception 认证失败* @return bool*/public function auth(): bool{$url = $this->_url . '/auth';$postData = json_encode($this->_authKey);$response = json_decode($this->httpRequest($url, 1, $postData));if ($response !== false && $response->code === 0) {$this->_sessionKey = $response->session;return true;} else {throw new Exception('Mirai authentication failed!'); }}/*** 校验Session* @param int $qq Session将要绑定的Bot的qq号* @throws Exception 校验Session失败* @return bool*/public function verify(int $qq): bool{$url = $this->_url . '/verify';$postData = json_encode(array('sessionKey' => $this->_sessionKey,'qq' => $qq));$response = json_decode($this->httpRequest($url, 1, $postData));if ($response !== false && $response->code === 0) {return true;} else {throw new Exception('Validation session failed!' . 'The qq is ' . $qq . '.'); }}/*** 释放Session* @param int $qq 与该Session绑定Bot的QQ号码* @throws Exception 释放Session失败* @return bool*/public function release(int $qq): bool{$url = $this->_url . '/release';$postData = json_encode(array('sessionKey' => $this->_sessionKey,'qq' => $qq));$response = json_decode($this->httpRequest($url, 1, $postData));if ($response !== false && $response->code === 0) {return true;} else {throw new Exception('Failed to release session! The qq is ' . $qq . '!'); }}/*** 发送好友消息* @param int $qq 发送消息目标好友的QQ号* @param array $messageChain 消息链,消息对象构成的数组* @param int $quote 回复消息的messageId* @throws Exception 发送好友消息失败 * @return int messageId 可引用进行回复*/public function sendFriendMessage(int $qq, array $messageChain, $quote = null): int{$url = $this->_url . '/sendFriendMessage';$postData = json_encode(array('sessionKey' => $this->_sessionKey,'target' => $qq,'quote' => $quote,'messageChain' => $messageChain));$response = json_decode($this->httpRequest($url, 1, $postData));if ($response !== false && $response->code === 0) {return $response->messageId;} else {throw new Exception('Failed to send friend message to qq:' . $qq . '!'); }}
}
该类的方法实现了mirai-api-http所提供功能的一部分,包括认证身份、校验Session、释放Session和发送好友消息。其中属性"_authKey"便是插件配置文件中的"authKey",重要参数和功能已在注释中说明,编辑完成后保存文件。
在相同目录下新建文件index.php,编辑该文件
<?phpnamespace Mirai;use Exception;// 包含bot类
include_once("./Bot.class.php");// 实例化一个bot
$bot = new Bot('MiraiHTTPAPI地址', 'Mirai认证Key');// 机器人QQ
$botQQ = xxxxxxxxxx;
// 消息链
$message_chain = array(array('type' => 'Plain','text' => 'HelloWorld!')
);
// 发送消息的目标QQ
$targetQQ = xxxxxxxxx;try {// 进行认证$bot->auth();// 校验Session$bot->verify($botQQ);// 发送该消息$bot->sendFriendMessage($targetQQ, $message_chain);// 释放Session$bot->release($botQQ);
} catch (Exception $e) {// 输出错误信息echo $e->getMessage().' At file:'.$e->getFile().' on line:'.$e->getLine().'.';// 发生异常时记录日志error_log($e->getMessage() . ' At file:' . $e->getFile() . ' on line:' . $e->getLine() . '.');
}
以上代码实例化了一个Bot并向指定QQ好友发送了消息"HelloWorld!",其中重要参数已在注释中说明。替换其中的“接口地址、认证Key、机器人QQ、目标QQ“,然后访问一次该文件,即可向指定QQ好友发送消息"HelloWorld!"。
完成以上实例就已经可以根据自己的需求开发QQ机器人了,仔细阅读API文档根据需求开发即可。
聊天机器人实例
这是一个QQ(智能)聊天机器人的实例,为了控制文章篇幅,实例转到地址:QQ聊天机器人实例
相关资料
基于Mirai的QQ机器人方案
开发 mirai QQ机器人起步教程
mirai-api-http文档参考
Mirai 生态中各个框架和应用的关系
最后
新手上路,如有错误请多指教。
PHP开发基于Mirai的QQ机器人相关推荐
- PHP开发基于Mirai的QQ机器人(一)
基础环境的搭建 (一) 本文简介 本文讲解高效率QQ机器人框架Mirai. 本文发布于 Mirai V2 由于QQ机器人常被部署在服务器,所以我只讲解 Linux 的部署方式. 本文针对PHP开发者. ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)
目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)
目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...
- 基于Mirai搭建QQ机器人监控B站直播
搭建自定义Mirai机器人 周末本来想继续学Vue来着,这不又搞这个了,唉,这计划赶不上变化啊. 参考文档 mamoe/mirai: 高效率 QQ 机器人支持库 Gradle 下载的依赖jar包在哪? ...
- 基于Nonebot2搭建QQ机器人(一)机器人环境配置
目录 一.Nonebot2介绍 二.Nonebot2安装 1.bot.py文件的配置 2..env文件的配置 3.env.dev文件配置 4.env.pord配置 三.go-cqhttp介绍 四.go ...
- Mirai框架qq机器人教程
Mirai框架qq机器人教程 0.前言 1. 安装Java 2.安装Mirai启动器 3.下载IDEA或其他编译器 4.创建mirai-console插件项目 4.1 通过git创建 4.2 通过插件 ...
- 基于go-cqhttp的qq机器人
qqrobot 基于go-cqhttp的qq机器人 环境安装 安装 python3.8以上版本 安装依赖 pip install flask pip install requests 部署方法 首先打 ...
- 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学
文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...
- 基于go-cqhttp实现QQ机器人
前言 本篇文章原文:http://www.7yue.top/rabbitbot/ 本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现. QQ机器人RabbitBot采用pyth ...
最新文章
- 蛋疼的mocha库-promise异步测试
- uboot启动过程中关闭Caches
- Debian 项目不再提供 CD 格式的 ISO 镜像
- 用 GDI 操作 EMF 文件[6]: GetEnhMetaFileHeader - 获取 EMF 的头文件
- Linux SSH登陆配置文件修改
- easyui 控制某列显示不显示_baogaiMCU控制OLED显示屏
- 大型网站技术架构(一)--大型网站架构演化(转)
- 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
- Python MySQL(MySQLdb)
- 用Prime95来做linux下CPU压力测试
- 一些免费收费api收藏
- 关于.NET异常 你应该知道的更多点
- MyBatis使用Map
- 计算机辅助制造相关的技术,什么是PCB制造中CAM或计算机辅助制造技术?
- 如何修改apk服务器,如何修改apk服务器地址
- OSChina 周五乱弹 —— 回家切记关机
- 基于自适应调整权重和搜索策略的鲸鱼优化算法
- MOS管安全工作区SOA及根据SOA选择MOS管
- NASA 美国国家航空航天局开源 253 个 NASA 软件项目
- Java web--利用java操作excel文档
热门文章
- 谷歌seo工具有哪些
- Android 8.1 从零开始写 HAL -- (2) 实现 HAL 主体
- 突然断电对oracle的影响吗,当ORACLE突然断电,重新启动过程发生了哪些事?
- Android_个人中心_修改个人信息
- Linux入侵之隐藏你的踪迹
- ppt如何替换其他mo ban_吴军老师《P荆斩棘, P沙捡金,T纲挈领 :职场PPT制作与呈现技巧》课程大纲...
- 期权程序化交易接口有哪些?
- ES的聚合操作(API版本)
- HDU 6461 hzy 和zsl 的生存挑战
- 强化学习——day31 多臂老虎机MAB的代码实现(Python)