登录 立即注册

首页 > 绿虎论坛 > 公告 (发帖)

标题: 虎绿林WebSocket消息推送服务文档及参考客户端

作者: @Ta

时间: 2023-03-19发布,2023-05-03修改

点击: 14407

推送服务器源代码:

https://github.com/rkonfj/hu60bot
https://github.com/hu60t/hu60bot

@rkonfj 创建。

通过nginx转发websocket的参考配置

    location /ws/msg
    {
        proxy_pass http://127.0.0.1:4860/v1/ws;

        # proxy websocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        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 REMOTE-HOST $remote_addr;

        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
    }

WebSocket推送服务器地址:

wss://hu60.cn/ws/msg

认证方式:

  1. Cookie hu60_sid(由浏览器自动发送,不支持跨域)
Cookie: hu60_sid=用户sid
  1. GET参数_sid(支持跨域)
wss://hu60.cn/ws/msg?_sid=用户sid

参考客户端:

function connectToWebSocket() {
  const socket = new WebSocket("wss://" + location.host + "/ws/msg");
  let keepAliveTimer = null;

  // 开启 WebSocket 连接时触发
  socket.onopen = (event) => {
    console.log("WebSocket 连接已经建立");

    // 连上推送服务器后还要再查询一次消息数量接口,防止错过还没连上的这段时间发来的消息
    fetch('/q.php/user.stat.json').then(async function(result) {
        let json = await result.json();
        console.log('新内信条数:', json.newMsg, '新@消息条数', json.newAtInfo);
    });

    // 每隔一分钟发送一个 keep alive 消息,防止连接断开
    keepAliveTimer = setInterval(() => {
      socket.send('{"action":"ping"}');
    }, 60000);
  }

  // 接收到 WebSocket 消息时触发
  socket.onmessage = (event) => {
    console.log("收到 WebSocket 消息", event.data);
  };

  // 当 WebSocket 连接出错时触发
  socket.onerror = (event) => {
    console.error("WebSocket 连接出错", event);
    // 关闭当前 WebSocket 连接
    socket.close();

    // 注意:不要在此处重连 WebSocket,否则一次连接失败会触发两次重连,连接数会指数增长
    // 确保只在 onclose 中进行重连。
  };

  // 当 WebSocket 连接关闭时触发
  socket.onclose = (event) => {
    // 取消 keep alive 定时器
    clearInterval(keepAliveTimer);

    console.log("WebSocket 连接已关闭", event);

    // 重新连接 WebSocket
    setTimeout(() => {
      console.log("重新连接 WebSocket");
      connectToWebSocket();
    }, 5000); // 延迟 5 秒重新连接
  };
}

// 连接 WebSocket
connectToWebSocket();

收到的推送消息event.data可能会是以下几种格式:

  1. 刚连上时收到的消息。
{"event": "connected"}
  1. keep-alive响应,只是为了保持连接活跃。
{"event":"ping","data":"pong"}
  1. 内信推送,type字段为0
{"event":"msg","data":{"id":995610,"touid":1,"byuid":1,"type":0,"isread":0,"content":"[{\"type\":\"markdown\"},{\"type\":\"text\",\"value\":\"\\r\\n\"},{\"type\":\"face\",\"face\":\"滑稽\"}]","ctime":"0001-01-01T00:00:00Z"}}
  1. @消息推送,type字段为1。
{"event":"msg","data":{"id":995612,"touid":1,"byuid":1,"type":1,"isread":0,"content":"[{\"type\":\"atMsg\",\"uid\":1,\"pos\":\"聊天室“秘密虎穴”第688楼中\",\"url\":\"addin.chat.%E7%A7%98%E5%AF%86%E8%99%8E%E7%A9%B4.{$BID}?floor=688#688\",\"msg\":[{\"type\":\"markdown\"},{\"type\":\"text\",\"value\":\"\\r\\n\"},{\"type\":\"at\",\"tag\":\"老虎会游泳\",\"uid\":1},{\"type\":\"text\",\"value\":\",\"},{\"type\":\"face\",\"face\":\"哈哈\"}]}]","ctime":"0001-01-01T00:00:00Z"}}
  1. 机器人上下线通知
{"event":"online","data":{"uid":-50,"count":1}}

取消事件订阅

可取消订阅的事件有msgonlineoffline

不需要订阅机器人上下线事件可以在 websocket 连接建立成功后发送:

{"action": "unsub", "data": ["online", "offline"]}

后续有需要这些事件再发送:

{"action": "sub", "data": ["online", "offline"]}

查询取消订阅的事件:

{"action": "lsunsub"}

查询机器人在线列表

{"action": "lsol"}

响应格式如下:

{"event":"lsol","data":{"-50":1,"-51":1,"-56":1}}

[隐藏样式|查看源码]


『回复列表(9|显示机器人聊天)』

1.

@rkonfj,虽然我建议你改名,因为用户名SwimmingTiger不能体现你的特色,并且会与我的Github用户名发生混淆。

(/@Ta/2023-03-19 03:41//)

2.

@老虎会游泳,啥时候上插件
掌缘生灭(白)

(/@Ta/2023-03-19 04:09//)

3.
(/@Ta/2023-03-19 15:18//)

4.

@老虎会游泳,我还以为你小号

(/@Ta/2023-03-20 10:20//)

5.

@老虎会游泳,可以考虑新增机器人是否在线状态(头像右下角一个红色或者绿色圆点),依据是ws连接是否正常,并且在发帖,回帖,聊天室等输入框附近位置列出机器人列表。

(/@Ta/2023-03-21 23:37//)

6.

@rkonfj,5楼说他想要机器人在线状态。
如果想做的话,可设计为仅给出uid<0的用户状态。

(/@Ta/2023-03-22 00:17//)

7. @老虎会游泳,如何方便的将websocket返回的@消息转为html,现在是这种格式image.png(160.19 KB)
(/@Ta/2023-03-29 17:10//)

8.
(/@Ta/2023-03-29 17:10//)

9. @老虎会游泳,收到
(/@Ta/2023-03-29 17:11//)

回复需要登录

11月23日 11:38 星期六

本站由hu60wap6华为CPU驱动

备案号: 京ICP备18041936号-1