茉莉机器人

 找回密码
 注册帐号

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 108405|回复: 86

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

  [复制链接]
  • TA的每日心情
    开心
    2016-4-14 09:04
  • 签到天数: 51 天

    [LV.5]常住居民I

    31

    主题

    360

    帖子

    1万

    积分

    论坛管理

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    19762
    发表于 2015-2-27 17:29:40 | 显示全部楼层 |阅读模式
    此插件开发文档适用于茉莉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] 纯文本查看 复制代码
    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] 纯文本查看 复制代码
    <?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] 纯文本查看 复制代码
    <?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以后的版本就不需要重启机器人了,只要安装了机器人助手插件,发送重新运行指令就行了,发送指令后此机器人的进程会立即终止,并在一分钟之内会重新运行,但是这个是不用重新登录的


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



    点评

    支持: 5.0
    楼主不回吗?我想开发自动智能识别添加自己为好友的插件 但是不知道添加好友事件是什么  发表于 2015-11-7 23:29
    支持: 5
    加好友是什么消息事件?  发表于 2015-10-17 22:45

    评分

    参与人数 2金币 +6 收起 理由
    dfsdfsdf + 1 很给力!
    网型网秀 + 5 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2016-4-17 00:19
  • 签到天数: 133 天

    [LV.7]常住居民III

    1

    主题

    3

    帖子

    1337

    积分

    论坛长老

    Rank: 6Rank: 6

    积分
    1337
    发表于 2015-5-1 06:00:33 来自手机 | 显示全部楼层
    怎么监控啊
  • TA的每日心情
    无聊
    2015-7-26 08:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    8

    帖子

    45

    积分

    论坛新兵

    Rank: 2

    积分
    45
    发表于 2015-2-27 22:30:58 | 显示全部楼层
    插插插插
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    23

    积分

    论坛新兵

    Rank: 2

    积分
    23
    发表于 2015-2-28 08:36:10 | 显示全部楼层
    苦等楼主更新
    Techmoe on Cnblogs
  • TA的每日心情
    开心
    2016-4-14 09:04
  • 签到天数: 51 天

    [LV.5]常住居民I

    31

    主题

    360

    帖子

    1万

    积分

    论坛管理

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    19762
     楼主| 发表于 2015-2-28 10:45:36 | 显示全部楼层

    (⊙o⊙)…  好吧,尽快,事太多了,忙不过来

    该用户从未签到

    0

    主题

    1

    帖子

    19

    积分

    论坛新兵

    Rank: 2

    积分
    19
    发表于 2015-3-1 02:58:18 | 显示全部楼层
    顶顶顶{:5_154:}{:5_154:}{:5_154:}{:5_154:}

    点评

    嘿嘿  发表于 2015-3-1 09:57
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    23

    积分

    论坛新兵

    Rank: 2

    积分
    23
    发表于 2015-3-1 12:12:02 | 显示全部楼层
    冬天的秘密 发表于 2015-2-28 10:45
    (⊙o⊙)…  好吧,尽快,事太多了,忙不过来

    唔。。这个产品我还是蛮喜欢,如果你计划永久开源的话不妨发布到GitHub,那样如果大家互相改进下代码还是蛮方便的w

    点评

    还没有弄过项目在线托管,改天试试看(⊙o⊙)…  发表于 2015-3-1 18:16
    Techmoe on Cnblogs

    该用户从未签到

    1

    主题

    2

    帖子

    25

    积分

    论坛新兵

    Rank: 2

    积分
    25
    发表于 2015-3-30 00:14:38 | 显示全部楼层
    总之好厉害的样子,找了好久,偶然通过别个做的软件中提到茉莉机器人,就百度过来了,表示支持,以后会常来
  • TA的每日心情
    开心
    2016-4-14 09:04
  • 签到天数: 51 天

    [LV.5]常住居民I

    31

    主题

    360

    帖子

    1万

    积分

    论坛管理

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    19762
     楼主| 发表于 2015-3-30 11:56:55 | 显示全部楼层
    sundayha55 发表于 2015-3-30 00:14
    总之好厉害的样子,找了好久,偶然通过别个做的软件中提到茉莉机器人,就百度过来了,表示支持,以后会常来 ...

    谢谢,不过现在版本的webqq协议失效了,这个星期重新抓包
  • TA的每日心情
    开心
    2016-4-17 00:19
  • 签到天数: 133 天

    [LV.7]常住居民III

    1

    主题

    3

    帖子

    1337

    积分

    论坛长老

    Rank: 6Rank: 6

    积分
    1337
    发表于 2015-4-30 23:27:02 来自手机 | 显示全部楼层
    怎么监控
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

    Archiver|手机版|茉莉机器人 ( 京ICP备17052054号-2

    GMT+8, 2018-2-21 07:34 , Processed in 0.080873 second(s), 34 queries .

    Powered by Discuz X3.2.

    CopyRight ©2014-2015 by ITPK All Rights Reserved.

    快速回复 返回顶部 返回列表