参考项目:https://github/lss233/chatgpt-mirai-qq-bot
by:雪月三十

采用docker方式搭建 方便快捷
不建议放在云服务器上

克隆项目

git clone https://github/lss233/chatgpt-mirai-qq-bot.git
cd chatgpt-qq
cd chatgpt-mirai-qq-bot

配置Mirai

先把项目拉起来 添加上自己的账号

docker-compose run --rm mirai

当你看见终端出现

2022-12-10 04:30:19 I/MCL Addon: iTXTech MCL Version: 2.1.2-61c8bd8
2022-12-10 04:30:19 W/MCL Addon: iTXTech Soyuz 未安装,Soyuz MCL Handler 特性已禁用
2022-12-10 04:30:19 I/main: 3 plugin(s) enabled.
2022-12-10 04:30:19 I/main: Auto-login _________
2022-12-10 04:30:20 W/stderr: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
>

的时候,意味着 Mirai 启动完毕。 接下来执行命令登录机器人 QQ。

login <机器人QQ号> <机器人密码> ANDROID_PAD

然后根据提示进行即可。

当机器人账号登录成功以后,执行

autologin add <机器人QQ号> <机器人密码>
autologin setConfig <机器人QQ号> protocol ANDROID_PAD

让 Mirai 可以自动登录。

设置好后退出容器即可

配置 mirai-http-api

编辑 mirai/config/net.mamoe.mirai-api-http/setting.yml,填入以下内容:

# 这里是 ChatGPT for QQ 的所有配置文件
# 请注意:以 "#" 开头的文本均为注释
# 不会被程序读取
# 如果你想要使用某个设置,请确保前面没有 "#" 号

# 如果你想使用 go-cqhttp,则这么写:
# [onebot]
# qq=请修改为你机器人的QQ号
# manager_qq = 请修改为机器人管理员的QQ号
# 此处的  reverse_ws_host 和 reverse_ws_port 对应
# go-cqhttp 中的 反向WS Universal 地址,如:ws://localhost:6555/ws
# reverse_ws_host = "0.0.0.0"
# reverse_ws_port = 6555

# 如果你想正常用 Mirai
# 就用下面这段配置
[mirai]
qq = 2780757168
reverse_ws_host = "0.0.0.0"
reverse_ws_port = 8554
# manager_qq = 请修改为机器人管理员的QQ号

api_key = "1234567890"
http_url = "http://mirai:8080"
ws_url = "http://mirai:8080"



# ==== OpenAI 账号部分开始
[openai]
# OpenAI 相关设置
# 自定义 ChatGPT 的 browserless 接入点
# 自 3月9日 开始,不设置此项将无法正常使用 browserless 模式下的网页版 ChatGPT
browserless_endpoint = "https://bypass.duti.tech/"

# 自定义 OpenAI 的 API 接口基础地址
# 通过此功能,你可以搭建一个 OpenAI 的反向代理来避免网络问题
# 例如此项目:https://github/Ice-Hazymoon/openai-scf-proxy
# api_endpoint = "https://api.openai/v1"


# 你可以用多种不同的方式登录 OpenAI
# 你也可以登录很多个不同的账号(无限多个)
# 下面的例子会向你演示使用不同方式登录时
# 配置文件的写法

# 第 1 个 OpenAI 账号
# 使用 邮箱+密码 登录
# 优点:
# 1. 自动刷新 access_token 和 session_token,无需人工操作
# 缺点:
# 1. 需要国外网络环境
# 2. 如果使用代理,需要确保你的代理未被 OpenAI 封禁

[[openai.accounts]]
mode = "browserless"

# 你的 access_token,登录 OpenAI 后访问`https://chat.openai/api/auth/session`获取
access_token = "【这里填你的access】"

# # 如果你在国内,需要配置代理
# proxy="http://127.0.0.1:1080"

# # 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
# paid = false

# # 是否开启标题自动重命名
title_pattern="qq-{session_id}"

# # 是否自动删除旧的对话
auto_remove_old_conversations = true
# # ===== 结束 =====

