Python 定制QQ机器人

前两天见有同学写QQ机器人用于每天代为疫情打卡,感觉是挺方便的,但有违学校规定,后被迫停止了,遂自己写了脚本挂服务器,然后感觉这个机器人挺有趣,小小研究了下

安装 酷Q on Docker

酷Q原是Windows上的项目,不过官方基于Docker和Wine技术,也推出了酷Q Docker版

下载镜像

1
docker pull coolq/wine-coolq

下载后,在任意目录创建一个空文件夹,用于持久化存放 酷Q 数据

1
mkdir /root/coolq-data

运行 酷Q 镜像,后面要登录的QQ帐号和VNC密码自行设置

1
docker run --name=coolq -d -p 8080:9000 -v /root/coolq-data:/home/user/coolq -e VNC_PASSWD=password -e COOLQ_ACCOUNT=username coolq/wine-coolq

访问vps服务所在端口,输入之前设置的密码

登录QQ小号,提示收到交互式网页验证码,但又看不见验证码,点拒绝,多尝试几次登录就OK了

Python实现交互

用到插件coolq-http-api,其通过 HTTP 或 WebSocket 对酷 Q 的事件进行上报以及接收请求来调用酷 Q 的 DLL 接口,从而可以使用其它语言编写酷 Q 插件。支持 Windows 7 和 Windows Server 2008 及更新版本,也可以运行在 Wine、Docker

还有CQHTTP Python SDK,其为 CQHTTP 插件的 Python SDK,封装了 web server 相关的代码,让使用 Python 的开发者能方便地开发插件

安装CoolQ HTTP API 插件

直接到 Releases 下载最新的 cpk 文件放到 酷Q 的 app 文件夹

重载应用后启用CQHTTP

然后讲道理这里应该会有日志回显的,但是没有,不明原因

那么直接在宿主机测试该插件是否生效

发现5700端口的确开放,说明插件已经正在运行了,测试下发送消息的api,user_id为QQ号

1
curl "http://172.17.0.2:5700/send_private_msg?user_id=1729888211&message=test"

能收到消息表明已经正常工作了

目前能用http -api发送消息,还需要接收酷Q收到的消息才行,配置文件在 酷Q 的 data\app\io.github.richardchien.coolqhttpapi\config 文件夹中,文件名为 <user_id>.json<user_id>为登录的 QQ 号)

酷Q 收到的消息、事件会被 POST 到配置文件中指定的 post_url,为空则不上报

那么修改post_url,暂时我先设置为宿主机的内网ip,端口5701

重启下应用,宿主机监听5701端口,然后发给机器人一条消息

5701端口收到POST传递过来的消息即说明功能正常

CQHTTP Python SDK

我打算也安装在Docker中

下载Python镜像

~~docker pull python~~~

突然想起来 酷Q on Docker 中就有Python环境,那还是放在一起好了

进入VNC右键桌面打开控制台

安装pip先

1
2
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

emm,报错

解决方法

1
apt-get install python3-distutils

提示权限不够,可我也不知root的密码,那在宿主机进入docker并修改密码

1
2
3
docker exec -ti d6c bash
passwd
exit

进入VNC切换为root用户并安装python3-distutils,然后就可以安装pip了

1
2
3
4
su root
apt-get update
apt-get install python3-distutils
python3 get-pip.py

接着直接用pip安装cqhttp

1
python3 -m pip install cqhttp

然后新建 Python 文件,运行 bot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from cqhttp import CQHttp

bot = CQHttp(api_root='http://127.0.0.1:5700/')


@bot.on_message
def handle_msg(event):
bot.send(event, '你好呀,下面一条是你刚刚发的:')
return {'reply': event['message'], 'at_sender': False}


@bot.on_notice('group_increase') # 如果插件版本是 3.x,这里需要使用 @bot.on_event
def handle_group_increase(event):
bot.send(event, message='欢迎新人~', auto_escape=True) # 发送欢迎新人


@bot.on_request('group', 'friend')
def handle_request(event):
return {'approve': True} # 同意所有加群、加好友请求


bot.run(host='127.0.0.1', port=8080, debug=True)

之前已经将docker和宿主机的/root/coolq-data目录挂载了,python文件传到这里就可

还要修改下CoolQ HTTP API 配置并重启应用

测试如下

参考

CoolQ HTTP API

python-cqhttp