介绍
从qq推出qq小冰和小Q机器人,qq群机器人就一直在一定范围流行,但是官方的机器人功能缺乏、无趣,有时看起来还很呆,并不是很受欢迎。有时候我们在一些大群里面能看到一些自定义的机器人,能和群成员有趣的互动,还有许多高度自定义的功能,还能与一些游戏、网站建立接口查询数据,这都是怎么做到的呢?
最早腾讯官方是开放了smartQQ协议的,python也有qqbot库,但是后来腾讯的相关接口没法继续使用了。目前主流使用的mirai机器人,但是较为复杂。所以我使用了基于mirai开发的go-cqhttp,以及flask来制作群聊机器人。
go-cqhttp
官网
简单介绍
go-cqhttp的基本作用就是登录账号,通过http代理接收消息,处理发送消息的请求,可以简单理解为通过这个程序接受消息,也可以通过这个程序发送消息和其他操作。并且提供了许多api,可以满足各种群内日常的使用。
安装与使用
可以在GitHub上下载发行的 release 版,进入后选择自己合适的版本
可以自行阅读教程 开始 | go-cqhttp 帮助中心
在下载安装且运行完成配置文件下载后需要修改config.yml文件,只需要修改两个地方,一个是账号密码,还有http代理的本地地址
配置文件:
servers:
- http:
host: 127.0.0.1
port: 5700
timeout: 5
middlewares:
<<: *default
post:
- url: '127.0.0.1:8000' #只需要修改这里,地址端口可以写,但要和后面用到的一致
secret: '' #空着
至此,go-cqhttp就安装完成,只需使用时运行并扫码(配置文件里写了密码就不用)登录即可
flask
如上述所说,go-cqhttp只是用来代理http接收消息的,并没有逻辑处理的实际功能,所以我们还需要通过编写程序来完成这些工作,实现我们的机器人。可以选择c,java等,但对http的处理都不如python简单。利用python flask库我们可以很容易的编写出我们想要的机器人。
首先
我们需要知道接收到消息的数据的格式,运行go-cqhttp后,在群里发消息,机器人就会收到类似如下的json数据
本段是群聊信息的格式
{
'anonymous': None,
'font': 0,
'group_id': , 这里显示群号
'message': '你好', 这里显示信息
'message_id': -1345471362, 信息id,可用来撤回对应信息
'message_seq': 474313,
'message_type': 'group', 信息类型,这里显示是群聊信息
'post_type': 'message',
'raw_message': '你好',这里显示原始信息
'self_id': 3161879130,
'sender': {
'age': 0,
'area': '',
'card': '', 信息发送者的群名片
'level': '',
'nickname': '', 信息发送者的QQ昵称
'role': 'admin',
'sex': 'unknown',
'title': '', 信息发送者的群头衔
'user_id': 信息发送者的QQ号码
},
'sub_type': 'normal',
'time': 1619686099,
'user_id': 信息发送者的QQ号码
}
可以在这里找到各种事件获得json的详细信息 事件 | go-cqhttp 帮助中心
监听信息与逻辑处理
了解到信息格式后,我们就需要编程来处理信息了,利用flask搭建一个服务器,监听我们填写的本地地址获得的json数据,处理后发送对应消息,机器人就完成了
我们先创建一个 app.py 用来监听信息
from flask import Flask, request
'''这是导入的另一个文件,下面会讲到'''
import api
app = Flask(__name__)
'''监听端口,获取QQ信息'''
@app.route('/', methods=["POST"])
def post_data():
data = request.get_json()
if data['message_type'] == 'group': # 如果是群聊信息
gid = data['group_id'] # 获取群号
uid = data['sender']['user_id'] # 获取信息发送者的 QQ号码
message = data['raw_message'] #获取原始信息
common.keyword(message, uid, gid) # 将 Q号和原始信息传到我们的后台
return 'OK'
if __name__ == '__main__':
# 此处的 host和 port对应上面 yml文件的设置
app.run(host='127.0.0.1', port=8000) #保证和我们在配置里填的一致
然后我们需要一个程序来对收到的信息进行分析并且回复不同的内容,新建一个api.py
import json
import requests
import re
import random
'下面这个函数用来判断信息开头的几个字是否为关键词'
def keyword(message, uid, gid):
if message[0:2] == '你好':
send(uid,gid,"你也好啊!")
def send(uid, gid, message):
'''群消息'''
message = str(message)
sign = {"&": "%26", "+": "%2B", "#": "%23"}
for i in sign:
message = message.replace(i, sign[i]) #防止在请求中特殊符号出现消息错误
if uid != 0:
message = "[CQ:at,qq={}]\n".format(uid)+message #CQ码,这里是at某人的作用
requests.get(
url='http://127.0.0.1:5700/send_group_msg?group_id={0}&message={1}'.format(gid, message)) #发送群消息的api,前面的地址保证和配置中的一直
这样当我们运行app.py和go-cqhttp后,在群里发送你好,机器人就会at我们并回复:你也好啊!
你完全可以以你想要的设计机器人,使它能够算数,智能回复,还可以接入api实现翻译,听歌等等功能,等着你去实现
补充
如果你是在服务器上使用机器人,记得放开配置填写的地址对应端口的安全组
处理事件api:API | go-cqhttp 帮助中心 (可以实现管理群成员,撤回消息等)
CQ码: CQcode | go-cqhttp 帮助中心 (可以发表情,音乐,xml信息等)
先运行go-cqhttp还是python
为什么我这里显示address already in use
post:
先运行哪个应该都差不多