QQ官方机器人 WebHook 转 WebSocket ——使用中转后端 让你的机器人使用 WebSocket 过度为 WebHook


由于 QQ 官方声明,WebSocket 协议将在2024年年底不再维护,

然而目前 adapter-qq 还并未适配 WebHook 方法。

所以为各位开发者提供此思路,

可以快速将 QQ 机器人 WebHook 转换为 WebSocket 协议,

并通过 WebSocket 协议将消息推送到 Koishi(使用 koishi-plugin-adapter-qq-webhook-websocket 进行处理)。


请注意,本项目仅为过渡性解决方案,

存在不稳定性,不保证长期有效性,

使用时请谨慎评估风险!

1 个赞

在教程开始之前,你还需要准备几样东西哦:

  1. 一个域名
    2 一个SSL

你需要确保可以通过

https://你的域名

访问得到内容

比如这样网页这样 → https://webhook.company/

(如果你已经完成此步/达到此要求,请向下移步至对应教程处)


当然如果你完全不知道该怎么做

我们接下来也会教你如何搭建这样一模一样的网站


1 个赞

购买-搭建 域名+SSL


为了演示

我们此处示例使用介于 野鸡和大厂之间的 雨云 服务器

来演示


可以首先来到雨云官网 → https://app.rainyun.com/

在登录/注册账号后,我们前往购买一台服务器+域名+申请SSL证书


第一步 → 购买云服务器

我们前往 → 雨云 - 新一代云服务提供商

这里我选择的是 香港的服务器

考虑到大部分看此教程的用户,我们此处电脑系统选择 Windows server 2025

当然,4G 内存就够我们使了,2G其实也行 只是操作起来太卡了啦~


购买之后 我们就可以在这里看到我们购买了的服务器了

雨云 - 新一代云服务提供商




第二步 → 购买域名

来到 域名注册的页面 → 雨云 - 新一代云服务提供商

我们可以搜索自己喜欢的英文单词作为域名


这里呢

我们演示的话 就选一个叫 webhook 的吧

然后看看价格 我们差不多选择这个吧 → webhook.company

由于我之前已经买过了 所以这里显示的是暂不可用


然后我们就需要付款了捏

注意这里 如果你是第一次买 那么这里是需要填写【实名认证模板】的

请如实填写哦~

然后点击最下方的【付款】


买完域名之后 我们需要把他与我们对应的服务器IPV4地址相对应解析

我们来到这个页面 → 雨云 - 新一代云服务提供商

选择你购买的对应的域名,然后点击【设置】按钮

我们需要先添加一个解析记录

然后按照我们这个来选即可

注意其中:

  • 一定要选择对应的雨云产品ID(就是云服务器的产品ID)
  • 主机名称要写 @ ,不是让你起名字。。。。
  • 其他默认即可

点击【添加】


在这之后的 2 到 24 小时之内 这个就会生效啦~

你就可以通过域名访问了呢




为了成为安全的网站

我们还必须要有证书呢!

第三步 → 申请 SSL 证书

我们可以在雨云免费申请SSL证书

雨云 - 新一代云服务提供商

我们刚才购买的是

webhook.company

所以在这里我们需要这样填写哦

我们点击【立即验证】之后就会有一个这个 申请记录 啦

我们点击右侧的【小眼睛】

image

我们需要先分别记录一下这两个内容

然后我们来到 【域名解析设置】 这里 → 雨云 - 新一代云服务提供商

填入之后呢

应该就会有这样的两个记录啦

然后 这个时候 我们再回到 SSL证书 这里 点击 【立即验证】


如果你出现了
image

那请你再仔细检查检查 是不是弄错了什么


如果你出现了

image

那你需要再等待一会

毕竟上面说啦嘛 2 到 24 小时生效

你也可以在这里验证SSL的有效性 → SSL Server Test (Powered by Qualys SSL Labs)


最终 我们可以得到这样的结果


然后我们来下载一下证书

下载得到一个压缩包

这个压缩包里有我们需要的证书啦

你需要解压后放到一个文件夹里


接下来 我们需要配置 Nginx 啦


1 个赞

配置 Nginx


我们登录到 云服务器

这里如果你的 Windows 连接 Windows

我们可以使用 RDP 来远程桌面连接


我们在这里找到服务器的 公网IP 用户名 密码


填入到对应的地方 然后就可以连接啦

注意用户名不要写错哦


然后我们来到了服务器上,

需要先去几个地方下载/安装一些软件

我这里列出本教程需要下载的软件哦


这些软件的安装就不在此赘述了


好的 假设你现在已经安装好了 python环境 和一个编辑器 可以编辑python文件、nginx配置文件

那现在我们就可以继续了


配置 nginx

我们找到 nginx 所在位置

找到配置文件 nginx.conf

image

我们可以使用VScode打开,
并且编辑

我们需要修改内容哦

