From 1e1111c11298126659b617cd24f31dcc00a0c5ff Mon Sep 17 00:00:00 2001 From: MoeFurina Date: Fri, 13 Mar 2026 23:03:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=8A=93=E5=8C=85=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example.html | 125 ----------------------------------- src/client/app.js | 18 +++++ src/client/public/index.html | 117 +++++++++++++++++++++++++++----- src/index.js | 16 +++++ 4 files changed, 136 insertions(+), 140 deletions(-) delete mode 100644 example.html diff --git a/example.html b/example.html deleted file mode 100644 index de78a17..0000000 --- a/example.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - 网易云音乐 API Enhanced - - - -
- - -
-

状态

-
-
Base URL
-
当前页
-
-
- -
-

文档

-

查看在线文档

-
- -
-

常用接口

- -
- -
-

调试部分

-
curl -s {origin}/inner/version
-curl -s {origin}/search?keywords=网易云
-
- 交互式调试 · - 二维码登录示例 · - 解灰测试 · - 听歌识曲 Demo · - 云盘上传 · - 歌单导入 · - EAPI 解密 · - 一起听示例 · - 更新歌单封面示例 · - 头像更新示例 -
-
- - -
- - - - \ No newline at end of file diff --git a/src/client/app.js b/src/client/app.js index 628286a..44e4754 100644 --- a/src/client/app.js +++ b/src/client/app.js @@ -26,6 +26,24 @@ app.get('/api/data', (req, res) => { res.json(capturedData); }); +// 版本信息端点 +app.get('/api/version', (req, res) => { + try { + const packageJson = require('../../package.json'); + res.json({ version: packageJson.version }); + } catch (error) { + console.error('Failed to read package.json:', error); + res.json({ version: '0.1.0' }); + } +}); + +// 清空数据端点 +app.post('/api/clear', (req, res) => { + capturedData = []; + broadcastData(); + res.json({ success: true }); +}); + // SSE 端点 app.get('/api/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); diff --git a/src/client/public/index.html b/src/client/public/index.html index 3a0bc6a..aa7f7f4 100644 --- a/src/client/public/index.html +++ b/src/client/public/index.html @@ -301,13 +301,36 @@ opacity: 1; transform: translateY(0); } + + .clear-btn { + display: inline-block; + padding: 4px 10px; + background: #f5f5f5; + color: var(--muted); + border: 1px solid var(--border); + border-radius: 4px; + font-size: 12px; + cursor: pointer; + transition: all 0.2s; + margin-left: 8px; + } + + .clear-btn:hover { + background: var(--accent); + color: white; + border-color: var(--accent); + } + + .clear-btn:active { + transform: scale(0.98); + }
-

网易云音乐抓包工具 v0.1.0

+

网易云音乐抓包工具 加载中...

🔍 简易网易云音乐客户端抓包工具

@@ -330,7 +353,7 @@
-

抓包列表

+

抓包列表

@@ -485,6 +508,62 @@ return div.innerHTML; } + function fetchVersion() { + fetch('/api/version') + .then(response => response.json()) + .then(data => { + if (data.version) { + document.getElementById('version-badge').textContent = 'v' + data.version; + } else { + document.getElementById('version-badge').textContent = 'v0.1.0'; + } + }) + .catch(err => { + console.error('Failed to fetch version:', err); + document.getElementById('version-badge').textContent = 'v0.1.0'; + }); + } + + function clearCaptures() { + if (!capturedData || capturedData.length === 0) { + showToast('暂无抓包数据可清空'); + return; + } + + if (!confirm('确定要清空所有抓包信息吗?')) { + return; + } + + capturedData = []; + selectedIndex = -1; + renderCaptureList(); + + // 重置右侧详情面板 + const detailPanel = document.getElementById('detail-panel'); + detailPanel.innerHTML = ` +
+ 📡 + 请从左侧选择一个抓包记录查看详情 +
+ `; + + // 向服务器发送清空请求 + fetch('/api/clear', { method: 'POST' }) + .then(response => response.json()) + .then(data => { + if (data.success) { + showToast('已清空所有抓包信息'); + } else { + showToast('清空失败: ' + (data.message || '未知错误')); + } + showToast('已清空所有抓包信息'); + }) + .catch(err => { + console.error('Clear failed:', err); + showToast('清空失败,请重试'); + }); + } + function setupSSE() { const eventSource = new EventSource('/api/events'); @@ -495,20 +574,25 @@ // 更新状态为已连接 updateStatus(); - // 检查是否有新数据(比较最后一个时间戳或数量) - const hasNewData = !capturedData.length || - data.length > capturedData.length || - (data.length > 0 && capturedData.length > 0 && - data[data.length - 1].timestamp !== capturedData[capturedData.length - 1].timestamp); + // 直接使用服务器返回的数据 + capturedData = data; + renderCaptureList(); - if (hasNewData) { - capturedData = data; - renderCaptureList(); - - // 如果是新数据且当前没有选中,自动选中第一个 - if (selectedIndex === -1 && data.length > 0) { - selectCapture(0); - } + // 如果当前没有选中且数据不为空,自动选中第一个 + if (selectedIndex === -1 && data.length > 0) { + selectCapture(0); + } + + // 如果选中的索引超出了数据范围,重置选中状态 + if (selectedIndex >= data.length) { + selectedIndex = -1; + const detailPanel = document.getElementById('detail-panel'); + detailPanel.innerHTML = ` +
+ 📡 + 请从左侧选择一个抓包记录查看详情 +
+ `; } } catch (e) { console.error('Failed to parse SSE data:', e); @@ -524,6 +608,9 @@ var origin = window.location.origin; document.getElementById('base-url').textContent = origin; + // 获取版本信息 + fetchVersion(); + // 设置 SSE 连接 setupSSE(); }); diff --git a/src/index.js b/src/index.js index cd6074d..ca2658e 100644 --- a/src/index.js +++ b/src/index.js @@ -143,6 +143,22 @@ const startClient = () => { res.json(capturedData); }); + app.get('/api/version', (req, res) => { + try { + const packageJson = require('../package.json'); + res.json({ version: packageJson.version }); + } catch (error) { + console.error('Failed to read package.json:', error); + res.json({ version: '0.1.0' }); + } + }); + + app.post('/api/clear', (req, res) => { + capturedData = []; + broadcastData(); + res.json({ success: true }); + }); + app.get('/api/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache');