Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32f48613c4 |
No files matched your search
@@ -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
|
## v1.10.0 · 2026-10-20
|
||||||
|
|
||||||
### ✨ 新功能
|
### ✨ 新功能
|
||||||
|
|||||||
@@ -126,6 +126,76 @@ h2 {
|
|||||||
.order-status.error { color: #c62828; background: #fdecea; }
|
.order-status.error { color: #c62828; background: #fdecea; }
|
||||||
.order-status.success { color: #1b5e20; background: #eef7ee; }
|
.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-title { font-size: 16px; font-weight: 700; margin-bottom: 8px; }
|
||||||
.ok-line { font-size: 13px; margin-bottom: 4px; }
|
.ok-line { font-size: 13px; margin-bottom: 4px; }
|
||||||
.ok-line b { color: #1b5e20; }
|
.ok-line b { color: #1b5e20; }
|
||||||
|
|||||||
@@ -34,6 +34,15 @@
|
|||||||
<section id="order-panel" hidden>
|
<section id="order-panel" hidden>
|
||||||
<h2><span class="num">3</span> 订单状态</h2>
|
<h2><span class="num">3</span> 订单状态</h2>
|
||||||
<div id="order-status" class="order-status">等待创建订单…</div>
|
<div id="order-status" class="order-status">等待创建订单…</div>
|
||||||
|
<div id="card-box" class="card-box" hidden>
|
||||||
|
<div class="cb-title"><span class="cb-dot"></span>你的卡密</div>
|
||||||
|
<div class="cb-key"><code id="cb-key-text"></code></div>
|
||||||
|
<div class="cb-row">
|
||||||
|
<button type="button" id="cb-copy" class="cb-copy">复制卡密</button>
|
||||||
|
<span id="cb-copy-tip" class="cb-tip"></span>
|
||||||
|
</div>
|
||||||
|
<p class="cb-hint" id="cb-hint">万一自动激活没成功:回到插件侧边栏,在卡密输入框粘贴并点「粘贴卡密并激活」即可,不影响你的权益。</p>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|||||||
@@ -99,20 +99,36 @@ function startPolling() {
|
|||||||
try {
|
try {
|
||||||
const res = await chrome.runtime.sendMessage({ action: 'authQueryOrder', orderNo });
|
const res = await chrome.runtime.sendMessage({ action: 'authQueryOrder', orderNo });
|
||||||
if (!res || !res.ok) return;
|
if (!res || !res.ok) return;
|
||||||
|
// 只要拿到卡密就先展示出来,不等激活结果——自动激活失败时用户手里必须有码
|
||||||
|
if (res.cardKey) showCardBox(res.cardKey, !!res.activated);
|
||||||
|
|
||||||
if (res.activated) {
|
if (res.activated) {
|
||||||
clearInterval(pollTimer);
|
clearInterval(pollTimer);
|
||||||
pollTimer = null;
|
pollTimer = null;
|
||||||
showActivated(res);
|
showActivated(res);
|
||||||
} else if (res.cardKey && !res.activated) {
|
} else if (res.cardKey) {
|
||||||
clearInterval(pollTimer);
|
clearInterval(pollTimer);
|
||||||
pollTimer = null;
|
pollTimer = null;
|
||||||
const status = $('order-status');
|
const status = $('order-status');
|
||||||
status.className = 'order-status error';
|
status.className = 'order-status error';
|
||||||
status.textContent = '✗ 已支付但激活失败:' + (res.message || '请联系客服,提供订单号补发');
|
status.innerHTML = '✗ <b>已支付并已发卡</b>,但自动激活未成功(' +
|
||||||
|
esc(res.message || '本机绑定可能被占用') + ')。请用上方卡密手动激活:回到插件侧边栏 → 卡密输入框粘贴 → 点「粘贴卡密并激活」。<br>' +
|
||||||
|
'订单号:<b>' + esc(orderNo || '') + '</b>';
|
||||||
|
} 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 = '⏳ <b>已支付</b>,但发卡耗时较长(已 ' + waited + ' 秒)。订单 <b>' + esc(orderNo) +
|
||||||
|
'</b> 付款状态为已支付,<b>权益不会丢失</b>:继续等会自动发放,或凭此订单号联系客服补发。';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const status = $('order-status');
|
const status = $('order-status');
|
||||||
status.className = 'order-status pending';
|
status.className = 'order-status pending';
|
||||||
status.textContent = `⏳ 等待支付中…(订单 ${orderNo},已等待 ${attempts * 5} 秒)`;
|
status.textContent = '⏳ 等待支付中…(订单 ' + orderNo + ',已等待 ' + attempts * 5 + ' 秒)';
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
/* 单次查询失败不中断轮询 */
|
/* 单次查询失败不中断轮询 */
|
||||||
@@ -120,6 +136,17 @@ function startPolling() {
|
|||||||
}, 5000);
|
}, 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) {
|
function showActivated(res) {
|
||||||
const status = $('order-status');
|
const status = $('order-status');
|
||||||
status.className = 'order-status success';
|
status.className = 'order-status success';
|
||||||
@@ -134,4 +161,30 @@ document.querySelectorAll('.pay-btn').forEach((btn) => {
|
|||||||
btn.addEventListener('click', () => createOrder(btn.dataset.pay));
|
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();
|
loadPackages();
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "B站评论助手",
|
"name": "B站评论助手",
|
||||||
"version": "1.10.0",
|
"version": "1.10.1",
|
||||||
"description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。",
|
"description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。",
|
||||||
"permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"],
|
"permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"],
|
||||||
"host_permissions": [
|
"host_permissions": [
|
||||||
|
|||||||
Reference in new issue
Block a user