文档章节

QQlite 插件开发总结

hnxymjj
 hnxymjj
发布于 2016/06/16 12:44
字数 2366
阅读 653
收藏 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
博文 65
码字总数 41203
作品 0
杭州
程序员
QQLite 插件开发 之 Sqlite 保存配置

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

hnxymjj ⋅ 2016/07/24 ⋅ 0

QQLite 插件开发 之 html解析 CsQuery(C#)

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

hnxymjj ⋅ 2016/07/24 ⋅ 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 ⋅ 0

jQuery(function(){})与(function(){})(jQuery)的区别

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

xiahuawuyu ⋅ 2012/07/16 ⋅ 0

5款微信小程序开发工具使用报告,微信官方开发工具还有待提升

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

memda ⋅ 2016/10/24 ⋅ 13

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 ⋅ 0

实现jQuery扩展总结

实现jQuery扩展总结 开发自己需要的jQuery插件,看个示例说明 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt......

wolf_su ⋅ 2013/07/03 ⋅ 0

(function($){...})(jQuery)是什么意思

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

巴顿 ⋅ 2015/12/11 ⋅ 0

闲谈可插拔式应用程序的开发

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

王二狗子11 ⋅ 01/01 ⋅ 0

从开发到发布一款基于Vue2x的图片预览插件

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

JoySang ⋅ 05/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 28分钟前 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部