共计 3504 个字符,预计需要花费 9 分钟才能阅读完成。
# 服务器部署 qq 消息机器人 go-cqhttp
一、简介
1、介绍
官方文档地址:https://docs.go-cqhttp.org/
各种框架都只是机器人的各种实现,每个框架之间接口都不通用,编程语言也不尽相同,想要开发一个自己的机器人,换一套框架所有的代码都要推到重来,所以亟需一个规范统一各个框架,所以 OneBot 诞生了,先来看看 OneBot 是啥:
OneBot 标准:
一个聊天机器人应用接口标准
简单:
接口简单易懂,可轻松接入。
兼容性:
兼容原 CQHTTP 插件,这个标准和 CQHTTP 有啥关系?CQHTTP 是酷 Q 的一个插件,这个插件可以提供 HTTP 协议的接口供第三方系统调用,这样就和具体语言无关,什么语言都可以调用机器人接口实现自己的逻辑,而且基于 CQHTTP 已经实现了很多功能的机器人了,详情见上面优秀机器人框架,为了不让以前所有的优秀代码都要推倒重来,所以 OneBot 干脆直接在 CQHTTP 的基础之上指定标准,这就是典型的先有实现,后有标准的例子。
在这个标准的基础之上,有了各种编程语言的实现,我们称之为生态,如下:
理论上,基于 OneBot 标准开发的任何 SDK、框架和机器人应用,都可以无缝地在下面的不同实现中切换。当然,在一小部分细节上各实现可能有一些不同,这也是本项目希望推动解决的问题。
MiraiGo 就是 GO 语言实现的安卓 QQ 协议,API 很原始,相当于一个类库,go-cqhttp 是在 MiraiGo 的基础之上封装的 HTTP 协议和 Websocket 协议接口的框架,得益于 GO 语言先天的优势(资源占用少,运行简单,协程并发高),总之就是性能高,引用项目原话:
性能体现:
在关闭数据库的情况下, 加载 25 个好友 128 个群运行 24 小时后内存使用为 10MB 左右. 开启数据库后内存使用将根据消息量增加 10-20MB, 如果系统内存小于 128M 建议关闭数据库使用. 2、优点
接口:
HTTP API
反向 HTTP POST
正向 WebSocket
反向 WebSocket
拓展支持:HTTP POST 多点上报
反向 WS 多点连接
修改群名
消息撤回事件
解析 / 发送 回复消息
解析 / 发送 合并转发
使用代理请求网络图片
搭建的文档地址:https://docs.go-cqhttp.org/guide/quick_start.html
二、Windows/Linux 搭建
不管 linux 系统还是 window 系统,都需要准备 1 个挂机的 QQ 号,这个就相当于用一个不用的号来挂在服务器上实现自动回复的功能。
1、下载
在发行版中:https://github.com/Mrs4s/go-cqhttp/releases
找到属于自己系统的可执行文件,然后进行下载:
会看到生成了 go-cqhttp.bat 文件双击运行。
选择【3: 反向 Websocket 通信】,然后关闭 cmd 窗口。
然后在文件夹会生成了配置文件【config.yml】。
我们使用记事本打开这个配置文件:
打开文件后,我们暂时只需要修改两处
2.go-cqhttp 配置
config.yml 需要修改地方有那么几个。
1. 第 4 行,配置 QQ 号。uin: 改成你要挂机的 QQ 号 # QQ 账号
2. 第 103 行,Websocket 连接地址。universal: ws://127.0.0.1: 端口号随意 /qqbot/
3. 启动后会提示扫描二维码登陆,注意可能登陆失败。配置完毕后,再次执行 go-cqhttp.bat 文件,生成虚拟文件,这一步不用扫码,二维码出来后,直接关闭窗口即可
打开生成的虚拟文件:device.json,将其中的 protocol 参数改成 2
再次重新启动 go-cqhttp.bat,这时候可以扫码登录 QQ 了
用 Linux 部署同理,如果无法加载登陆二维码,可以把 windows 上登陆的 session.token,device.json 文件放到 linux 目录里,可以免登。
三、配置 Websocket 服务(和 http 服务二选一)
使用 sanic 来启动 Websocket 服务。
pip install sanic
启动 sanic 执行,创建一个你要执行的脚本,比如 server.py。
import json
from sanic import Sanic
app = Sanic('qqbot')
base_path = "/root/project_space/keyword/"
@app.websocket('/qqbot')
async def qqbot(request, ws):
"""QQ 机器人"""
while True:
data = await ws.recv()
data = json.loads(data)
print(json.dumps(data, indent=4, ensure_ascii=False))
# if 判断是群消息且文本消息不为空
if data.get('message_type') == 'group' and data.get('raw_message'):
raw_message = data['raw_message']
if raw_message == "/ 菜单":
with open(base_path + "菜单.txt", encoding="utf8") as f:
msg = f.read()
ret = {
'action': 'send_group_msg',
'params': {'group_id': data['group_id'],
'message': msg,
}
}
await ws.send(json.dumps(ret))
elif raw_message == "/ 群主介绍":
with open(base_path + "群主介绍.txt", encoding="utf8") as f:
msg = f.read()
ret = {
'action': 'send_group_msg',
'params': {'group_id': data['group_id'],
'message': msg,
}
}
await ws.send(json.dumps(ret))
elif raw_message == "/ 群主主页":
with open(base_path + "群主主页.txt", encoding="utf8") as f:
msg = f.read()
ret = {
'action': 'send_group_msg',
'params': {'group_id': data['group_id'],
'message': msg,
}
}
await ws.send(json.dumps(ret))
elif raw_message == "/Python 学习目录":
with open(base_path + "Python 学习目录.txt", encoding="utf8") as f:
msg = f.read()
ret = {
'action': 'send_group_msg',
'params': {'group_id': data['group_id'],
'message': msg,
}
}
await ws.send(json.dumps(ret))
elif raw_message == "/ 开发项目":
with open(base_path + "开发项目.txt", encoding="utf8") as f:
msg = f.read()
ret = {
'action': 'send_group_msg',
'params': {'group_id': data['group_id'],
'message': msg,
}
}
await ws.send(json.dumps(ret))
if __name__ == '__main__':
app.run(debug=True,port=5678,auto_reload=True)
if __name__ == '__main__':
app.run(debug=True,port=5678,auto_reload=True)
然后启动 server.py 脚本
最后把登陆的 qq 拉进群,就能自动消息了。
四、Http 服务用法
和上面一样的,把 config.yml 配置文件改下
发送群聊方法可以只要这些参数:
def send_group_msg(group_id, message):
send_group_msg_url = 'http://127.0.0.1:5700/send_group_msg'
params = {
# group_id 群 id
'group_id': group_id,
# 消息内容
'message': message,
}
print(params)
requests.get(send_group_msg_url, params).json()
其他用途玩法参考 : 接入 chatGpt 机器人