# # 第 3 个 OpenAI 账号
# # 使用 session_token 登录
# # 此方法已很少人使用
# # 优点:
# # 1. 适用于通过 Google / 微软 注册的 OpenAI 账号
# # 缺点:
# # 1. 有效期较短,具体时间未知
# # 2. 登录过程需要几秒钟时间
# [[openai.accounts]]
# mode = "browserless"

# # 你的 session_token,使用方法见 README
# session_token = "一串 ey 开头的东西"

# # 如果你在国内,需要配置代理
# proxy="http://127.0.0.1:1080"

# # 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
# paid = false

# # 是否开启标题自动重命名
# title_pattern="qq-{session_id}"

# # 是否自动删除旧的对话
# auto_remove_old_conversations = true

# 第 4 个 OpenAI 账号
# 使用 api key 登录
# 当你设置了 API Key 之后
# 你就可以使用 OpenAI 中收费的 ChatGPT API、AI 画图等功能
# 优点:
# 1. 响应快
# 缺点:
# 1. 烧钱
# API Key 模式只有这两个配置项要填,别写其他的
# [[openai.accounts]]
# # 你的 API key,可以在这里看: https://platform.openai/account/api-keys
# api_key="sk-xxxxx"
# # 如果你在国内,需要配置代理
# proxy="http://127.0.0.1:1080"

# # 第 5 个 OpenAI 账号
# # # 理论上你可以添加无限多个 OpenAI 账号
# # # 你可以自行添加或删除配置文件来设置账号信息
# [[openai.accounts]]
# mode = "browserless"

# # 你的 OpenAI 邮箱
# email = "xxxx"
# # 你的 OpenAI 密码
# password = "xxx"

# # 如果你在国内,需要配置代理
# proxy="http://127.0.0.1:1080"

# # 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
# paid = false

# # 是否开启标题自动重命名
# title_pattern="qq-{session_id}"

# # 是否自动删除旧的对话
# auto_remove_old_conversations = true

# === OpenAI 账号部分结束


# # === Bing 设置部分开始
# # 如果你没有 Bing 账号,可以直接删除这部分
# [bing]

# # 第 1 个 Bing 账号
# # 理论上,你可以添加无限多个 Bing 账号。
# # 多账号的配置方法和 OpenAI 的一样。
# [[bing.accounts]]
# # 你的账号 Cookie,获取方法见 README
# cookie_content = '一串很长的文本...'
# === Bing 设置部分结束



[system]
# 是否自动同意进群邀请
accept_group_invite = true
# 是否自动同意好友请求
accept_friend_request = true

[presets]
# 切换预设的命令: 加载预设 猫娘
command = "加载预设 (\\w+)"
loaded_successful = "预设加载成功!"
scan_dir = "./presets/"

[presets.keywords]
# 预设关键词 <-> 实际文件
"正常" = "presets/default.txt"
"猫娘" = "presets/catgirl.txt"
# "default" = "presets/default.txt" # 默认预设,开启后所有的会话都会先读这个预设,谨慎使用!

模板:

# 这里是 ChatGPT for QQ 的所有配置文件
# 请注意:以 "#" 开头的文本均为注释
# 不会被程序读取
# 如果你想要使用某个设置,请确保前面没有 "#" 号
[mirai]
# Mirai 相关设置

qq = 请填写机器人的 QQ 号

manager_qq = 请修改为机器人管理员的QQ号

# 以下设置如果不懂 无需理会

api_key = "1234567890" # mirai-http-api 中的 verifyKey
# mirai api http 反向连接模式
# 使用此模式可以将本项目与 mirai 分离在两个不同服务器部署
reverse_ws_host = "localhost"
reverse_ws_port = 8554
# mirai api http 正向连接模式
# 使用此模式时需注释上面的反向连接模式
# http_url = "http://localhost:8080"
# ws_url = "http://localhost:8080"
# ==== OpenAI 账号部分开始
[openai]
# OpenAI 相关设置
# 自定义 ChatGPT 的 browserless 接入点
# 自 3月9日 开始,不设置此项将无法正常使用 browserless 模式下的网页版 ChatGPT
browserless_endpoint = "https://bypass.duti.tech/"

