博客和更新地址: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机器人相关推荐

  1. PHP开发基于Mirai的QQ机器人(一)

    基础环境的搭建 (一) 本文简介 本文讲解高效率QQ机器人框架Mirai. 本文发布于 Mirai V2 由于QQ机器人常被部署在服务器,所以我只讲解 Linux 的部署方式. 本文针对PHP开发者. ...

  2. 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)

    目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...

  3. 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)

    目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...

  4. 基于Mirai搭建QQ机器人监控B站直播

    搭建自定义Mirai机器人 周末本来想继续学Vue来着,这不又搞这个了,唉,这计划赶不上变化啊. 参考文档 mamoe/mirai: 高效率 QQ 机器人支持库 Gradle 下载的依赖jar包在哪? ...

  5. 基于Nonebot2搭建QQ机器人(一)机器人环境配置

    目录 一.Nonebot2介绍 二.Nonebot2安装 1.bot.py文件的配置 2..env文件的配置 3.env.dev文件配置 4.env.pord配置 三.go-cqhttp介绍 四.go ...

  6. Mirai框架qq机器人教程

    Mirai框架qq机器人教程 0.前言 1. 安装Java 2.安装Mirai启动器 3.下载IDEA或其他编译器 4.创建mirai-console插件项目 4.1 通过git创建 4.2 通过插件 ...

  7. 基于go-cqhttp的qq机器人

    qqrobot 基于go-cqhttp的qq机器人 环境安装 安装 python3.8以上版本 安装依赖 pip install flask pip install requests 部署方法 首先打 ...

  8. 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

    文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...

  9. 基于go-cqhttp实现QQ机器人

    前言 本篇文章原文:http://www.7yue.top/rabbitbot/ 本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现. QQ机器人RabbitBot采用pyth ...

最新文章

  1. 蛋疼的mocha库-promise异步测试
  2. uboot启动过程中关闭Caches
  3. Debian 项目不再提供 CD 格式的 ISO 镜像
  4. 用 GDI 操作 EMF 文件[6]: GetEnhMetaFileHeader - 获取 EMF 的头文件
  5. Linux SSH登陆配置文件修改
  6. easyui 控制某列显示不显示_baogaiMCU控制OLED显示屏
  7. 大型网站技术架构(一)--大型网站架构演化(转)
  8. 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
  9. Python MySQL(MySQLdb)
  10. 用Prime95来做linux下CPU压力测试
  11. 一些免费收费api收藏
  12. 关于.NET异常 你应该知道的更多点
  13. MyBatis使用Map
  14. 计算机辅助制造相关的技术,什么是PCB制造中CAM或计算机辅助制造技术?
  15. 如何修改apk服务器,如何修改apk服务器地址
  16. OSChina 周五乱弹 —— 回家切记关机
  17. 基于自适应调整权重和搜索策略的鲸鱼优化算法
  18. MOS管安全工作区SOA及根据SOA选择MOS管
  19. NASA 美国国家航空航天局开源 253 个 NASA 软件项目
  20. Java web--利用java操作excel文档

热门文章

  1. 谷歌seo工具有哪些
  2. Android 8.1 从零开始写 HAL -- (2) 实现 HAL 主体
  3. 突然断电对oracle的影响吗,当ORACLE突然断电,重新启动过程发生了哪些事?
  4. Android_个人中心_修改个人信息
  5. Linux入侵之隐藏你的踪迹
  6. ppt如何替换其他mo ban_吴军老师《P荆斩棘, P沙捡金,T纲挈领 :职场PPT制作与呈现技巧》课程大纲...
  7. 期权程序化交易接口有哪些?
  8. ES的聚合操作(API版本)
  9. HDU 6461 hzy 和zsl 的生存挑战
  10. 强化学习——day31 多臂老虎机MAB的代码实现(Python)