Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Websocket 系列错误原因及解决方法汇总 | FAQ Enchanted #142

Open
lss233 opened this issue Feb 16, 2023 · 4 comments
Open

Websocket 系列错误原因及解决方法汇总 | FAQ Enchanted #142

lss233 opened this issue Feb 16, 2023 · 4 comments
Labels
documentation Improvements or additions to documentation

Comments

@lss233
Copy link
Owner

lss233 commented Feb 16, 2023

当机器人不回你的时候,有很大一种可能就是 ChatGPT 程序正在不断地输出 Websocket reconnecting 错误信息,如下图所示:
05Q$}IW%RHB LZD$D%93I

Websocket 在这里是做什么用的?

让 ChatGPT 接入 QQ 的过程相当复杂,但只要合理的使用现有的开源项目,这个功能就可以实现。

在这里,我们主要使用了两个软件:Mirai 和 chatgpt-mirai-qq-bot。

  • Mirai: 负责和 QQ 服务器通信,由 project-mirai 团队开发
  • chatgpt-mirai-qq-bot: 负责和 ChatGPT 服务器通信,即本项目

Mirai 和 chatgpt-mirai-qq-bot 之间则使用 Websocket 进行通信,将两者连接起来。

Mirai 端负责实现 Websocket 通信的功能由一个叫做 mirai-api-http 的插件实现。

chatgpt-mirai-qq-bot 的 Websocket 通信功能则由一个叫 Aridane 的框架实现。

你看见的不断刷新的错误,就是由 Aridane 输出的。

即,整个系统的通信流程为:

ChatGPT <---> chatgpt-mirai-qq-bot <--内部代码--> Aridane <--Websocket--> mirai-api-http <-- 插件加载--> Mirai <---> QQ 

错误出现的原因

要让 ChatGPT 收到来自 QQ 的消息,我们得保证上面的每一个通信环节都没有问题才行。

而我们需要关注的地方主要就在

chatgpt-mirai-qq-bot <--内部代码--> Aridane <--Websocket--> mirai-api-http <-- 插件加载--> Mirai

这个环节。

我们从右往左看,先看 Mirai。

1 Mirai:是否加载了 mirai-api-http?

在启动阶段时, Mirai 会输出 mirai-api-http 的运行情况。

你可以观察日志,看看有没有这样下图中白框中的文本:

image

如果没有,说明你没有安装 mirai-api-http插件。

怎么办?

  1. 通常来说,如果你使用的是 Linux 一键脚本部署、 Docker-Compose 部署等方法,那么这个 mirai-api-http 肯定是自带了的。
    唯一的可能就是你自己修改了 Docker 容器里的东西,把它给删了。
    解决方法:重新部署一次。

  2. 对于 Windows 快速部署包 的用户,这个 mirai-api-http 也是自带了的,只不过它是在初始化的过程中帮你安装上的。
    出现这个问题的可能原因是初始化的过程中安装失败了。
    解决方法:重新执行 初始化.cmd

  3. 对于其他方法的用户。
    这就不属于我的已知范畴了,你应该知道如何解决。

2 mirai-api-http: 配置是否正确?

Websocket 连接建立有两要素:

  1. 服务器地址和端口号
  2. 服务器的密钥要正确

你得保证这两个设置在两个软件之间的设置是一样的。

怎么看?

地址和端口号可以在这里看见:
image

后面的 localhost:8080 就是现在的地址和端口号。

密钥有两种情况:

  1. 密钥认证被设置为关闭状态:
    image

  2. 密钥认证是开启的状态:
    image
    后面的 1234567890 就是你的认证密钥。

我怎么知道这些设置是不是正确的?

  1. 通常来说,如果你使用的是 Linux 一键脚本部署、 Docker-Compose 部署等方法,那么正确的地址和端口号应该为: mirai:8080
    含义:mirai 是地址,8080 是端口。 这是为了让它监听在 mirai 容器的 8080 端口。

  2. 对于 Windows 快速部署包 的用户,正确的地址和端口号应该为: localhost:8080
    含义:本地机器上的 8080 端口。

  3. 对于其他方法的用户。
    这就不属于我的已知范畴了,你应该知道如何解决。

  4. 那密钥呢?
    如果你的密钥认证是关闭状态,那么你就可以忽略这个设置。
    如果你的密钥认证是开启状态,那么你先记住它,因为我们后面要用到。

我要怎么修改它?

它的设置在 ./mirai/config/net.mamoe.mirai-api-http/setting.yml 这里面,你可以看见。

adapters:
  - http
  - ws

enableVerify: true
verifyKey: 1234567890 # 这里是密钥

debug: false

singleMode: false

cacheSize: 4096

