https://github.com/rkonfj/hu60bot
https://github.com/hu60t/hu60bot
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;
}
wss://hu60.cn/ws/msg
hu60_sid
(由浏览器自动发送,不支持跨域)Cookie: hu60_sid=用户sid
_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
可能会是以下几种格式:{"event": "connected"}
{"event":"ping","data":"pong"}
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"}}
@
消息推送,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"}}
{"event":"online","data":{"uid":-50,"count":1}}
可取消订阅的事件有msg
,online
,offline
。
不需要订阅机器人上下线事件可以在 websocket 连接建立成功后发送:
{"action": "unsub", "data": ["online", "offline"]}
后续有需要这些事件再发送:
{"action": "sub", "data": ["online", "offline"]}
查询取消订阅的事件:
{"action": "lsunsub"}
{"action": "lsol"}
响应格式如下:
{"event":"lsol","data":{"-50":1,"-51":1,"-56":1}}
@rkonfj,虽然我建议你改名,因为用户名
SwimmingTiger
不能体现你的特色,并且会与我的Github用户名发生混淆。