From 32f48613c4993d4862d5bc57f868a02cff74747d Mon Sep 17 00:00:00 2001 From: jinghui Date: Tue, 20 Oct 2026 22:01:47 +0800 Subject: [PATCH] =?UTF-8?q?v1.10.1:=20=E6=94=AF=E4=BB=98=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=8D=B3=E6=98=BE=E7=A4=BA=E5=8D=A1=E5=AF=86=20+=20=E5=B7=B2?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=9C=AA=E5=8F=91=E5=8D=A1=E7=9A=84=E6=98=8E?= =?UTF-8?q?=E7=A1=AE=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 订单状态区新增「你的卡密」展示区,拿到 card_key 立刻显示(不等激活结果) - 自动激活失败时给出手动激活路径(卡密+侧边栏步骤+订单号) - paid 但无卡密时显示发卡进度,90s 后提示权益不丢失可凭订单号补发 - 卡密一键复制(clipboard API → execCommand 降级) --- CHANGELOG.md | 13 ++++++++++ buy.css | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ buy.html | 9 +++++++ buy.js | 59 ++++++++++++++++++++++++++++++++++++++++--- manifest.json | 2 +- 5 files changed, 149 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fc157c..4f64dd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ B站评论助手 版本历史。下载:https://dl.88531.cn/bili.html ·  --- +## v1.10.1 · 2026-10-20 + +### ✨ 新功能 +- **支付成功后立刻显示卡密**:只要服务端发出卡,订单状态区马上出现独立的「你的卡密」展示区(大号等宽字体 + 一键复制),**不等自动激活结果**——自动激活失败时用户手里也有码,回侧边栏粘贴即可激活 +- **「已支付但还没发卡」的明确状态**:订单已是 `paid` 却还没拿到卡密时显示「已支付,正在为你发卡」,超过 90 秒改为「**权益不会丢失**,可凭订单号联系客服补发」,不再无限转在「等待支付中」 +- 卡密一键复制,剪贴板 API 无权限时自动降级 `execCommand` + +### 🔧 调整 +- 激活失败时给出可执行路径(卡密展示 + 侧边栏操作步骤 + 订单号),不再只报一句错误 +- 卡密展示区用 B站蓝虚线框独立成块,`user-select: all` 便于长按全选 + +--- + ## v1.10.0 · 2026-10-20 ### ✨ 新功能 diff --git a/buy.css b/buy.css index 7e7335b..2f8077c 100644 --- a/buy.css +++ b/buy.css @@ -126,6 +126,76 @@ h2 { .order-status.error { color: #c62828; background: #fdecea; } .order-status.success { color: #1b5e20; background: #eef7ee; } +/* 卡密展示区:支付成功后必须让用户亲眼看到卡密 */ +.card-box { + margin-top: 14px; + border: 2px dashed #00a1d6; + border-radius: 10px; + background: #f2fbff; + padding: 16px 14px; + word-break: break-all; +} + +.cb-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + font-weight: 700; + color: #0089ba; + margin-bottom: 10px; +} + +.cb-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #00a1d6; + flex: none; + box-shadow: 0 0 0 4px rgba(0, 161, 214, 0.18); +} + +.cb-key { + background: #fff; + border: 1px solid #cdeaf7; + border-radius: 8px; + padding: 14px 12px; + text-align: center; + margin-bottom: 12px; +} + +.cb-key code { + font-family: "SF Mono", Consolas, "Courier New", monospace; + font-size: 20px; + font-weight: 700; + letter-spacing: 2px; + color: #111; + user-select: all; +} + +.cb-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } + +.cb-copy { + padding: 9px 22px; + border: none; + border-radius: 6px; + background: #00a1d6; + color: #fff; + font-size: 14px; + cursor: pointer; + transition: background 0.18s ease; +} + +.cb-copy:hover { background: #0089ba; } +.cb-tip { font-size: 12px; color: #0089ba; } + +.cb-hint { + margin-top: 10px; + font-size: 12px; + line-height: 1.7; + color: #7a7f86; +} + .ok-title { font-size: 16px; font-weight: 700; margin-bottom: 8px; } .ok-line { font-size: 13px; margin-bottom: 4px; } .ok-line b { color: #1b5e20; } diff --git a/buy.html b/buy.html index 1e3acb9..4133393 100644 --- a/buy.html +++ b/buy.html @@ -34,6 +34,15 @@ diff --git a/buy.js b/buy.js index c1018d2..2f1c6b4 100644 --- a/buy.js +++ b/buy.js @@ -99,20 +99,36 @@ function startPolling() { try { const res = await chrome.runtime.sendMessage({ action: 'authQueryOrder', orderNo }); if (!res || !res.ok) return; + // 只要拿到卡密就先展示出来,不等激活结果——自动激活失败时用户手里必须有码 + if (res.cardKey) showCardBox(res.cardKey, !!res.activated); + if (res.activated) { clearInterval(pollTimer); pollTimer = null; showActivated(res); - } else if (res.cardKey && !res.activated) { + } else if (res.cardKey) { clearInterval(pollTimer); pollTimer = null; const status = $('order-status'); status.className = 'order-status error'; - status.textContent = '✗ 已支付但激活失败:' + (res.message || '请联系客服,提供订单号补发'); + status.innerHTML = '✗ 已支付并已发卡,但自动激活未成功(' + + esc(res.message || '本机绑定可能被占用') + ')。请用上方卡密手动激活:回到插件侧边栏 → 卡密输入框粘贴 → 点「粘贴卡密并激活」。
' + + '订单号:' + esc(orderNo || '') + ''; + } else if (res.paid) { + // 已付款但服务端还没把卡发出来(最常见原因是卡池库存不足) + const waited = attempts * 5; + const status = $('order-status'); + status.className = 'order-status pending'; + status.textContent = '⏳ 已支付,正在为你发卡…(订单 ' + orderNo + ',已等待 ' + waited + ' 秒)'; + if (waited >= 90) { + status.className = 'order-status error'; + status.innerHTML = '⏳ 已支付,但发卡耗时较长(已 ' + waited + ' 秒)。订单 ' + esc(orderNo) + + ' 付款状态为已支付,权益不会丢失:继续等会自动发放,或凭此订单号联系客服补发。'; + } } else { const status = $('order-status'); status.className = 'order-status pending'; - status.textContent = `⏳ 等待支付中…(订单 ${orderNo},已等待 ${attempts * 5} 秒)`; + status.textContent = '⏳ 等待支付中…(订单 ' + orderNo + ',已等待 ' + attempts * 5 + ' 秒)'; } } catch (e) { /* 单次查询失败不中断轮询 */ @@ -120,6 +136,17 @@ function startPolling() { }, 5000); } +/** 支付成功后立刻把卡密展示给用户(含自动激活失败的场景) */ +function showCardBox(key, activated) { + const box = $('card-box'); + if (!box || !key) return; + if (!box.hidden && $('cb-key-text').textContent === key) return; + $('cb-key-text').textContent = key; + box.hidden = false; + $('cb-copy-tip').textContent = activated ? '已自动激活本机,这是你的卡密,建议留存' : ''; + box.scrollIntoView({ behavior: 'smooth', block: 'center' }); +} + function showActivated(res) { const status = $('order-status'); status.className = 'order-status success'; @@ -134,4 +161,30 @@ document.querySelectorAll('.pay-btn').forEach((btn) => { btn.addEventListener('click', () => createOrder(btn.dataset.pay)); }); +// 复制卡密:优先 clipboard API,无权限时降级 execCommand +$('cb-copy') && $('cb-copy').addEventListener('click', async () => { + const key = ($('cb-key-text').textContent || '').trim(); + if (!key) return; + let ok = false; + try { + await navigator.clipboard.writeText(key); + ok = true; + } catch (e) { /* 降级 */ } + if (!ok) { + try { + const ta = document.createElement('textarea'); + ta.value = key; + ta.style.position = 'fixed'; + ta.style.opacity = '0'; + document.body.appendChild(ta); + ta.select(); + ok = document.execCommand('copy'); + document.body.removeChild(ta); + } catch (e2) { + ok = false; + } + } + $('cb-copy-tip').textContent = ok ? '已复制,可直接粘贴到侧边栏激活' : '复制失败,请手动长按选择卡密'; +}); + loadPackages(); diff --git a/manifest.json b/manifest.json index 8430d8f..e3838bc 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "B站评论助手", - "version": "1.10.0", + "version": "1.10.1", "description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。", "permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"], "host_permissions": [