文档章节

QQlite 插件开发总结

to_be_better
 to_be_better
发布于 2016/06/16 12:44
字数 2423
阅读 729
收藏 2

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

© 著作权归作者所有

共有 人打赏支持
to_be_better

to_be_better

粉丝 7
博文 64
码字总数 41884
作品 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
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

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

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

memda
2016/10/24
5.3K
13

没有更多内容

加载失败,请刷新页面

加载更多

Java二分查找代码案例

public static int binarySearch(Integer[] srcArray, int des) { //定义初始最小、最大索引 int low = 0; int high = srcArray.length - 1; //确保不会出现重复查找,越界 while (low <= hi......

绝地逢生
17分钟前
2
0
在JAVA中线程到底起到什么作用!

这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(...

xtof
30分钟前
1
0
纹理与表面细节添加方法---帧映射

中国龙-扬科
46分钟前
0
0
vue学习:9、模块工具包收集

vue常用包收集 npm i webpack@3.6.0 -s 样式支持包 npm i css-loader -s npm i style-loader -s 图片支持 npm i url-loader file-loader -s 利用less操作图片 npm i less -s npm i less-loa......

轻轻的往前走
47分钟前
1
0
20181115上课截图

小丑鱼00
58分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部