用Python开发酷Q机器人应用

前言

  • 酷Q机器人应用一般都是用易语言开发的,但是一方面不想再多学一门易语言,另一方面开发脚本还是用Python比较舒服。关于Python的酷Q的SDK我在论坛找了一下,目前用的比较多的有两个(现在应该是三个了,见文末),一个是基于http的none-bot,功能更强大,但上手有一定难度,所以最简单的我觉得还是慕晓飞大大的 Python酷Q_SDK_X
  • 本站更多关于酷Q的文章:点我

环境配置

首先需要按照文档的说明配置开发环境,这点文档讲的很详细,就不赘述了,需要注意的是:

  1. 酷Q本身是32位程序,开发时只支持32位的Python。
  2. 还有一点就是app_id应该按照官方规范来,否则可能会出问题,规范说明
  3. 酷Q升级后开发环境的目录移动至酷Q的dev目录下,如果酷Q没有自动更正的话请手动更正。更正方法为,在dev目录下新建cn.muxiaofei.coolq_sdk_x文件夹,将原来的cn.muxiaofei.coolq_sdk_x.dll和cn.muxiaofei.coolq_sdk_x.json重命名为app.dll和app.json移动至新建的文件夹下,其他不变。

配置完环境,如果不出意外的话,应该就能在酷Q日志的DEBUG里看到输出的hello world。

编写程序

  • 接下来就是敲自己的代码了,这个SDK的所有事件处理和API调用都在CQPlusHandler.py文件的 MainHandler类中进行编写,关于事件和参数的说明在开发文档中都有说明,API可以通过输入self.api的代码提示进行查看,也可以转到一个_api.py的文件中查看,至于这些API函数和参数的意义基本上看名字就能猜到八九分了,具体使用方法需要自己去尝试。
  • 新手需要注意的是这个CQPlusHandler.py程序是由酷Q软件自动执行的,不需要在Python的IDE里点运行,当然你点了也没用,如果setting里的DEBUG参数你没改的话,只要修改代码并保存,修改的代码就会实时生效。
  • 然后需要说明的就是@和表情,这个需要使用CQ码,CQ码详细介绍。但一般只需在QQ中发一条包含@或表情的消息,然后通过酷Q的日志就能直接进行右键复制了,复制后只需将相应的格式通过字符串的格式和普通消息一样输出就行了。
  • 举个例子,在CQPlusHandler.py文件中写入以下代码就能实现在群聊里复读并@发言的人的功能:
# -*- coding:utf-8 -*-

import cqplus

class MainHandler(cqplus.CQPlusHandler):
    def handle_event(self, event, params):
        if event == "on_group_msg":
            msg = '[CQ:at,qq=' + str(params['from_qq']) + ']' + params['msg']
            self.api.send_group_msg(params['from_group'], msg)

案例

  • 然后下面是我根据需求给群友写的一个自助Roll游戏的插件,和论坛上我能找到的抽奖插件相比,这个插件的特点在于完全由qq消息进行命令,可以直接丢到服务器上就不用管了,另一个特点是可以同时进行多个Roll游戏活动而互不干扰,以下是一个使用案例。这个应用其实还有一些功能我想过但还没加进去,以后根据需要有时间再看看吧,我把我写的垃圾代码放在了GitHub上,希望可以给有需要的人一点有价值的参考:Github链接
    案例

已知问题

打包

  • 最后就是应用的打包,直接使用打包生成的cpk文件会报错,需要像开发应用一样配置好环境并把源程序也放进去,唯一的差别就在于可以不用进入酷Q的开发者模式,所以要丢到服务器上的话,还有一丢丢的麻烦。由于Python的SDK的特性,编写的插件就不能像论坛上别的插件一样只发布cpk文件即可,而且使用者还需配置环境,对于普通用户来说过于麻烦了,所以这个还是只适合开发者自己使用。

消息并发处理

  • 由于Python的GLI锁机制,本插件不支持并发处理。表现为有事件发生时,比如各种消息和定时器事件,插件便会调用一次CQPlusHandler.py进行事件处理,所以当上一次事件还未处理完时,下一个事件又紧接着发,这时便会发生内存报错。虽然报错了程序并不会崩溃,不过如果程序要处理网络请求一类的耗时任务,这个缺陷是致命的。要想避免这种报错,只在CQPlusHandler.py文件里下功夫(比如用多线程)应该是不行的,估计得从源码上想想办法才行。不过我的机器人不需要处理大量消息,消息处理的也很快,所以凑合用用也还行。
  • 后来有大神重新写了个支持并发的python SDK,现在也更推荐使用这个或者更高级的nonebot。
Last modification:April 28th, 2020 at 12:26 pm