文档章节

QQlite 插件开发总结

hnxymjj
 hnxymjj
发布于 2016/06/16 12:44
字数 2366
阅读 656
收藏 2
点赞 0
评论 0

1、  QQ机器人的使用场景

        可以看官网上的详细介绍,比如QQ群的自动营销或者活跃群气氛,代替人工进行自动回复等。

        QQ机器人的常用种类:常用的有两种:QQLite 和 QQPlus,两种框架大致相同,但是还是有一些不同的。

2、  QQ机器人的运行原理以及和插件的运行原理

         QQ机器人类似于QQ客户端。分为QQ机器人核心和插件两大部分:

         QQ机器人核心提供的功能是:收发信息/发送者的权限信息 和发送者所在的群信息等。

           插件的功能则是对这些收到的信息进行处理后,由机器人核心将信息发送给群、好友等。比如对收到的信息指定指令进行业务逻辑处理。官方和很多开发者已经提供了很多相关插件,有免费的也有付费的。比如常见的签到系统、积分系统、群管系统,还有各种各种的游戏。

           QQ 机器人传递消息的顺序是按照插件列表中对应的顺序进行转发,可以通过界面调整插件的优先级,消息被插件处理后就不会再转发给下个插件。

           插件的排列顺序个人理解的是:对发送消息者进行黑名单过滤和身份验证之类的要放在前面,对收到数据进行处理的插件放在后面。

                  QQ机器人通过动态库的形式提供给插件开发者进行开发,具体的接口文档请参考官方的文档中心中的“插件开发手册”对应的文档(C#).主要的接口有以下五个必须实现,对应的:(http://www.qqlite.cn/document/index/index.html#T:QQLite.Framework.SDK.Plugin

                   Install(安装插件)  :点击安装时候运行对应的函数

                   UnInstall(卸载插件)  :点击卸载时候运行对应的函数

                   Start(运行插件)  :插件的具体执行函数

                   Stop(停止运行) :点击停止运行后的执行函数

                   ShowForm(显示插件窗体,点击“设置”弹出)

3、  QQLite支持的开发语言

C#(插件开发手册部分)                       

           提供的功能比较全面,建议使用C#

PHP/ ASP.net(接口事件和API事件部分)

           优点:开发简单,熟悉PHP的可以很快上手,API较少

           缺点:可以处理一些事件,但是插件接收到的参数较少,不建议用于复杂功能开发,如果只是见到的群消息一问一答还可以,若要区分发送消息者的权限,则无法做到。

           其他:

           (1)若使用PHP进行开发,需要依赖web接口插件,这个插件会把QQ机器人核心收到的消息全部以 post方式转发到这个web接口插件中对应的url 中,对应的是为接口事件部分对应的文档。

           (2)若需要对收到的这个指令进行处理,则直接echo 数据,核心就会把echo 的数据返回给发送者;若不需要处理,则不要echo 数据,否则会影响其他插件对这个消息的处理。

                    http://www.qqlite.cn/document/index/index.html#webplugin

4、  QQLite 插件的开发流程(C#)

(1) 开发环境  Visual studio2010

(2) 最少的基础知识准备

        QQLite 的开发手册的熟悉,一定要熟悉

        C# 基础教程(如果没有学过C#,参考  http://www.runoob.com/csharp/csharp-tutorial.html

(3)       开发步骤(建议新手直接在官方的插件的基础上进行修改,但是切记要修改命令空间,否则会把原有的web接口插件给替换掉)

        (a)       打开VS2010,新建 visual C# àwindowsà类库à 确定(TestPlugin)

        (b)       解决方案资源管理器(TestPlugin)—>右键选择属性

                应用程序  QQLite.Plugin.TestPlugin

                默认命名空间-> QQLite.Plugin.TestPlugin(QQLite 用于区分不同插件的标 识)

                                     生成-> 目标平台:x86 输出路径:自定义,最好直接输出到和机器人exe     

                                               相同的目录下即可

        (c) 右键 引用:添加引用—》从中选择出QQLite 机器人可执行文件目录下

的QQLite.Framework.dll ,然后选择”QQLite.Framework”,将复制本地设置为false

(d)       然后就是在start() 中进行编码,根据文档中心的插件开发手册,实现你所需要的功能

(e)       若需要使用mysql 连接数据库,则同上,引用QQLite 目录下的Mysql.data.dll 即可

(f)        根据文档中心的“插件开发手册“和需求进行开发

(g)       开发完成,才能vs 的菜单的“生成“中选择 “生成解决方案”或者重新生成解决方案,就可以在上面设置的输出路径中看到生成的dll文件

将DLL文件转化为QQLite 可以识别的格式:只需要dll 移动到 QQLite的可执行文件上,就会提示生成插件成功,在当前目录下就会有同名但是后缀名为 plugin 的文件,将这个文件放到plugin 目录下,然后,点击机器人操作界面右下角的重新加载插件,就会看到自己的插件了。

5、插件开发的注意点

(1)、   C#操作Mysql(增删改查)   这个属于C# 的范围,和QQLite 关系不大,使用google 搜索C# mysql 即可

注意点(a) 打开数据库连接的时候,要设置字符编码为utf8

string server = "127.0.0.1";
string database=”test_db”;
uid=”root”;
password=”123456”;
string connectionString = "server=" + server + ";port=3306;database=" + database + ";User Id=" + uid + ";password=" + password + ";charset=utf8;";

           (b)如何插入数据记录

MySqlCommand cmd = connection.CreateCommand();
string insert_cluster_check_in_cfg = @"insert into cluster_cfg(cluster_id,check_status)value('{0}','{1}');";
insert_cluster_check_in_cfg = String.Format(insert_cluster_check_in_cfg, cluster_id, cluster_check_in_open);
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = insert_cluster_check_in_cfg;
cmd.ExecuteNonQuery();

(2)如何调试

程序开发过程肯定会遇到bug,下面就是调试的过程

(a)       将要调试的插件放在 机器人可执行文件下的plugin目录下,在机器人界面重新加载插件

(b)       VS 菜单à调试à调附加到进程à从可用进程中找到机器人对应的进程à点击附加

(c)       Vs 中,在需要打断点的地方打上断点,然后触发对应的指令即可

(d)       QQ机器人单次调试时间不宜过长,否则会导致重新需要重新登录

(e)       机器人的界面上的日志选项卡中,可以通过OnLog 打印日志,方便调试

(3)       发布群公告

      发布群公告在插件开发手册中没有对应的现成接口,所以需要自己抓包(flidder)进行测试开发,完成这个功能所需要的数据都可以从机器人对应的接口中获得。

      原理是:模拟QQ客户端发送公告的http请求,填充对应的字段,向对应的url 传递正确的数据即可

      思路是:因为插件接收到的数据只有:sender 和对应的事件参数,从这两个参数中调试查找所需要的参数。

      示例:

private string BuildRequest(Dictionary<string, string> sParaTemp,uint cluster_id,string title,string text)
        {
            string qid = cluster_id.ToString(); //群号
            string bkn = this.Client.QQUser.GetGTK.ToString(); //
            string skey = this.Client.QQUser.Getskey; //client cookie
            string uin = "";  //client cookie
            List<Cookie> cookie_list = this.Client.QQUser.ClientCookie;
            foreach (Cookie cookie_item in cookie_list) {
                if (cookie_item.Name == "uin")
                {
                    uin = cookie_item.Value;
                    break;
                } 
            }
            //this.Client.QQUser.ClientCookie
            //"skey=Zj1RzntUhW;uin=o3476394573"
            string cookie = "skey=" + skey + ";uin=" + uin;
            sParaTemp.Add("title", title);
            sParaTemp.Add("text", text);
            sParaTemp.Add("qid",qid);
            sParaTemp.Add("bkn", bkn);
            StringBuilder prestr = new StringBuilder();
            foreach (KeyValuePair<string, string> temp in sParaTemp)
            {
                prestr.Append(temp.Key + "=" + HttpUtility.UrlEncode(temp.Value, Encoding.GetEncoding(this.Config.InterfaceCharSet ?? "UTF-8")) + "&");
            }

            //去掉最後一個&字符
            int nLen = prestr.Length;
            prestr.Remove(nLen - 1, 1);

            var http = new HttpHelper();
            //URL = this.Config.InterfaceUrl,
            var item = new HttpItem
            {
                URL = "http://web.qun.qq.com/cgi-bin/announce/add_qun_notice", //通过抓包工具获取到qq 响应添加应答的接口
                Method = "POST",
                Accept = "*/*",
                UserAgent = "Qlwz_QQLite_" + License.Version,
                Cookie = cookie,
                Referer = "http://web.qun.qq.com/announce/index.html",
                ContentType = "application/x-www-form-urlencoded; charset=UTF-8;",
                Encoding = Encoding.GetEncoding(this.Config.InterfaceCharSet ?? "UTF-8"),
                Postdata = prestr.ToString()
            };
            item.Header.Add("Accept-Encoding", "gzip, deflate");
            item.Header.Add("Accept-Language", "zh-CN,zh;q=0.8");
            
            var httpresult = http.GetHtml(item);//QQ 返回的处理 发布问答的返回值
            if (httpresult.StatusCode == HttpStatusCode.OK)
            {
                if (!string.IsNullOrEmpty(httpresult.Html))
                {
                    if (httpresult.Html.StartsWith("<!DOCTYPE")
                        || httpresult.Html.IndexOf("</title>", StringComparison.Ordinal) != -1
                        || httpresult.Html.IndexOf("<body", StringComparison.Ordinal) != -1)
                    {
                        return null;
                    }
                    if (string.Compare(httpresult.Html, "PostNull", StringComparison.CurrentCultureIgnoreCase) != 0
                        && string.Compare(httpresult.Html, "ErrNull", StringComparison.CurrentCultureIgnoreCase) != 0
                        )
                    {
                        return httpresult.Html; 
                    }
                }
                return null;
            }
            else
            {
                return null;
            }
        }

(4)       对插件开发手册的理解

QQLite.Framework

QQLite. Framework.Event

QQLite. Framework.Entity

6、  推荐资源

QQLite 文档中心:http://www.qqlite.cn/document/index/index.html

QQLite 插件开发示例:http://www.qqlite.cn/document/index/index.html#sdk

           这是QQLite自带的web接口插件,插件的功能是:可以将收到的数据,以post的方式传递到你设置的url,是比较完整的示例。

QQPLus 文档中心:http://qqplus.oksvn.com/Home/Download

     对应的*度云盘中有qqplus的开发资料和视频,尤其是☆零℡壹☆的教程

7、  推荐资源

QQLite 文档中心:http://www.qqlite.cn/document/index/index.html

QQLite 插件开发示例:http://www.qqlite.cn/document/index/index.html#sdk

           这是QQLite自带的web接口插件,插件的功能是:可以将收到的数据,以post的方式传递到你设置的url,是比较完整的示例。

QQPLus 文档中心:http://qqplus.oksvn.com/Home/Download

     对应的*度云盘中有qqplus的开发资料和视频,尤其是☆零℡壹☆的教程

8、  部分插件开发领域大神

QQLite开发者:情留メ蚊子

插件开发者:☆零℡壹☆

9、  其他

 首先,感谢机器人作者提供给我们这么好的软件和文档,感谢上述两位大神以及其他大神(C#大波唐三角)的帮助,感谢网络上的资源提供者。

作为初学者,本文档有不当的地方,还请大神多多指教,不断修改完善。

 QQ:1014970572

© 著作权归作者所有

共有 人打赏支持
hnxymjj
粉丝 7
博文 69
码字总数 41561
作品 0
杭州
程序员
QQLite 插件开发 之 Sqlite 保存配置

由于C#是半路出家,对QQLite 的开发更是零基础,只有官方文档可以参考。刚开始的时候 存储没有考虑便利性,都是使用 MySql 保存在服务端,因为要求用户安装插件的同时在本地安装mysql 数据库...

hnxymjj
2016/07/24
152
0
QQLite 插件开发 之 html解析 CsQuery(C#)

在使用C#开发QQLite插件过程中,需要从第三方获取数据,通常都是选择json等,但是这次由于数据由第三方提供,由不得商量,对方返回的Html,需要自己从html 中提取出需要的数据,然后使用。 ...

hnxymjj
2016/07/24
172
0
wine QQLite7.9.md

ubuntu16.04 wine 是winehq-staging版 在winecfg中设置windows version为win8.1 在winecfg的libraries中“new override for library”中搜riched20和riched32, 然后”add” wine QQLite7.9.e......

christopher1
2016/11/25
28
0
5款微信小程序开发工具使用报告,微信官方开发工具还有待提升

微信小程序已经内测有一段时间了,笔者本着好奇加学习的心态写了几个小demo,虽然在MINA框架上并没有遇到太多的坑,但官方开发工具实在不敢恭维。 api提示不全,要一个个查api啊,写代码超级...

memda
2016/10/24
5.3K
13
jQuery(function(){})与(function(){})(jQuery)的区别

开发jQuery插件时总结的一些经验分享一下。 一、先看 jQuery(function(){ }); 全写为 jQuery(document).ready(function(){ }); 意义为在DOM加载完毕后执行了ready()方法。 二、再看 (functio...

xiahuawuyu
2012/07/16
0
0
JQuery 框架的学习资料汇总

1.Jquery教程(http://www.w3school.com.cn/jquery/index.asp) 2.jQuery的动画处理总结(http://www.cnblogs.com/dolphinX/p/3330174.html) 3.jQuery Easing 动画效果扩展(http://code.ciaoca......

IT追寻者
2016/08/04
58
0
(function($){...})(jQuery)是什么意思

这里实际上是匿名函数 function(arg){...} 这就定义了一个匿名函数,参数为arg 而调用函数 时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即: (function(...

巴顿
2015/12/11
145
0
闲谈可插拔式应用程序的开发

很多软件都是可插拔的,最知名的便是微软的Windows操作系统。你可以在Windows操作系统上安装QQ,也可卸掉QQ,这便是可插拔。这里不谈Windows的实现,因为太过复杂。本文就谈谈管理软件的可插...

王二狗子11
01/01
0
0
从开发到发布一款基于Vue2x的图片预览插件

先来看下Demo LiveDemo 关于开发Vue插件的几种方式 (具体请移步官网)Vue官网 我采用第一种方式来编写这个插件 1.第一步创建项目 vue init webpack-simple youProjectName(你的项目名称)具体...

JoySang
05/13
0
0
hadoop(05)、使用Eclipse连接远程Hadoop集群

在前面的文中我们分别搭建了单机和集群的Hadoop环境,今天我们将实践使用Eclispe开发工具安装 hadoop的开发插件,并且使用hadoop插件连接Hadoop远程集群,文中有什么不对的地方,请大家指出来...

MaxBill
2017/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

垃圾回收算法

一 如何判断对象可以回收 1 引用计数法 思路大概为:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计算器为0的对象就是不可能再被使用...

sen_ye
5分钟前
0
0
Activiti简介(学习总结一)

一、介绍 activiti是使用命令模式设计基于bpmn2.0的一款开源工作流引擎。 工作流简单举例:提交请假申请->经理审批->结束。这就是一个简单流程。activiti支持用户自定义流程。配置各个流程对...

沙shasha
6分钟前
0
0
VCL界面控件DevExpress VCL Controls发布v18.1.3|附下载

DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速开发出完美、...

Miss_Hello_World
7分钟前
0
0
加米谷大数据培训:云计算、大数据和人工智能之间的关系

一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成又不可分割。 一、云计算最初的目标 云计算最初的目标是对资源的管理,管...

加米谷大数据
12分钟前
1
0
java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
14分钟前
1
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
17分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
19分钟前
1
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
20分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
24分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部