qq机器人简单教程(go-cqhttp)
文章最后更新时间为:2023年08月03日 16:46:06
1. go-cqhttp是什么
mirai 是一个在全平台下运行,提供 QQ Android 协议支持的高效率机器人库,而go-cqhttp是mirai的golang版本实现。其项目地址为https://github.com/Mrs4s/go-cqhttp, 官方文档为https://docs.go-cqhttp.org/
2. 初步使用go-cqhttp
首先根据下面的步骤来实现一个最简单的机器人,当接收到“hello”消息时,则自动发送“你好我是机器人”。
1.下载go-cqhttp,https://github.com/Mrs4s/go-cqhttp/releases
2.控制台运行.\go-cqhttp.exe,第一次运行会生成配置文件,这里为了简单起见,选择http模式即可
3.打开配置文件,反向HTTP POST地址列表
这一项即可,别的可以先不改,配置文件官方文档:https://docs.go-cqhttp.org/guide/config.html
servers:
# 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服务器
- http: # HTTP 通信设置
address: 0.0.0.0:5700 # HTTP监听地址
version: 11 # OneBot协议版本, 支持 11/12
timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
long-polling: # 长轮询拓展
enabled: false # 是否开启
max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
middlewares:
<<: *default # 引用默认中间件
post: # 反向HTTP POST地址列表
- url: 'http://127.0.0.1:8088' # 这里填写server的地址,所有的消息和事件都会发送到这里
- 使用flask编写一个server,打印出接收到的消息,当接收到“hello”消息时,则自动发送“你好我是机器人”。
from flask import Flask, request
import sys
import json
import requests
from loguru import logger
app = Flask(__name__)
config = {
"handlers": [
{"sink": sys.stdout, "colorize": True, "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {message}",
"level": "INFO"},
{"sink": "file.log", "rotation": "10 MB", "level": "DEBUG"},
],
"extra": {"user": "yanq"}
}
logger.configure(**config)
# 监听端口,获取QQ信息
@app.route('/', methods=["POST"])
def post_data():
data = request.get_json()
if data["post_type"] == "meta_event" and data["meta_event_type"] == "heartbeat":
return
logger.debug(json.dumps(data))
if data["post_type"] == "message": # 接收到消息
if data['message_type'] == 'group': # 如果是群聊信息
gid = data['group_id'] # 获取群号
uid = data['user_id'] # 获取信息发送者的 QQ号码
try:
nickname = data['sender']['nickname'] # 获取信息发送者的 QQ昵称
except:
nickname = "unknow"
message = data['raw_message'] # 获取原始信息
logger.info(f"接收到群聊消息, 群号:{gid}, 发送人qq:{uid}, 发送人昵称:{nickname}, 消息:{message}")
elif data["message_type"] == "private": # 私聊信息
uid = data['user_id'] # 获取信息发送者的 QQ号码
nickname = data['sender']['nickname'] # 获取信息发送者的 QQ号码
message = data['raw_message'] # 获取原始信息
logger.info(f"接收到私聊消息, 发送人qq:{uid}, 发送人昵称:{nickname}, 消息:{message}")
if message == "hello":
r = requests.get(f"http://127.0.0.1:5700/send_private_msg?user_id={uid}&message=你好我是机器人")
if r.json()["retcode"] == 0:
logger.info(f"给{uid}发送消息成功")
else:
logger.info(f"给{uid}发送消息失败")
return
if __name__ == "__main__":
app.run(host='127.0.0.1', port=8088) # 保证和我们在配置里填的一致
5.用命令行启动go-cqhttp.exe,会生成文件device.json,并且大概率出现协议不支持的情况
6.修改device.json中的protocol为2,走的是Android Watch协议,然后重新运行go-cqhttp.exe,扫码登录即可。
运行结果:
3.进阶用法nonebot
官方文档已经列举了支持的事件和api,功能比较多,直接使用flask裸写比较复杂,可以使用框架nonebot:https://nonebot.dev/docs/,这是一个实现了onebot-11 和onebot-12协议的框架,有兴趣的可以使用下,默认采用fastapi,对异步支持比较好
ps:
- 之前用这个框架用了很久,只收消息所以没有被封,发群聊消息有概率封号,最好使用小号
- 如果要使用其他协议,比如ipad协议,只能搭配https://github.com/fuqiuluo/unidbg-fetch-qsign来使用,所以使用watch协议是最方便的