准备工作
首先就是要先部署好下面的这个开源的机器人项目,项目地址和部署的教程都在这了。
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, requestapp = 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项目的日志。然后群里面也可以正常运行。