# 自定义 OpenAI 的 API 接口基础地址
# 通过此功能,你可以搭建一个 OpenAI 的反向代理来避免网络问题
# 例如此项目:https://github/Ice-Hazymoon/openai-scf-proxy
# api_endpoint = "https://api.openai/v1"

# 你可以用多种不同的方式登录 OpenAI
# 你也可以登录很多个不同的账号(无限多个)
# 下面的例子会向你演示使用不同方式登录时
# 配置文件的写法

# 第 1 个 OpenAI 账号
# 使用 access_token 登录
# 优点:
# 1. 适用于在国内网络环境
# 2. 适用于通过 Google / 微软 注册的 OpenAI 账号
# 3. 登录过程较快
# 缺点:
# 1. 有效期为 30 天,到期后需更换
[[openai.accounts]]
mode = "browserless"

# 你的 access_token,登录 OpenAI 后访问`https://chat.openai/api/auth/session`获取
access_token = "一串 ey 开头的东西"

# 下面是所有的 OpenAI 账号都可以有的设置
# ========= 开始 ========

# 如果你在国内,需要配置代理
proxy="http://127.0.0.1:1080"

# 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
paid = false

# 是否开启标题自动重命名
# 若为空或保持注释即不开启
# 支持的变量: {session_id} - 此对话对应的上下文 ID,若产生在好友中,则为好友 QQ 号,若产生在群聊中,则为群号
# 具体见 README 中的介绍
# title_pattern="qq-{session_id}"

# 是否自动删除旧的对话,开启后用户发送重置对话时会自动删除以前的会话内容
# auto_remove_old_conversations = true

# ===== 结束 =====

# 第 2 个 OpenAI 账号
# 使用 session_token 登录
# 此方法已很少人使用
# 优点:
# 1. 适用于通过 Google / 微软 注册的 OpenAI 账号
# 缺点:
# 1. 有效期较短,具体时间未知
# 2. 登录过程需要几秒钟时间
[[openai.accounts]]
mode = "browserless"

# 你的 session_token,使用方法见 README
session_token = "一串 ey 开头的东西"

# 如果你在国内,需要配置代理
proxy="http://127.0.0.1:1080"

# 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
paid = false

# 是否开启标题自动重命名
title_pattern="qq-{session_id}"

# 是否自动删除旧的对话
auto_remove_old_conversations = true

# 第 3 个 OpenAI 账号
# 使用 邮箱+密码 登录
# 优点:
# 1. 自动刷新 access_token 和 session_token,无需人工操作
# 缺点:
# 1. 需要国外网络环境
# 2. 如果使用代理,需要确保你的代理未被 OpenAI 封禁
[[openai.accounts]]
mode = "browserless"

# 你的 OpenAI 邮箱
email = "xxxx" 
# 你的 OpenAI 密码
password = "xxx"

# 如果你在国内,需要配置代理
proxy="http://127.0.0.1:1080"

# 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
paid = false

# 是否开启标题自动重命名
title_pattern="qq-{session_id}"

# 是否自动删除旧的对话
auto_remove_old_conversations = true

# 第 4 个 OpenAI 账号
# 使用 api key 登录
# 当你设置了 API Key 之后
# 你就可以使用 OpenAI 中收费的 ChatGPT API、AI 画图等功能
# 优点:
# 1. 响应快
# 缺点:
# 1. 烧钱
[[openai.accounts]]
# 你的 API key,可以在这里看: https://platform.openai/account/api-keys
api_key="sk-xxxxx"
# 如果你在国内,需要配置代理
proxy="http://127.0.0.1:1080"

# 第 5 个 OpenAI 账号
# 理论上你可以添加无限多个 OpenAI 账号
# 你可以自行添加或删除配置文件来设置账号信息
[[openai.accounts]]
mode = "browserless"

# 你的 OpenAI 邮箱
email = "xxxx" 
# 你的 OpenAI 密码
password = "xxx"

