吾爱乐享
个人学习网站

茉莉QQ机器人3.X系列插件开发文档

此插件开发文档适用于茉莉QQ机器人3.X系列版本


插件需要确定的信息:

1、确定插件的名字/类文件的类名/作者/指令/说明/是否监控所有消息等等


2、确定插件的类型,插件要处理哪些消息

插件的基本构成:

1、插件的类文件(必须继承AbstractpluginHandler类,并且类中必须有main方法,main方法是插件的入口方法;类文件命名基本格式:WebxxxxHandler.php,去除文件名后缀部分必须跟插件的类名相同


2、创建插件相关信息的sql文件(sql文件名必须是web.sql创建插件基本信息的SQL语句都可以放在这个文件里,安装时会自动执行这个sql文件里面的SQL语句)

3、卸载插件时执行的sql文件(
sql文件名必须是unweb.sql),这个是从3.1版本之后才加入的,这个文件可有可无,如果存在,那么插件卸载时会执行里面的sql语句

安装插件的3种方式:

1、在插件大全里面安装,如果你的空间支持ZIP解压和在线下载,那么这是最简便的安装方式,可以直接安装

2、本地安装:把插件压缩包上传到plugin目录,然后访问本地安装,就可以了,最好给压缩包赋予可写(777文件权限)权限后再安装,当然这种方式需要空间支持ZIP解压

3、检测安装:新建一个文件夹(插件压缩包的名字去掉Web开头,去掉Handler结尾,比如插件压缩包文件名是WebjokeHandler.zip,那么新建的文件夹名是joke),然后把插件压缩包解压后的所有文件复制到这个文件夹,之后把文件夹上传到plugin目录,也给这个文件夹和这个文件夹所有的文件赋予可写权限,然后访问检测安装

处理消息的流程:

怎个流程可以分为机器人系统和插件系统,机器人系统会不断的向腾讯发送接口请求,从而不断的获取QQ消息,这些特定消息(群消息、好友消息和加群验证消息)都会在插件系统里跑一遍,然后根据处理结果让机器人系统是否做出响应


其它说明:

1、是否监控所有消息:这个表示是否所有的QQ消息都经过这个插件的main方法,在开发一个插件之前,我们可以根据插件的作用定义它是否需要监控所有消息
比如开发一个笑话插件,插件有3个指令,分别是笑话冷笑话暴走笑话,那么这个插件只需要处理笑话冷笑话暴走笑话这3个消息就可以了,没有必要处理其他的消息,因为其它的消息跟这个插件根本不搭边,总不能当消息是你今天吃饭了吗,你也回复一个笑话吧;
再比如开发一个类似防水墙的插件,对刷屏、发布广告、漫骂等进行相关的处罚,如果要实现这个功能,那么这个插件需要处理所有的消息了,因为每一条消息都有可能是广告


2、插件的指令:每个插件的指令可以有多个,多个用|隔开,一般情况下,如果插件不是监控所有消息,只有QQ消息跟指令相关,才会进入插件的main方法


3、指令的类型:这个跟插件的指令一 一对应,多个也用|隔开。指令的类型有4种,分别是指令同消息相等、消息开头包含指令、消息结尾包含指令、消息任意位置中包含指令,在创建相关数据库信息时分别用1、2、3、4代替


4、插件的类型:插件类型就是插件处理消息的范围,有群消息和好友消息,在创建相关数据库信息时分别用1和2代替,插件只接收群消息,那么可以是1,只接收好友消息,那么是2,如果都处理就是1|2,也是用|隔开

具体开发一个插件(比如我想开发一个笑话插件,来活跃群氛围):

1、根据需求先确定一下插件的基本信息了,根据确定的信息生成插件相关的SQL语句,比如:
plugin_name(插件的名字):笑话大全
class_name(插件的类名,插件的类名必须以Web开头,Handler结尾,中间可以用小写拼音或英文简单概括下插件,不然无法使用):WebjokeHandler
author(插件的作者):冬天的秘密
author_url(作者的网站或者插件的具体使用说明地址):http://bbs.itpk.cn
description(插件的说明):笑话大全,赶紧安装来活跃群氛围吧
instruction(插件的指令,插件的指令可以有多个,多个用竖杠隔开):笑话|冷笑话|暴走笑话
instruction_type(指令的类型,跟插件的指令相对应,多个也用竖杠隔开):1|1|1
plugin_type(插件的类型):1|2
version(插件的版本):1.0
is_able(是否启用):1
is_monitor_all_msg(是否监控所有消息):0

根据上面确认的相关信息,我们可以创建一个web.sql的文件,并且在web.sql文件中添加如下内容:

[SQL] 纯文本查看 复制代码
1
insert into web_plugin(plugin_name, class_name, author, author_url, description, instruction, instruction_type, plugin_type, version, is_able, is_monitor_all_msg) values ('笑话大全', 'WebjokeHandler', '冬天的秘密', 'http://bbs.itpk.cn', '笑话大全,赶紧安装来活跃群氛围吧', '笑话|冷笑话|暴走笑话', '1|1|1', '1|2', '1.0', 1, 0);

2、根据插件的类名,我们可以确定插件的类文件名,创建一个WebjokeHandler.php的文件,创建好后,我们就可以在这个文件中具体的写插件的内容了,根据插件的要求,我们先搭建插件的基本框架:

[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
<?php if (!defined('ITPK')) exit('You can not directly access the file.');
class WebjokeHandler extends AbstractpluginHandler {
        public function main() {
        }
}
?>

在<? php 的后面加一个if判断是为了防止直接调用这个插件,可加可不加,不过还是建议加上

3、框架搭建好后,我们就可以在main方法中处理相对应的指令了,因为当消息跟指令相关的话,会自动执行插件的main方法

[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php if (!defined('ITPK')) exit('You can not directly access the file.');
class WebjokeHandler extends AbstractpluginHandler {
        public function main() {
                //释放发送消息者的插件ID,如果不释放,那么这条消息发送者以后的消息(即使这个消息不是指令)只会经过这个插件的main方法,不会再被别的插件捕获(监控所有消息的插件除外),直到调用了这个方法后才会恢复,我们可以利用这个特性来做很多事情
                $this->updatePluginId();
                //获取接收到的消息,我们可以通过父类AbstractpluginHandler的msg获取
                $msg = $this->msg;
                //定义一个变量,用来保存插件最后返回的值
                $reply = "";
                //因为这个插件定义的指令类型是1(消息跟指令相等),所以这里直接用是否相等判断属于哪个指令
                if ($msg == "笑话") {
                        $apiurl = "http://i.itpk.cn/api.php?question=" . urlencode($msg);                        $curl_obj = curl_init();
                        curl_setopt($curl_obj, CURLOPT_URL, $apiurl);
                        curl_setopt($curl_obj, CURLOPT_HEADER, 0);
                        curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, 1);
                        curl_setopt($curl_obj, CURLOPT_CONNECTTIMEOUT, 6);
                        $result = curl_exec($curl_obj);
                        curl_close($curl_obj);
                        $joke = json_decode($result, true);
                        $title = $joke['title'];
                        $content = $joke['content'];
                        $reply = "[face95end]" . $title . "[face95end]%5C%5Cn" . $content;
                } elseif ($msg == "冷笑话") {
                        $reply = "这是一个冷笑话";
                } elseif ($msg == "暴走笑话") {
                        $reply = "这是一个暴走笑话";
                }
                if ($reply != "") {                //如果$reply不为空,那么返回$reply的值
                        //在main方法里通过ReplyUtil类的getReply方法处理$reply的值,然后用return返回,就会被机器人直接发送出去,同时这条消息也就处理完毕
                        return ReplyUtil::getReply($reply);
                } else {                                //如果$reply的内容为空,那么程序接着会走到这里
                        //这里可以有两种返回方式,只能选择其中一种,使用时请去掉其中一个
                        //第一种,这种返回方式表示插件已经处理完这条消息,并且机器人不做任何回复
                        return ReplyUtil::noReply();
                        //第二种,这个返回方式表示插件没有对这条消息做出处理,这条消息会接着被别的插件处理
                        return false;
                }
        }
}
?>

至此,这个笑话大全的插件基本制作完毕,我们可以把web.sql和WebjokeHandler.php压缩成一个ZIP压缩包,文件名是WebjokeHandler.zip,之后上传到程序的plugin目录,之后在网站的插件大全里点击本地安装,你会发现,你上传的压缩包会出现这这里,这时点击安装按钮就可以真正安装啦;如果空间不支持在线解压,那么就不能通过本地安装啦,这时你可以把插件压缩包解压,创建一个joke目录(目录名字必须是类名中Web和Handler中间部分的小写字母),把解压后的文件都复制到joke目录,然后把joke目录上传到plugin目录,再点击插件大全的检测插件,也会发现插件出现这里,可以点击安装按钮真正安装。

当机器人运行时,如果你修改了插件的类文件(一般在调试插件时),并且把修改后的文件上传到空间或服务器覆盖了以前的文件,这个时候修改是不会生效的,因为你那个插件的文件以前在引入过,它就会长久的保存在内存上,机器人运行引用的是内存上的文件,这个时候即使你把插件的文件删了,只要机器人没有重新运行,插件还是能够正常工作,所以在修改插件内容调试的时候,需要关掉机器人运行,再开启,重新登录机器人才会生效。到3.1版本和3.1以后的版本就不需要重启机器人了,只要安装了机器人助手插件,发送重新运行指令就行了,发送指令后此机器人的进程会立即终止,并在一分钟之内会重新运行,但是这个是不用重新登录的


这些只是简单的插件制作文档,没有涉及任何数据库的操作,只有很简单的逻辑关系,后面会详细介绍一下这个系统,方便大家开发出给力的插件。

赞(0) 打赏
未经允许不得转载:吾爱乐享 » 茉莉QQ机器人3.X系列插件开发文档

评论 抢沙发

评论前必须登录!

 

推荐免费资源共享,个人经验总结学习

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