茉莉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 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

zookeeper详解

Zookeeper--Zookeeper是什么 博客借鉴http://www.cnblogs.com/yuyijq/p/3391945.html​ Googl...

3583
来自专栏张伟博客

百度分享工具不支持htts的解决方法

1267
来自专栏肖洒的博客

爬虫入门(一):轻量级爬虫

其中,内存适合个人,缓存数据库适合大型公司。 ### 4.网页下载器(urllib2)[核心组件]() - 网页下载器:将互联网上URL对应的网页下载到...

611
来自专栏WeTest质量开放平台团队的专栏

Android外部存储

外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更。我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇...

1363
来自专栏分布式系统进阶

利用Mesos构建多任务调度系统

4455
来自专栏从流域到海域

在微服务之间进行通信

原文地址:https://dzone.com/articles/communicating-between-microservices

4775
来自专栏北京马哥教育

etcd:从应用场景到实现原理的全方位解读

马哥linux运维 | 最专业的linux培训机构 ---- 随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作...

55812
来自专栏Java后端技术栈

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题!

前面一节说到了《为什么说Redis是单线程的?》,今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念的入门...

3251
来自专栏kangvcar

[face_recognition中文文档] 第5节 特约贡献

1232
来自专栏Golang语言社区

【Go 语言社区】[Golang]优秀开源库剖析

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 1.blelve 地址:h...

4098

扫码关注云+社区

领取腾讯云代金券