adapterSettings:
  http:
    host: localhost # 这里是地址
    port: 8080        # 这里是端口
    cors: ["*"]
    unreadQueueMaxSize: 100
  ws:
    host: localhost # 这里是地址
    port: 8080        # 这里是端口
    reservedSyncId: -1

3. Aridane <-> mirai-http-api: QQ 没登录

前面说过, Mirai 是用来登录 QQ 的。

如果你没有登录机器人账号,那么也会导致这个问题的出现。

怎么看?

还是刚刚那段日志,我们看最后几句话。

如果你看见了:
image

这说明 QQ 没有登录。

怎么办?

  1. 对于 Linux 一键脚本部署、 Docker-Compose 部署等方法的用户:
    第一步: 执行 docker-compose run --rm mirai 开启一个临时用来登录的容器

    第二步:输入登录命令,登录 QQ,完成验证码

    第三步:输入自动登录设置命令。

    • 要输入两个命令,它们的格式是:
      • autologin add 把这里换成你的机器人QQ号 把这里换成你机器人的密码 然后回车。
      • autologin setConfig 把这里换成你的机器人QQ号 PROTOCOL ANDROID_WATCH 然后回车。

    第四步:登录成功以后,按下 Ctrl + C 退出临时容器。

    第五步:执行 docker-compose restart mirai, 重启 mirai 容器

  2. 对于 Windows 用户,你只需要做第二步和第三步就可以了。

如果你在登录的时候遇到了这个问题:
image

请参考 #107

4. chatgpt-mirai-qq-bot <-> Aridane: 配置有误

如果前面几步都没问题,那么肯定是这一步有问题。

打开 chatgpt-mirai-qq-bot 的配置文件(即 config.cfg),你可以看见这么一段:

[mirai]
qq = 把这里改成你机器人的QQ号
api_key = "1234567890"
http_url = "http://localhost:8080"
ws_url = "http://localhost:8080"

还记得我们在第二步里提到的服务器地址端口号密钥吗?它就是填在这里的。

如果你的服务器地址是 localhost,端口号是 8080,密钥是 1234567890,那你应该这么填:

[mirai]
qq = 把这里改成你机器人的QQ号
api_key = "1234567890"
http_url = "http://localhost:8080"
ws_url = "http://localhost:8080"

如果你 的服务器地址是mirai,端口号是8080,密钥是1234567890,那你应该这么填:

[mirai]
qq = 把这里改成你机器人的QQ号
api_key = "1234567890"
http_url = "http://mirai:8080"
ws_url = "http://mirai:8080"

如果你的密钥认证是关闭状态,那你可以随便填这里的 api_key

改完以后,重启 chatgpt 即可。

Linux 一键部署、Docker-Compose 用户重启方法:执行 docker-compose restart chatgpt

Windows 重启方法:关掉那个一直在刷 Websocket is reconnecting 的窗口,然后双击 启动ChatGPT.cmd

@lss233 lss233 added the documentation Improvements or additions to documentation label Feb 16, 2023
@laoutiao
Copy link

这个还有一种情况(我自己的发生的)

我把原来的docker-compose.yml分开了
(就是一个docker-compose文件只有mirai,另一个docker-compose文件只有chathpt,并且这两个文件不在一个目录)

然后我就报错了,我发现我所有配置都没错就是无法连接。

(后面我就发现了,可能是因为我把两个容器分开安装,两个docker使用的网络模式可能就不是同一个,所以chatgpt始终无法连接到host=“mirai”的服务)

如果你也是像我一样,分开安装,然后报错,就直接把容器都删掉,重新用一个docker-compose文件安装即可

@weiyanju
Copy link

weiyanju commented Feb 17, 2023

image
请问这个问题该怎么解决,mirai中有此报错,但能登录QQ,没有出现本贴1中的白框内容,重新初始化后仍无法解决该问题,chatGPT不断输出 Websocket reconnecting 错误信息

@lss233
Copy link
Owner Author

lss233 commented Feb 17, 2023

image 请问这个问题该怎么解决,mirai中有此报错,但能登录QQ,没有出现本贴1中的白框内容,重新初始化后仍无法解决该问题,chatGPT不断输出 Websocket reconnecting 错误信息

你这是端口被占用了。 8080端口跑了别的程序,导致无法使用。
这种情况你需要同时修改 mirai-api-http 和 config.cfg 把 8080 换成别的数字

@lss233 lss233 changed the title Websocket reconnecting 错误原因及解决方法汇总 | FAQ Enchanted Websocket 系列错误原因及解决方法汇总 | FAQ Enchanted Feb 19, 2023
@Eric6286
Copy link

我按照上面的方法排查了,也将8080换成了没有占用的11451,但仍然出现像这样的报错
Snipaste_2023-03-19_08-29-44

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

4 participants