五分钟构建go-cqhttp QQ对话机器人
go-cqhttp的下载与安装
进入go-cqhttp的官网https://docs.go-cqhttp.org/
下载对应的安装包
然后双击安装包运行
之后会生成一个config.yml配置文件
在这个配置文件里,按照注释填写你的相关信息
这里要注意,扫码登录要求登陆设备和手机在同一网络下。
另外,要关闭QQ的设备锁。否则可能导致登录失败。
然后解掉108、109行的注释
图中信息不用修改,secret不用填写。
完善好配置config.yml之后,再次运行下载下来的exe。(如果要求通过生成的bat执行的话,就执行bat)
这样正常情况下,就可以监听到你的QQ消息了。
如果下面有长段黄色警告不用管,因为我们还没写处理程序
编写处理程序
下面来编写消息处理的脚本。
新建两个脚本main.py和script.py
其中main.py对来自群和个人的消息进行初步分类(当然,你也可以在这里做更进一步的分类)。
然后在两个脚本中分别写入以下内容
# main.py
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from flask import Flask, request
from flask_restful import Resource, Api
import script
import time
import requests
import random
app = Flask(__name__)
api = Api(app)
class AcceptMes(Resource):
def post(self):
# 这里对消息进行分发,暂时先设置一个简单的分发
_ = request.json
if _.get("message_type") == "private": # 说明有好友发送信息过来
uid = _["sender"]["user_id"] # 获取发信息的好友qq号
message = _["raw_message"] # 获取发送过来的消息
script.handle_private(uid, message)
api.add_resource(AcceptMes, "/", endpoint="index")
if __name__ == '__main__':
app.run("0.0.0.0", "5701") # 注意,这里的端口要和配置文件中的保持一致
# script.py
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import asyncio
import httpx
import random
import string
from datetime import datetime
def handle_private(uid, message): # 处理私聊信息
if message: # 简单的判断,只是判断其是否为空
remes=message
asyncio.run(send(uid, remes))
async def send(uid, message, gid=None):
"""
用于发送消息的函数
:param uid: 用户id
:param message: 发送的消息
:param gid: 群id
:return: None
"""
async with httpx.AsyncClient(base_url="http://127.0.0.1:5700") as client:
if gid is None:
# 如果发送的为私聊消息
print(uid)
params = {
"user_id": uid,
"message": message,
}
await client.get("/send_private_msg", params=params)
if gid:
print(gid)
params={
"group_id": gid,
"message": message,
}
await client.get("/send_group_msg",params=params)
然后运行main.py
如果提示没有安装flask,那就在python的scripts文件夹下运行pip install falsk
,总之提示缺少哪个包,就安装哪个包。
上面这两份代码的作用就是 将私聊发来的消息复读发回去。
同样的道理,你可以写出很多处理。
最后通过send进行发送。
获取到的消息格式,可以参考go-cqhttp官网https://docs.go-cqhttp.org/event/#%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF
返回的消息的格式,可以参考https://docs.go-cqhttp.org/api/#%E5%9F%BA%E7%A1%80%E4%BC%A0%E8%BE%93
支持传回CQ格式的语句,在返回时,输入类似[CQ:at,id=123]
式的语句,会被自动解析成对应的事件。CQ代码可以参考https://docs.go-cqhttp.org/cqcode/#%E8%BD%AC%E4%B9%89
添加API
通过上面的操作,现在就可以针对特定的消息进行预设的回复了。
本来是想根据手里的数据集和知识集训练出一个聊天机器人来着,学习成本太大,暂时放弃了。
然后就想调用一个线程的对话机器人API,但是月租金19还是低配版,我甚至不舍得充一个大会员,放弃。
最后折中了一下,找一些其他的现有API,然后自己分析生成回复语句。
很幸运发现了一个聚合这种API的网站。https://www.free-api.com/
这样只要学习一下python进行网络通信的手段就行了。
比如,我用“近期节假日”进行试验。
首先需要安装requests模块来实现网络通讯
然后用request.get('url',params)
就可以完成get请求。具体的可以百度一下。
有几个点
- 在python里面对于json数据是一个叫dict的数据类型。与js中不同,取对象的某个元素,使用'[]'符,而非'.'。例如,对于一个response的data对象,要用response["data"]来取,而非response.data。
也可能是我理解不到位,json与dict可能本就不是一个数据类型?(因为在上面python程序里,对接监听程序的response用法是和js里统一的。
- request.get 返回的是一个response <200>,这时候要用request.get().json(),就能转化成对象格式。
完成get请求之后,我根据表单格式进行处理,就可以找到今天是什么节日。