QQ机器人联合Chatgpt的一套解决方案
目录
0x00前言
使用Chatgpt的api需要一个聊天平台,可以在飞书上使用,可以在微信小程序上使用,可以做一个聊天网站然后使用,同样可以也可以用在QQ中,本次使用go-cqhttp登录QQ,nonebot2聊天框架,nonebot-plugin-chatgpt-turbo插件,v2ray代理。
本文会探讨各个文件如何配置,并最后给出两种解决方案,一种是使用系统服务来启动各个组件,方便配置,调试;另一种是使用docker-compose.yaml启动docker运行,到时候只需要准备好配置文件就可以直接启动,方便运行。
当然因为使用了nonebot,可以安装好多好玩的插件,这里也会准备一些好玩的。
0x01事前准备
目录
qq机器人使用一个名字,这里我们使用xiaoxi,也可以自定义
目录树:
- xiaoxi
- v2ray
- Dockerfile
- v2ray
- config.json
- start.sh
- nonebot
- Dockerfile
- bot.py
- pyproject.toml
- start.sh
- stop.sh
- .env.dev
- go_cqhttp
- Dockerfile
- start.sh
- go-cqhttp
- config.yml
- device.json
- docker-compose.yaml
- v2ray
以上配置只是我们需要调用或者配置的文件,还有其他文件也需要一并加入其中,这里不提而言
0x02 Docker配置
v2ray
由于使用了openai的chatgpt接口,所以需要科学的上网,也就需要一台国外的服务器,具体的过程这里不便细讲,以后可以出一篇文章细说,这里给出几个关键词:v2ray, 代理,x-ui。
最后你需要的是一个config.json文件,以及一个v2ray程序完成以下三个要求即可:
- 一个可以运行的
v2ray
可执行文件,拥有执行权限,在64位linux中运行 - 配置文件为:
config.json
,要求监听本地0.0.0.0本地的10809和10808默认即可 - 自己配置自己的国外节点
为了方便在docker中使用,我们额外配置一个启动文件start.sh :
#!/bin/sh
echo "start.sh is runing"
/root/v2ray/v2ray -config /root/v2ray/config.json
该启动文件是给docker准备的,用户可能无法正常使用。
当然,以上的我都会提供一个模板,可能v2ray不是最新版的,用户可以自己升级,只需要将确保v2ray存在,并有可执行权限,start.sh文件同理,config.json只需要按照上面的提示填入节点信息就可以。
config.json
{
"policy": {
"system": {
"statsOutboundUplink": true,
"statsOutboundDownlink": true
}
},
"log": {
"access": "",
"error": "",
"loglevel": "warning"
},
"inbounds": [
{
"tag": "socks",
"port": 10808,
"listen": null, # 为了安全,如果是docker启动,就设置null,自己使用就设置为127.0.0.1
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"settings": {
"auth": "noauth",
"udp": true,
"allowTransparent": false
}
},
{
"tag": "http",
"port": 10809,
"listen": null, # 此处同理
"protocol": "http",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
.....
注意:json没有注释,使用该配置文件的时候需要删除# 的注释信息
也可以使用v2rayN快速导出一个配置好的。
当读者完成后,可以启动v2ray,
./v2ray -config ./config.json
然后使用如下指令检查:
curl -x socks5://127.0.0.1:10808 cip.cc
观察是否返回自己服务器的ip即可
将上述文件都保存在v2ray中即可
Dockerfile
FROM alpine
RUN mkdir /root/v2ray/
CMD /root/v2ray/start.sh
测试的时候只需要确定本地能运行,能启动就可以了,不需要到docker里测试
nonebot
本次的nonebot使用的是python10,包管理使用的是poetry,方便后面的插件安装
配置主要是在.env.dev中写入一些必要的信息,最重要的就是chatgpt_apt的key
Dockerfile
FROM python:3.10
WORKDIR /root/nonebot/
COPY . .
RUN curl -sSL https://install.python-poetry.org -o install-poetry.py
RUN python install-poetry.py --yes
RUN /root/.local/bin/poetry install
CMD ./start.sh
start.sh
#!/bin/sh
/root/.local/bin/poetry run python /root/nonebot/bot.py
stop.sh
/bin/kill $(ps -ef | grep /bot.py | awk '{print $2}')
至于模组的安装:使用pip即可,
sudo docker exec -it 容器id pip install nonebot_plugin
安装后会直接修改pyproject.toml文件,之后启动会安装到镜像中。
nonebot的docker编译很慢,建议本地准备环境,然后将测试
go-cqhttp
go-cqhttp可以用来登录,但是需要提前准备好登录的device.json文件,在启动镜像的时候需要事先确定go-cqhttp已经登录完毕,验证都已经通过。
登录的时候可以直接选择协议1:android,但是需要qq登录签名。
config.json
# go-cqhttp 默认配置文件
account: # 账号相关
uin: # QQ账号
password: '' # 密码为空时使用扫码登录
encrypt: false # 是否开启密码加密
status: 0 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
relogin: # 重连设置
delay: 3 # 首次重连延迟, 单位秒
interval: 3 # 重连间隔
max-times: 0 # 最大重连次数, 0为无限制
# 是否使用服务器下发的新地址进行重连
# 注意, 此设置可能导致在海外服务器上连接情况更差
use-sso-address: true
# 是否允许发送临时会话消息
allow-temp-session: false
sign-server: 'http://192.168.100.5:8080'
heartbeat:
# 心跳频率, 单位秒
# -1 为关闭心跳
interval: 5
message:
# 上报数据类型
# 可选: string,array
post-format: string
# 是否忽略无效的CQ码, 如果为假将原样发送
ignore-invalid-cqcode: false
# 是否强制分片发送消息
# 分片发送将会带来更快的速度
# 但是兼容性会有些问题
force-fragment: false
# 是否将url分片发送
fix-url: false
# 下载图片等请求网络代理
proxy-rewrite: ''
# 是否上报自身消息
report-self-message: false
# 移除服务端的Reply附带的At
remove-reply-at: false
# 为Reply附加更多信息
extra-reply-data: false
# 跳过 Mime 扫描, 忽略错误数据
skip-mime-scan: false
output:
# 日志等级 trace,debug,info,warn,error
log-level: warn
# 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留.
log-aging: 15
# 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写
log-force-new: true
# 是否启用日志颜色
log-colorful: true
# 是否启用 DEBUG
debug: false # 开启调试模式
# 默认中间件锚点
default-middlewares: &default
# 访问密钥, 强烈推荐在公网的服务器设置
access-token: ''
# 事件过滤器文件目录
filter: ''
# API限速设置
# 该设置为全局生效
# 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
# 目前该限速设置为令牌桶算法, 请参考:
# https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
rate-limit:
enabled: false # 是否启用限速
frequency: 1 # 令牌回复频率, 单位秒
bucket: 1 # 令牌桶大小
database: # 数据库相关设置
leveldb:
# 是否启用内置leveldb数据库
# 启用将会增加10-20MB的内存占用和一定的磁盘空间
# 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
enable: true
# 媒体文件缓存, 删除此项则使用缓存文件(旧版行为)
cache:
image: data/image.db
video: data/video.db
# 连接服务列表
servers:
# 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服务器
# 反向WS设置
- ws-reverse:
# 反向WS Universal 地址
# 注意 设置了此项地址后下面两项将会被忽略
universal: ws://192.168.100.2:57732/onebot/v11/ws
# 反向WS API 地址
api: ws://your_websocket_api.server
# 反向WS Event 地址
event: ws://your_websocket_event.server
# 重连间隔 单位毫秒
reconnect-interval: 3000
middlewares:
<<: *default # 引用默认中间件
start.sh
#!/bin/sh
cd /root/go_cqhttp
./go-cqhttp
登录qq需要使用qsign签名,后面docker-compose会使用。
可以测试构建运行
cd go_cqhttp
sudo docker build .
sudo docker run -v $PWD:/root/go_cqhttp 镜像名称
docker-compse
在docker-compose中,我们创建一个可用的网络,然后让他们互相通信就可以了
version: '3'
networks:
gpt:
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
services:
nonebot:
build:
context: ./nonebot
dockerfile: ./Dockerfile
networks:
- gpt
depends_on:
- go-cqhttp
- v2ray
- qsign
volumes:
- ./nonebot/:/root/nonebot
command: ["/bin/sh","-c","/root/nonebot/start.sh"]
networks:
gpt:
ipv4_address: 192.168.100.2
go-cqhttp:
build:
context: ./go_cqhttp/
dockerfile: ./Dockerfile
volumes:
- ./go_cqhttp/:/root/go_cqhttp
command: ["/bin/sh","-c","/root/go_cqhttp/start.sh"]
depends_on:
- qsign
networks:
gpt:
ipv4_address: 192.168.100.3
v2ray:
build:
context: ./v2ray
dockerfile: ./Dockerfile
networks:
- gpt
volumes:
- ./v2ray/:/root/v2ray
command: ["/bin/sh","-c","/root/v2ray/start.sh"]
networks:
gpt:
ipv4_address: 192.168.100.4
qsign:
image: xzhouqd/qsign:8.9.63
networks:
- gpt
restart: always
environment:
ANDROID_ID: "此处是android的id"
networks:
gpt:
ipv4_address: 192.168.100.5
需要注意的是,当确定go-cqcqhttp可以运行是,就需要将对应的android的id的填入的docker-compose才行
都准备好之后,就可以使用
sudo docke-compose up -d
就可以启动服务
0x03 service配置
service配置最后的程序都是运行在本机上的,如果本机上已经可以运行机器人的所有服务,那么就可以直接使用服务启动,以下为各个配置文件:
v2ray
[Unit]
Description=v2ray
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
User=libestor
ExecStart=/path/v2ray/v2ray -config /path/v2ray/config.json
ExecStop=kill $(ps -ef |grep v2ray |awk '{print $2}')
Restart=on-failure
[Install]
WantedBy=multi-user.target
nonebot
[Unit]
Description=nonebot control service
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
User=libestor
ExecStart=/bin/bash -c "cd /path/nonebot/xiaoxi && python3 bot.py"
ExecStop=kill $(ps -ef | grep bot.py | awk '{print $2}')
[Install]
WantedBy=multi-user.target
gocqhttp
[Unit]
Description=go-cqhttp control service
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c "cd /home/libestor/nonebot/;./go-cqhttp"
ExecStop=kill $(ps -ef |grep go-cqhttp |awk '{print $2}')
[Install]
WantedBy=multi-user.target
具体内容可以在github仓库找到源代码和样例
https://github.com/Mrs4s/go-cqhttp/issues/2471