Python实现自己的qqbot(一)
在2019年初webqq失效了以后,python自带的qqbot库也随之失效。唯一一些能用的qqbot API可能就剩下coolq等几个。但是coolq大多是用易语言等等写成。没法直接使用python模块。好在找到了大佬的qqapi接口.通过它可以完全做到使用python定制功能.
coolq原理
前往官网可以下载coolq. 注意air版是免费版,支持发送,接受群组/个人消息,但是不支持发送图片,发送红包(只有收费的pro版支持).不过air版还是支持"接受"图片的,具体见下面.
首先看看coolq原理.
coolq使用的是手机tim登陆,在登陆界面输入账户密码后会提示tim登陆.这时候你的手机qq会被强制挤下线.所以为了不影响今后使用,同时防止可能的封号风险,最好使用小号登陆.

登陆后coolq可以获得你的所有消息,包括群聊或者私聊的文字,图片,文件(这些被称为富媒体).
如果你在coolq官网找到了合适插件,可以直接按照官网教程安装.
一般来说常用的插件有监控群内消息(自动禁言,踢人,受理入群消息等等).但是这只能在有合适的插件情况下做到.就个人而言,我没有能力也没有兴趣去阅读官方文档然后按照对应api开发.

我们想要的是使用python开发,但是没有对应方便的python API供我们直接使用,所以必须得找到一个中转之策.
要找到策略,首先得知道自己需要什么.
我们希望能用python得到我们的qq消息,同时在程序控制下能发送消息.一接一收,就是我们的全部任务.
coolq http接口
使用的是大佬封装好的http插件.直接从github发行版本下载安装好http插件的coolq air版本.复制到本地启动exe文件就能打开了.
这个插件能在本地提供一个消息的中转服务器.通过这个http插件,coolq运行的时候提供了一个选项,允许你指定一个url进行消息上报\发送,从而通过其他web接口抓取\发送消息.这个过程的通信是通过http的,而基本上所有高级语言(当然包括python)都可以方便的处理http消息.这样就完成了我们的任务(接受/发送消息).
通俗来说,原本消息是跑在程序里面的,有点像一个黑盒子,我们啥数据也看不到,除非我们去研究黑盒子构造(官方api开发文档,非python语言).
但是现在这个插件将黑盒子里得到的数据(消息内容,发送人,发送时间等等)公开了.它宣布:你告诉我一个地址(url),我就能把所有你的qq消息转发到你的地址.如果你有能力处理我发送给你的数据,那你就可以对数据进行操作了.同时它自己也公布一个地址,只要你按照指定格式发送给我数据,我就能帮你发出去.
要开启http,在右键菜单的选项中勾选http api.在本地环境下会开启一个api的命令行.


在命令行我们可以看到消息的全部上报,如果看到说明启动成功了.它默认会在你配置的指定url上报消息,同时在5700端口开启监听,如果你向5700端口发送消息,它就会自动处理从而将你的消息发送出去.
coolq配置
实现了之后就需要配置coolq来为我们服务.
配置文件一般可以在coolq更目录\data\app\io.github.richardchien.coolqhttpapi\config下与你对应的qq号命名的json文件中找到.
使用notepad打开json文件,我们可以选择配置参数.具体参数参阅官方配置.

对我来说,关心的是"post_url"选项,修改为我想要的post位置(后续使用python利用).port可以指定监听端口,我们使用默认5700就可.ws_port配置的是websocket服务器,暂时不需要用到.
python工具
了解了coolq的工作原理,接下来是寻找python的对应http处理.
消息的发送
消息的发送可以通过requests库实现,按照官方api手册post相应参数到之前配置的监听端口(5700)就可以实现消息的发送.
消息的接受
消息的接收要复杂一些.
我在上面指定了一个监听端口,其中127.0.0.1表示的是本地服务器,这也就意味着我们必须安装一个服务器才行.在测试环境搭建在本地,但是最后使用的时候还是得部署到服务器才行.
选用的是python的django模块(版本2.2).我们在本地/服务器上部署一个django服务器,指定coolq插件对我们设计好的接口上报,然后通过服务器处理请求,然后使用requests库向coolq监听端口发送消息,从而实现消息接受/处理.
貌似coolq已经有python接口,但是是flask部署的,具体可以在github上查找.
由于个人习惯,我比较喜欢使用django开发,所以后面的说明是依照django开发的.但是flask与django本身有异曲同工之妙,关键的设计思想原理是一样的.所以具体选择就见仁见智了.
为了简单,我们先不部署服务器,而是使用简单的requests库与服务器的定时任务实现一个定时早晚安的机器人(没有对话功能).这将在我的第二篇文章中提到.