# 如果你在国内,需要配置代理
proxy="http://127.0.0.1:1080"

# 使用 ChatGPT Plus(plus 用户此项设置为 true 使用 legacy 模型)
paid = false

# 是否开启标题自动重命名
title_pattern="qq-{session_id}"

# 是否自动删除旧的对话
auto_remove_old_conversations = true

# === OpenAI 账号部分结束


# === Bing 设置部分开始
# 如果你没有 Bing 账号,可以直接删除这部分
[bing]

# 第 1 个 Bing 账号
# 理论上,你可以添加无限多个 Bing 账号。  
# 多账号的配置方法和 OpenAI 的一样。
[[bing.accounts]]
# 你的账号 Cookie,获取方法见 README
cookie_content = 'MUID=xxxxx; SRCHD=AF=xxxx; SRCHUID=V=2&GUID=xxxxxxxx;  MicrosoftApplicationsTelemetryDeviceId=xxxxxx-xxxx-xxxx-xxx-xxxxx; ...一串很长的文本...'
# === Bing 设置部分结束

[text_to_image]
# 文字转图片

# 是否强制开启,设置后所有的消息强制以图片发送,减小风控概率  
always = true

# 是否默认开启,设置后所有的消息默认以图片发送,减小风控概率  
default = true

# 字体大小
font_size = 30

# 图片宽度
width = 700

# 字体
font_path = "fonts/sarasa-mono-sc-regular.ttf" 

# [备用模式]起始点 X
offset_x = 50 

# [备用模式]起始点 Y
offset_y = 50 

[trigger]
# 配置机器人要如何响应,下面所有项均可选 (也就是可以直接删掉那一行)

# 全局聊天前缀,在群聊和私聊中,符合下面的前缀才会响应,可以自己增减
prefix = [ "",]

# 私聊聊天前缀,在私聊中,符合下面的前缀也会响应,可以自己增减
prefix_friend = [ "",]

# 群聊聊天前缀,在群聊中,符合下面的前缀也会响应,可以自己增减
prefix_group = [ "",]

# 直接和指定的 AI 对话(不切换AI)
# 此处的前缀是在上面的前缀之后的
# 例: 
# prefix = [ "ask" ]
# prefix_ai = { "bing-c" = ["bing"] }
# 则用户发送: ask bing 你好
# 则会直接把 “你好” 两个字发给 New Bing AI
prefix_ai = { "chatgpt-web" = ["gpt"], "bing-c" = ["bing"] }

# AI 画图的前缀
# 需要有 OpenAI 的 api_key 才能使用
prefix_image = ["画", "看"]
# 配置群里如何让机器人响应,"at" 表示需要群里 @ 机器人,"mention" 表示 @ 或者以机器人名字开头都可以,"none" 表示不需要
require_mention = "at"

# 重置会话的命令
reset_command = [ "重置会话",]

# 回滚会话的命令
rollback_command = [ "回滚会话",]

[response]
# 默认使用的 AI 类型,不填写时自动推测
# 目前支持的类型:
# chatgpt-web: 网页版 ChatGPT
# chatgpt-api: API 版 ChatGPT (GPT3.5-turbo)
# bing-c: New Bing (新必应对话风格-创造力)
# bing-p: New Bing (新必应对话风格-精确)
# bing-b: New Bing (新必应对话风格-平衡)
default_ai = "chatgpt-web"
# 匹配指令成功但没有对话内容时发送的消息
placeholder = "您好!我是 Assistant,一个由 OpenAI 训练的大型语言模型。我不是真正的人,而是一个计算机程序,可以通过文本聊天来帮助您解决问题。如果您有任何问题,请随时告诉我,我将尽力回答。\n如果您需要重置我们的会话,请回复`重置会话`。"

# 发生错误时要发送的消息
error_format = "出现故障!如果这个问题持续出现,请和我说“重置会话” 来开启一段新的会话,或者发送 “回滚会话” 来回溯到上一条对话,你上一条说的我就当作没看见。\n{exc}"

