五分钟构建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请求之后,我根据表单格式进行处理,就可以找到今天是什么节日。

posted @ 2022-09-20 21:17  wxyww  阅读(3225)  评论(4编辑  收藏  举报