你可以参考我的呢~

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    # 重定向所有 HTTP 请求到 HTTPS
    server {
        listen 80;
        server_name localhost webhook.company;
        return 301 https://$host$request_uri;
    }

    # HTTPS 服务器(443端口)
    server {
        listen 443 ssl;
        server_name webhook.company;

        ssl_certificate      C:/server/nginx/ssl/cert.pem;  # 你的证书路径
        ssl_certificate_key  C:/server/nginx/ssl/cert.key;  # 你的私钥路径

        # 反向代理到 FastAPI 服务(这是之后要用到的python转换webhook所需的)
        location / {
            proxy_pass http://127.0.0.1:8000;

            # 支持 WebSocket 的必要头字段
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            # 传递客户端的真实 IP 地址等信息
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

注意!

这里的

        ssl_certificate      C:/server/nginx/ssl/cert.pem;  # 你的证书路径
        ssl_certificate_key  C:/server/nginx/ssl/cert.key;  # 你的私钥路径

必须换成你的自己的路径

这两个文件就是你的证书文件,这在上一步的最后 我们下载的压缩包里有哦
你需要把他放到服务器上,并且填的是服务器上的证书的绝对路径

然后保存这个文件


我们在nginx.exe所在文件夹 的地址栏 输入

cmd

然后回车

就会弹出一个 黑框框

然后我们让nginx检查一下我们的配置文件对不对,
我们输入

nginx -t

如果输出有【successful】字眼,即代表正确

C:\server\nginx>nginx -t
nginx: the configuration file C:\server\nginx/conf/nginx.conf syntax is ok
nginx: configuration file C:\server\nginx/conf/nginx.conf test is successful

C:\server\nginx>

然后我们就可以双击 nginx 让他启动服务

要确保他在运行哦


到这里

你的网页应该就是和我一样了!

尝试使用 https 和你的 域名 访问看看吧!


1 个赞

配置 WebHook 转 WebSocket ——python中转后端


灵感来源 感谢 GitHub - DevOpen-Club/qbot-webhook-to-websocket: ✨将QQ机器人的WebHook方式的消息推送变换为Websocket

也十分感谢 霆生 的代码

此项目为 原版 开源 不带授权系统

本教程分享的文件的这个授权是霆生加上去的 (是霆生加上去的,但是没传项目)


放到这个 蓝凑云 里 单纯是方便下载呢(总不能放我的项目下吧((()




先下载项目

并且解压到服务器上的某一处文件夹


在文件夹地址栏输入

cmd

在有python环境 的基础下

我们使用 pip 安装依赖

pip install -r requirements.txt


然后我们启动这个项目

python  main.py

出现

http://0.0.0.0:8000e[0m (Press CTRL+C to quit)

这样的字眼就是代表启动成功了呢


遇到问题的话 大概率是什么依赖没安装

尝试百度或者问问AI吧?




接下来 哦我们需要配置 一下这个项目

文件结构:

project/
├── auth.json
├── static/
│   └── favicon.ico(这个没了也无所谓)
├── doc.md
├── main.py
├── README.md
└── requirements.txt

其中关于 auth.json 需要重点说明

{
    "机器人1的秘钥": {
        "auth_time": "2077-12-06T14:10:40.506893",
        "create_time": "2024-12-06T13:10:40.506893"
    },
    "机器人2的秘钥": {
        "auth_time": "2077-12-06T14:10:40.506893",
        "create_time": "2024-12-06T13:10:40.506893"
    },
}

实际使用的时候呢

我们可能会需要多个机器人同时连接同一个中转服务器

所以这里可以填多个机器人的秘钥用于验证


秘钥:必填哦,官方机器人的秘钥
auth_time: 授权结束时间
create_time: 注册时间


然后我们的地址是这样的

webhook地址:
https://{域名}/webhook?secret=机器人密钥
ws地址:
https://域名/ws/密钥

如果是同台服务器,
127.0.0.1:8000/ws/密钥
就行了

注意:此项目仅是不成熟的尝试

你可以改下python项目

让密钥不暴露到回调地址上

要多个机器人的话

仅需多个秘钥即可

无需多开 python main.py换端口运行再跑一个py


1 个赞

迁移机器人

配置开放平台


确保 python 中转运行正常的情况下

像我这样就好啦

你可以看到 终端有这样的输出

[1mPOST /webhook?secret=Po.......................0 HTTP/1.1e[0m" e[32m200 OKe[0m

就是代表验证成功啦

(200 OK)




配置 koishi

在koishi安装插件

koishi-plugin-adapter-qq-webhook-websocket

至于目前怎么安装 请参考


这个插件的配置项,仅有一个与原 adapter-qq 不一样

你需要填入的格式是

wss://你的域名/ws/秘钥

比如本教程演示的就是

wss://webhook.company/ws/Po..............................0


然后我们开启插件

可以看到日志输出

2024-12-09 21:32:57 [I] loader apply plugin adapter-qq-webhook-websocket:akybey
2024-12-09 21:32:57 [I] adapter connect to server: wss://webhook.company/ws/Po...........................0

这就代表我们链接成功了!

可以尝试与机器人对话了哦~


1 个赞

*已知的一些 不明确的 不兼容的问题


  1. 撤回行为:超时/bad request报错 但是实际上成功撤回了。

好像是因为没有返回值导致的


其他 待补充

1 个赞

期待 官方适配


这样的方法 不是长久之计哦~

希望 adapter-qq 能早些适配 webhook 吧~

1 个赞

adapter-qq 支持 WebHook 的 PR 目前应该是已经可用的状态,不过作者还没有做完所有工作。作者似乎这两天比较忙?

2 个赞

教程仙人

2 个赞

写的真好,很亲切,初恋的感觉。

1 个赞