
QQ机器人-GoCqHttp部署&对接教程
Go-CqHttp是一款完全免费的QQ机器人框架,基于OneBot协议,它可以抓取QQ消息数据包并返回json格式的数据,可以根据群内消息或CQ码判断并用Python、Java等语言回复
下载地址:https://github.com/Mrs4s/go-cqhttp。开源协议:AGPL-3.0 license
[warning]此机器人仅作为学习使用,请勿使用机器人进行如刷屏广告、辱骂他人等违背中华人民共和国和香港特别行政区法律法规的行为,如发生,造成的情况、责任与作者无关[/warning]
1.安装
官方文档:https://docs.go-cqhttp.org/guide/#go-cqhttp
Go-CqHttp安装比较简单,首先到Github项目里下载主程序,最好下载最新版

这篇文章以windows系统为例。
安装好后,不要直接打开,在当前路径下打开CMD窗口,输入文件名打开


选择完毕后,看到“默认配置文件已生成,请修改 config.yml 后重新启动!”按下Ctrl+C退出

在与程序同目录下会生成一个config.yml配置文件,可以用记事本打开

然后主要修改红框标注位置就行


完成之后保存,再次在CMD内运行主程序
密码登录


当看到:网络诊断完成. 未发现问题,代表完成登录。可以用小号给登录机器人的账号发消息测试是否成功登录
如果发生:登录失败、限制登陆等问题,可以尝试先用扫码登录登录后再尝试密码登录

扫码登录
扫码登陆需要在device.json里将协议设置为手表协议



当看到:网络诊断完成. 未发现问题,代表完成登录。可以用小号给登录机器人的账号发消息测试是否成功登录
2.发送对接
以上都完成后,下面就是接入了
再次打开config.yml,翻到最底下一般来说有预留的配置文件,但是测试了几次之后发现有可能不会正常生成
我就拿一个完整的配置文件给大家做样例了

地址根据实际情况填写,本地就填127.0.0.1,端口需要记住
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:5701/ # 地址
#secret: '' # 密钥
max-retries: 10 # 最大重试,0 时禁用
retries-interval: 1000 # 重试时间,单位毫秒,0 时立即
再次运行,使用浏览器访问:http://127.0.0.1:5700/send_msg?message_type=private&user_id=测试QQ号&message=%E6%B5%8B%E8%AF%95123456,将“测试QQ号”替换成小号的QQ号,然后看是否发送了一条消息给小号

测试成功后就可以进行回报对接了
3.回报对接
对接本文章用的是Python-Flask,当然也可以用其他的语言对接
首先,我们先按照如图创建一个Flask项目:

from flask import Flask,request
app = Flask(__name__)
@app.route('/',methods=['POST'])
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='127.0.0.1',port=5701)
允许协议需要包含POST协议,运行端口需要跟配置文件里的相同。
然后可以定义一个send()方法
import requests as req
def send(msg:str,id:int,type:str):
if type=='sl':
data = {'message_type': 'private',
'user_id': id,
'message': msg
}
res = req.post('http://127.0.0.1:5700/send_msg', json=data)
if res.status_code==200:
print('发送成功:'+msg+','+str(id)+'-Private')
else:
data = {'message_type': 'group',
'group_id': id,
'message': msg
}
res = req.post('http://127.0.0.1:5700/send_msg', json=data)
if res.status_code==200:
print('发送成功:'+msg+','+str(id)+'-Group')
"http://127.0.0.1:5700/"需要跟配置文件的adress监听地址相同,send_msg不变
参考:https://docs.go-cqhttp.org/
这样一个发送方法就完成了,然后获取POST回报Json的数据
需要用到request模块(from flask import request)

dataraw=request.get_json()
print(dataraw)
dataraw就是取到的json数据,为字典格式,可以直接取数据
下面列举几种常见的回报数据,可以根据post_type判断回报数据类型:
心跳包:
{'post_type': 'meta_event', 'meta_event_type': 'heartbeat', 'time': 1683272941, 'self_id': 3239858968, 'status': {'app_enabled': True, 'app_good': True, 'app_initialized': True, 'good': True, 'online': True, 'plugins_good': None, 'stat': {'packet_received': 281, 'packet_sent': 273, 'packet_lost': 0, 'message_received': 0, 'message_sent': 0, 'disconnect_times': 0, 'lost_times': 0, 'last_message_time': 0}}, 'interval': 5000}
消息(群聊内):
{'post_type': 'message', 'message_type': 'group', 'time': 1683273003, 'self_id': 3239858968, 'sub_type': 'normal', 'group_id': 657497883, 'message_seq': 1210, 'raw_message': '11111', 'message_id': 1202351978, 'user_id': 1651766989, 'anonymous': None, 'font': 0, 'message': '11111', 'sender': {'age': 0, 'area': '', 'card': '', 'level': '', 'nickname': 'Lonic', 'role': 'member', 'sex': 'unknown', 'title': '', 'user_id': 1651766989}}
消息(私聊):
{'post_type': 'meta_event', 'meta_event_type': 'heartbeat', 'time': 1683273046, 'self_id': 3239858968, 'status': {'app_enabled': True, 'app_good': True, 'app_initialized': True, 'good': True, 'online': True, 'plugins_good': None, 'stat': {'packet_received': 289, 'packet_sent': 279, 'packet_lost': 0, 'message_received': 2, 'message_sent': 0, 'disconnect_times': 0, 'lost_times': 0, 'last_message_time': 1683273046}}, 'interval': 5000}
主要就看post_type、message_type以及message就行。
3.样例
from flask import Flask,request
import requests as req
app = Flask(__name__)
def send(msg:str,id:int,type:str):
if type=='sl':
data = {'message_type': 'private',
'user_id': id,
'message': msg
}
res = req.post('http://127.0.0.1:5700/send_msg', json=data)
if res.status_code==200:
print('发送成功:'+msg+','+str(id)+'-Private')
else:
data = {'message_type': 'group',
'group_id': id,
'message': msg
}
res = req.post('http://127.0.0.1:5700/send_msg', json=data)
if res.status_code==200:
print('发送成功:'+msg+','+str(id)+'-Group')
@app.route('/',methods=['POST'])
def hello_world():
dataraw=request.get_json()
if dataraw['post_type']=='message':
if dataraw['message'].find('你好')!=-1:
if dataraw['message_type']=='private':
send('你好!',dataraw['user_id'],'sl')
else:
send('你好!',dataraw['group_id'],'grp')
print(dataraw)
return 'Hello World!'
if __name__ == '__main__':
app.run(host='127.0.0.1',port=5701)
这段代码作用是当收到消息带有关键词:你好 的时候自动回复:你好!
4.CQ-Code
官方文档:https://docs.go-cqhttp.org/cqcode/
样例:
发送图片:[CQ:image,file=http://baidu.com/1.jpg,type=flash]
type参数:flash闪图,show:修图,不写默认普通图片
@某人:[CQ:at,qq=1145141919810]
剩下的可以通过将图片或表情包发给机器人,再从后台获得对应的CQcode

5.完成
Go-CqHttp还有很多好玩的功能(定位,戳一戳等),可以在Go-CqHttp官网看到这些功能的介绍

- 感谢你赐予我前进的力量