官方机器人webhook连接下的本地调试方法

如果你使用了 官方机器人 的 webhook 连接方式,

并且你的机器人实际运行在 云服务器 上,

但是你的 koishi开发环境 却在日常使用的电脑上

那么你一定会遇到这样的问题:


由于官方机器人的 webhook 请求地址只能配置一个,

请求地址配置页

所以如果你想要使用webhook来进行开发调试的话。基本只有两个方法:

  1. 让开发模式和生产模式在同一个koishi实例,这样就可以保证开发的同时 原有功能 不会受影响

  2. 让开发模式和生产模式 单独各开一个koishi实例 ,这样就可以让他们各干各的,原有功能不受影响的同时还能开发新功能。


然而你很快就会注意到这样的问题:

你如果仅多开适配器,那就意味着你的生产模式和开发模式要在同一个实例,这....显然不可取

你如果多开koishi实例,会遇到这样的需求:需要反代同一个路径(因为可配置的请求地址就一个)到两个koishi地址。

换言之,你就需要解决的其实是: 流量如何转发到多后端




思路: 既然消息会下发到 q.qq.com配置的请求地址 里,

那么只需要让这个请求地址的内容 再下发到其他路径不就好了


解决方法:

第一步 流量镜像分发

使用 Nginx mirror 模块

mirror模块 从 Nginx1.13 开始就是内置了,

所以只要是 1.13 版本以后就可以直接使用,不需要重新编译nginx。

可以参见官方文档地址 → Module ngx_http_mirror_module


那么 在 1.13 版本以后的nginx里,

该如何修改配置文件 ,实现 流量镜像分发 呢?


假设,你的 koishi 生产模式和开发模式的地址分别是

http://127.0.0.1:8000/qq
http://127.0.0.1:15155/qq

这代表:

生产模式是运行在 8000 端口的,并且 adapter-qq 的监听路径是 `/qq`

开发模式是运行在 15155 端口的,并且 adapter-qq 的监听路径也是 `/qq`

这里有一份 对应的 示例 nginx.conf 文件内容

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;  # 你的私钥路径

        # 处理 /qq 路径的请求,并镜像到 /qq1 和 /qq2
        location /qq {
            # 镜像请求到 /mirror_to_qq1 
            mirror /mirror_to_qq1;

            # /qq 路径的反向代理(生产模式的koishi监听路径)
            proxy_pass http://127.0.0.1:8000/qq; 

            # 支持 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;
        }

        # 镜像到 /qq1
        location = /mirror_to_qq1 {
            internal;
            # /qq1 路径的反向代理 (开发模式的koishi监听路径)
            proxy_pass http://127.0.0.1:15155/qq;
            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;
        }
    }
}

像这样配置 nginx ,

我们就可以实现 让 http://127.0.0.1:8000/qqhttp://127.0.0.1:15155/qq 的 koishi 都可以接收到用户消息了


那么如何在本地运行开发环境呢?

这里就不得不提到一个十分好用的好东西了!

FRP可以让你 借助云服务器的公网IP 实现穿透你的本地服务:


第二步 代理本地的koishi

首先我们下载了这两个项目的release内容:


下载之后,我们得到了两个压缩包,

其中的 frp_0.61.1_windows_amd64.zip 是需要放在云服务器上的

frpmgr-1.19.2-x64.zip 是我们需要本地来使用的


如何使用呢?

首先把 frp_0.61.1_windows_amd64 解压后放到云服务器上的某个文件夹内

我们需要在云服务器上使用到的就是这两个文件:

  • frps.exe :服务端穿透工具
  • frps.toml :服务端穿透工具的配置文件

你可以使用记事本打开 frps.toml

可以看到内容只有

bindPort = 7000

这代表 服务端frp 运行时候会使用的端口为 7000 ,

这里我们默认即可,无需修改(关闭记事本)


启动 frps.exe

在 资源管理器的地址栏输入

cmd

然后回车

就可以打开命令提示符的窗口

然后我们输入

frps.exe

即可通过调用 启动 frps.exe


然后我们就可以在配置本地的穿透内容啦


在本地 把 frpmgr-1.19.2-x64.zip 解压到一个文件夹里

解压后可以看到有一个 frpmgr.exe

我们可以直接双击运行

image


配置 frpmgr

先点击左下角的【新建配置】

然后我们填写这个客户端的名称,嘛随便都行

主要需要注意的是:

  • 服务器地址: 需要填入配置了 frps.exe 的云服务器的公网IP

  • 服务器端口:frps.toml 配置的 bindPort 端口(默认为 7000)


新建代理

先点击【添加】按钮,

然后我们填入对应的名称和地址和端口

注意:

  • 本地地址: 就是你的本地地址啦

  • 本地端口: 需要代理的服务运行的端口

  • 远程端口: 你希望把这个本地端口映射到服务器上的哪个端口?(注意这里示例的是 15155 端口,这是因为上文中我们提及了,nginx.conf 里的 koishi开发模式的运行在 http://127.0.0.1:15155/qq ,你需要根据你实际的 nginx.conf 来填写哦)

然后就可以开启这个代理啦


有任何问题可以看日志哦


如果顺利,那么你在日志看到的内容应该是

start proxy success




不出意外的话,

你就可以在 云服务器 上 访问到 http://127.0.0.1:15155/qq

你可以在云服务器上的浏览器里输入 http://127.0.0.1:15155/qq ,可以看到你本地的开发模式的koishi哦

虽然 示例图片的服务器网络不是很好 但是可以看到标签页展示出了【koishi 控制台】的字样

应该是可以访问的!(无误,关掉浏览器)


然后我们就可以在本地开发模式的koishi实例里 接收到 webhook 的消息啦~

响应成功呢~

当然 生产模式的功能也维持住了呢(在云服务器上)




当然,你也可以通过一样的方法,把生产模式也放到本地来嗯

1 个赞

Koishi 自带了这样的功能啊,生产环境上开一个 Satori 插件就行了

为啥又是 nginx 又是 frp 穿透的,这功能 Koishi 自带啊

脑子多转转(

3 个赞

38519b50dbc944d4abac9e6f3f6dd880

1 个赞