基于cqhttp机器人项目整合chatgpt的python代码

文章介绍了如何通过部署开源项目Go-cqhttp建立QQ机器人,并使用非官方的F2API接口模拟ChatGPT对话。在Python的Flask环境中,当QQ机器人接收到消息时,通过F2API向ChatGPT提问并获取回复,再由QQ机器人发送回群聊。此外,文章还涉及了在云服务器上的容器化部署以及端口配置问题。
摘要由CSDN通过智能技术生成

准备工作

首先就是要先部署好下面的这个开源的机器人项目,项目地址和部署的教程都在这了。

GitHub - Mrs4s/go-cqhttp: cqhttp的golang实现,轻量、原生跨平台.

 在BV1Ck4y1K7wm这个

记得一定要选择http模式进行部署 

 连接chatGpt和qq机器人

上面的机器人部署好之后可以通过http请求操控qq机器人行为和获取qq的消息。

所以这里代码的主要实现思路就是接受qq收到的消息,利用chat-gpt提供的接口,进行提问后返回答案再让qq机器人去回答。

这里使用的不是chat-gpt的官方接口,因为那个要一直开着梯子才行,如果放到云服务器进行托管就没法用了,所以这里用了国内的接口。

F2API

在这个地址进去之后获取到下面的信息

主要是用到下面的CURL请求。

在线curl命令转代码

在这个curl转代码的网站将这个请求转换成在python中发请求的格式。

 然后再结合qq机器人的相关http路径就可以进行消息转发了。

代码要在Flask环境运行。

项目会监听qq机器人yml配置文件里面的消息转发的出口(在下图中的5000端口)获取到数据,再通过5700端口发送消息。

注意事项:  代码里面应该是监听5701端口,但是运行之后却还是监听5000端口,所以只能把yml文件里面的端口改成5000.所以要看项目启动时具体监听的端口号来配置。

import requests
from flask import Flask, request


app = Flask(__name__)
bot_id = '' #写上qq机器人的qq号


def openai_reply(question,id) -> str:
    if len(question)>1000 :
        return "单次会话数据过多,已重置。"

    headers = {
        # Already added when you pass json= but not when you pass data=
        # 'Content-Type': 'application/json',
        'Authorization': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    }
    json_data = {
        'model': 'gpt-3.5-turbo',
        'messages': [
            {
                'role': 'user',
                'content': str(question+' 简单说明'),
            },
        ],
        'temperature': 0.7,
    }
    response = requests.post('https://api.f2gpt.com/v1/chat/completions', headers=headers, json=json_data)

    # 转换成json格式数据方便提取
    response = response.json()
    print('本次消费的token总数量:'+str(response['usage']['total_tokens']))
    choices = response['choices']
    first_item = choices[0]
    return first_item['message']['content']


@app.route('/', methods=["POST"])
def post_data():
    if request.get_json().get('message_type') == 'group':            # 如果是群聊信息状态码
        # 获取需要的消息
        Qun_id = request.get_json().get('group_id')                       # 那个群发的
        QQ_name = request.get_json().get('sender').get('nickname')        # 发送者人的昵称叫啥
        QQ_id = request.get_json().get('sender').get('user_id')           # 发送者的QQ号
        msg = request.get_json().get('raw_message')               # 发的什么东西

        if str("[CQ:at,qq=%s]" % bot_id) in msg:
            msg = msg.replace(str("[CQ:at,qq=%s]" % bot_id), "")
            msg = openai_reply(msg, str(QQ_id))
            requests.get("http://127.0.0.1:5700/send_group_msg?group_id={0}&message={1}".format(Qun_id,
                                       "[CQ:at,qq=%s]" % QQ_id + msg))
        return 'OK,do not say anymore'

    return 'OK'  # 对go-cqhttp进行响应,不然会出现重试,但是只要设置重试次数为0就不会重试了。

app.run(debug=True, host='127.0.0.1', port=5701)  #监听本机的5701端口(数据来源于go-cqhttp推送到5701端口的数据)

效果演示

在qq群内@机器人发送问题,机器人会@发送者然后给出答案。

在qq机器人的日志输出就可以看见这些监听到的消息和发送的消息了。 

在云服务器上进行容器化部署

要部署在容器里面就要进行端口映射???好像也不用,在容器里面运行的话都是用的127.0.0.1。

所以要做的就是在容器里面准备好java环境给qq机器人项目运行,准备好python项目给这个python项目运行就可以了。

总结一下:

在云端部署不能使用官方提供的docker镜像部署,否则在做端口映射时,docker会抢占外部python的flask项目的5000端口。因此只能将tar.gz文件下载下来自己手动上传,可以使用xftp,图形化界面,直接拖拽上传。

而且签名服务器不能像Windows上部署时一样使用本地作为签名服务器,需要自己搭建signserver或者使用别人搭建的signserver服务器。

剩下的就没什么了,就是开个tmux给机器人的代码和flask项目一起跑就可以了。这样就可以一直运行了。

运行效果如下:

左边是机器人的日志,右边是flask项目的日志。然后群里面也可以正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值