[酷Q机器人开发]写一个B站动态同步到QQ群的插件吧 #易语言

  • 2019-09-15
  • 130
  • 0
  • 0

本期TAG

​易语言  酷Q机器人  编程

本文基于酷Q机器人SDK-V8-易语言

本文IDE使用易语言V5.9


介  绍

当群内发送特定关键词时输出指定内容或定时触发时钟(timer)事件是判断是否满足条件并输出内容。

*(输出内容指向所指定的群内发送消息)

准备环境

首先到https://cqp.cc/t/15124酷Q社区下载易语言SDK、到易语言官网下载易语言IDE。

下载完成解压后打开DEMO工程(com.example.demo/app.e)即可开始编写。

原理

酷Q在运行中收到的每一条事件(event)(例如“收到一条新的群消息”)将详细内容交给每一个应用处理(具体做法是调用其在JSON文件里指定的函数)

例如默认的“群消息处理”函数是“_eventGroupMsg”。

以此类推,知道这个原理后即可在特定函数里改写为我们自己的代码以实现各种功能。

主要问题

1.配置&存储

我们肯定希望指定某一个群为主管群,当机器人在不同群需要实现不同功能时,我们肯定要单独设置某一个插件所对应的群,对此我们可以新建一个设置窗口,并把需要设置的内容写到酷Q应用数据目录的“settings.ini”文件中。

这里酷Q为我们提供了一个全局变量(应用目录),我们可以重写“写配置项”和“读配置项”两个函数来快捷的读取和保存设置。

2.时钟(Timer)的实现

易语言自带的“时钟”控件只能在窗口里用,而我们的动态库运行时是单线程且没有前台窗口的,所以我们需要调用Windows为我们提供的时钟创建函数并且使用多线程。

在 user32.dll 中有两个函数分别是SetTimer KillTimer 可以帮我们创建/销毁时钟。

SetTimer:

hwnd – 窗口句柄 – 没有直接填0

nIDEvent – 事件ID – 可以自定义以便销毁

nElapse – 时钟周期 – 每次执行的间隔 以ms为单位

lpTimerFunc – 函数指针 – 所执行的函数

KillTimer:

hwnd – 窗口句柄 – SetTimer时填的

nIDEvent – 事件ID – SetTimer时填的

时钟其实很好理解,就是在每一个时钟周期时执行一次函数(本插件所用的就是2秒检测一下B站是否发了新动态,如果发了就在群里发一条消息)。

2.易语言自带的巨坑

易语言在写Windows动态库(DLL)是出现的一个较严重的问题。

在小范围改动/删除代码并编译后调用会执行删除前的代码(??!)

这个问题我调试了很久也没找到好的解决方式……

不过摸出了一个规则:均是在时钟事件中且有时调用了局部/全局变量。(这和随机执行代码有关系吗)

开始写代码

首先把获取B站最新相簿和动态的函数单独写出来。

在这之前,由于易语言不支持JSON,需要引入第三方的JSON插件。插件有两个BUG,一个BUG是当JSON过长时无法读取,这为我们之后的coding埋下了个巨坑,但那就是后话了……

【获取最新相簿】

API: http://api.vc.bilibili.com/link_draw/v1/doc/doc_list?uid=【B站UID】&page_num=0&page_size=1 (获取最新的一条)

返回内容:

*为了让大家理解JSON插件的使用方法,我们提供一个获取上图中img_src键的方法,顺便对比一下。

PHP: $json[‘data’][‘items’][0][‘pictures’][0][‘img_src’];

JavaScript: json.data.items[0].pictures[0].img_src;

易语言JSON插件: json.k(“data”).k(“items”).i(0).k(“pictures”).i(0).k(“img_src”).取文本()

虽说有些复杂,不过这也算易语言能做到的最简洁的形式了吧……

坑1:编码问题

易语言使用的是GBK编码(我*** 都9102年了怎么还不用UTF8???),如果直接使用内置函数“到文本(HTTP读文件(url))”返回的文本全是乱码。

填坑1:编码转换

使用内置的编码转换将UTF8转换为GBK,解决了乱码的问题。

【获取最新动态】

说实话,这真的没法用易语言了。

首先 我没找到获取动态的接口 只找到了获取一大堆没用内容附加动态的接口。附带一大堆没用信息直接影响了获取/执行速度,而且频繁调用还可能被BAN。

坑2:JSON无法读取

记得我刚刚提的JSON插件的坑吗?

对,由于这个JSON体积太过庞大,无法读取了。

填坑2:借助服务器-PHP

曲线救国。用服务器处理获取的JSON数据并且用GBK编码返回数据,一下子解决了两个问题哦~

坑3:超过2^31-1的整数无法正常获取

先提一句,这个问题我在当初(去年)写B站动态抽奖的问题就发现了,当时没解决所以直接去掉了某个功能。

在JSON中显示正常,但是当使用易语言JSON模块获取时就变成了x.xxxE+x。

填坑3:干脆让他变成一个字符串吧…

这里要借助PHP了,先处理json然后返回。,也就是说不直接调用B站接口了,用服务器做一个中转。

最后的核心代码~(同步B站动态)

PS:为了照顾对易语言不太了解的人,我照着模仿了一个PHP版的(看着是不是舒服了点)

(习惯易语言之后写PHP经常忘掉变量前的比如第9行…懒得改了)

【每小时播报粉丝增减】

  1. 存储上一小时的粉丝数
  2. 获取粉丝数
  3. 异常处理

这里我直接把去年写的机器人插件拿过来改改了,具体思路忘了。

打算增加B站新稿件推送和其他各种功能,如果你有什么想法欢迎留言/加粉丝群交流哦~ Q群号:584070002


微信公众号:HT大讲堂

Bilibili@HT大神

博客: htblog.top

评论

还没有任何评论,你来说两句吧

隐藏
变装