如何通过网站子URL获取对应WebSocket数据并读取二进制消息?
实现方案
完全可以实现,核心思路是针对每个子URL对应的WebSocket地址,分别建立连接并监听消息,直到收集到3条二进制消息后关闭连接。
以下是具体的JavaScript实现思路:
- 先整理需要处理的子URL对应的WebSocket地址列表(如果WebSocket地址是动态生成的,需先访问子URL,从页面源码或接口响应中提取WS地址)
- 编写通用函数处理单条WebSocket连接的消息收集:
async function collectWsBinaryMessages(wsUrl, targetCount = 3) { return new Promise((resolve, reject) => { const ws = new WebSocket(wsUrl); const collectedMessages = []; ws.binaryType = 'arraybuffer'; // 指定二进制数据的接收类型 ws.onmessage = (event) => { if (event.data instanceof ArrayBuffer) { collectedMessages.push(event.data); if (collectedMessages.length === targetCount) { ws.close(); resolve(collectedMessages); } } }; ws.onerror = (err) => { reject(err); ws.close(); }; ws.onclose = () => { if (collectedMessages.length < targetCount) { reject(new Error('连接提前关闭,未收集到足够的二进制消息')); } }; }); } - 批量处理多个WebSocket地址:
// 示例:整理好的各子URL对应的WebSocket地址列表 const targetWsUrls = [ 'wss://www.google.com/ws/123', 'wss://www.google.com/ws/3212' // 可添加更多WS地址 ]; // 批量执行消息收集任务 Promise.all(targetWsUrls.map(url => collectWsBinaryMessages(url))) .then(allResults => { // allResults为二维数组,每个元素对应一个WS连接收集到的3条二进制消息 console.log('所有二进制消息:', allResults); }) .catch(err => { console.error('收集过程出错:', err); });
需要注意的细节:
- 若WebSocket地址需从子URL页面动态获取,可通过
fetch访问子URL,再用DOM操作或正则匹配提取WS地址 - 需处理连接失败、中途断开等异常场景,避免因意外情况导致消息收集不全
- 若遇到浏览器同源策略限制,可使用浏览器用户脚本(如Tampermonkey)绕过,或通过后端代理转发WebSocket请求
内容的提问来源于stack exchange,提问作者DamaXin
相关产品推荐
相关产品推荐