# 发生网络错误时发送的消息,请注意可以插入 {exc} 作为异常占位符
error_network_failure = "网络故障!连接 OpenAI 服务器失败,我需要更好的网络才能服务!\n{exc}"

# OpenAI 账号登录失效时的提示
error_session_authenciate_failed = "身份验证失败!无法登录至 ChatGPT 服务器,请检查账号信息是否正确!\n{exc}"

# OpenAI 提示 Too many requests(太多请求) 时的提示
error_request_too_many = "糟糕!当前收到的请求太多了,我需要一段时间冷静冷静。你可以选择“重置会话”,或者过一会儿再来找我!\n{exc}"

# 服务器提示 Server overloaded(过载) 时的提示
error_server_overloaded = "抱歉,当前服务器压力有点大,请稍后再找我吧!"

# 是否要回复触发指令的消息
quote = true

# 发送下面那个提醒之前的等待时间
timeout = 30.0

# 超过响应时间时要发送的提醒
timeout_format = "我还在思考中,请再等一下~"

# 重置会话时发送的消息
reset = "会话已重置。"

# 回滚成功时发送的消息
rollback_success = "已回滚至上一条对话,你刚刚发的我就忘记啦!"

# 回滚失败时发送的消息
rollback_fail = "回滚失败,没有更早的记录了!"

# 等待处理的消息的最大数量,如果要关闭此功能,设置为 0
max_queue_size = 10

# 队列满时的提示
queue_full = "抱歉!我现在要回复的人有点多,暂时没有办法接收新的消息了,请过会儿再给我发吧!"

# 新消息加入队列会发送通知的长度最小值
queued_notice_size = 3

# 新消息进入队列时,发送的通知。 queue_size 是当前排队的消息数
queued_notice = "消息已收到!当前我还有{queue_size}条消息要回复,请您稍等。"

[baiducloud]
# 是否启动百度云内容安全审核
# 注册地址: http://console.bce.baidu/ai/#/ai/antiporn/overview/index
check = false

# 百度云API_KEY 24位英文数字字符串
baidu_api_key = ""

# 百度云SECRET_KEY 32位的英文数字字符串
baidu_secret_key =""

# 不合规消息自定义返回
illgalmessage = "[百度云]请珍惜机器人,当前返回内容不合规"

[system]
# 是否自动同意进群邀请
accept_group_invite = false

# 是否自动同意好友请求
accept_friend_request = false

[presets]
# 切换预设的命令: 加载预设 猫娘
command = "加载预设 (\\w+)"

loaded_successful = "预设加载成功!"

[presets.keywords]
# 预设关键词 <-> 实际文件
"正常" = "presets/default.txt"
"猫娘" = "presets/catgirl.txt"

[ratelimit]
# 额度限制功能,可以在 wiki 中了解此功能的用法

# 额度使用达到此比例时进行警告
warning_rate = 0.8

# 警告消息
warning_msg = "\n\n警告:额度即将耗尽!\n目前已发送:{usage}条消息,最大限制为{limit}条消息/小时,请调整您的节奏。\n额度限制整点重置,当前服务器时间:{current_time}"

# 超额消息
exceed = "已达到额度限制,请等待下一小时继续和我对话。"

启动

接下来就可以启动整个项目了。 你可以用

docker-compose up

来启动。 如果没问题的话,可以 Ctrl + C 退出来,然后换成

docker-compose up -d

在后台启动。

维护

如果你发现你的机器人不回你了,看看是 mirai 那边出问题了,还是 chatgpt 那边出问题了。

docker-compose logs mirai

可以看见 Mirai 的运行输出。

docker-compose logs chatgpt 

可以看见本项目 chatgpt 的运行输出。

如果 Mirai 出现问题(比如说需要验证,或者重新登录等),你可以这么做:

  1. 关闭当前正在运行的 Mirai
docker-compose stop mirai
  1. 手动启动 Mirai
docker-compose run --rm mirai

然后参考配置Mirai 搞定它。

搞定之后 Ctrl + C 退出来, 然后执行

docker-compose restart

重启就行了。

成品

更多推荐

基于Mirai框架的机器人搭建