解析分享链接
粘贴链接即自动识别所属网盘;域名规则识别不了时,会自动访问该链接按页面特征判定。
未登录:可填「临时凭证」用自己的 cookie,或解析免登录网盘;需登录网盘请先登录。
匿名用户可用自己的 cookie 解析登录态网盘;或解析免登录网盘。仅当你登录、且管理员放开授权或已兑换会员时长时,才用共享捐赠池。
点击上方直链可在浏览器中直接下载(新标签页);若被防盗链 / Referer 拦截导致下载失败或变成网页,改用「代理下载」。
我的账号(登录态网盘)
登录后可绑定你自己的 Cookie / Token,使用你的会员带宽,不限速、不连坐。凭证经 AES-GCM 加密存储。
扫码(阿里云盘 / 115)可在弹窗内直接完成;网页引导会在当前标签页打开官方登录页(不新开窗口),登录后点书签即可回传——书签拖一次长期有效,并会实时监测登录状态自动回传。二维码获取失败会自动降级为网页引导。
同一网盘可绑定多个账号,解析时按最久未用自动轮询,避免单个账号被高频风控。
积分与捐献
捐献你自己的 Cookie 可赚取积分:捐献即送 100 分,之后每天 cookie 仍有效再送 10 分(系统每日 03:00 定时校验)。积分可兑换「会员时长」。
使用说明 / 风险提示
· 工具仅用于个人学习与技术交流;解析器复用各网盘自有接口,网盘改版可能导致解析失效。
· 不破解任何加密或限速。免登录网盘走逆向匿名请求;登录态网盘使用真实登录态调官方接口。
· 凭证模式:匿名可填「临时凭证」用自己的 cookie,或解析免登录网盘;登录后可选「自动/我的凭证/共享池」。
· 高频调用会触发网盘风控(封号/限流),共享捐赠池尤甚,建议优先绑定自有账号。
· 任何声称「破解限速」的收费版均为诈骗。
0}` +
`var host=document.documentElement;if(!host)return;` +
`var box=document.createElement('div');box.setAttribute('style','position:fixed;z-index:2147483647;right:16px;bottom:16px;width:272px;background:#111827;color:#f9fafb;border:1px solid #374151;border-radius:10px;padding:12px 14px;font:13px/1.55 system-ui,-apple-system,Segoe UI,sans-serif;box-shadow:0 8px 28px rgba(0,0,0,.45)');` +
`var hd=document.createElement('div');hd.textContent='网盘凭证抓取';hd.setAttribute('style','font-weight:600;margin-bottom:4px');` +
`var tip=document.createElement('div');tip.setAttribute('style','color:#d1d5db;font-size:12px;line-height:1.55;white-space:pre-wrap');` +
`var bar=document.createElement('div');bar.setAttribute('style','display:flex;gap:8px;margin-top:10px');` +
`function mk(t,fn){var b=document.createElement('button');b.textContent=t;b.onclick=fn;b.setAttribute('style','flex:1;padding:5px 0;border-radius:6px;border:1px solid #4b5563;background:#1f2937;color:#f9fafb;font-size:12px;cursor:pointer');return b}` +
`var back=document.createElement('a');back.textContent='返回工具页 →';back.href=B;back.setAttribute('style','display:none;margin-top:9px;color:#93c5fd;font-size:12px;text-decoration:underline');` +
`box.appendChild(hd);box.appendChild(tip);box.appendChild(bar);box.appendChild(back);host.appendChild(box);` +
`var done=false,tm=null,tmo=null;` +
`function stop(){if(tm){clearInterval(tm);tm=null}if(tmo){clearTimeout(tmo);tmo=null}}` +
`function post(){var c=ck(),s=st();tip.textContent='正在回传凭证…';` +
`fetch(O+'/v1/login/collect',{method:'POST',mode:'cors',credentials:'omit',headers:{'Content-Type':'text/plain'},body:JSON.stringify({cookie:c,storage:s,url:location.href,userToken:T})})` +
`.then(function(r){return r.json().catch(function(){return{}})})` +
`.then(function(j){if(j&&j.code===200){done=true;stop();hd.textContent='网盘凭证抓取 · 已完成';` +
`var ok=j.saved!==false;tip.textContent=(ok?'✓ 已回传并保存到你的账号:':'⚠ 已回传但保存失败:')+(j.picked||'凭证')+(j.saveError?'\\n'+j.saveError:'')+'\\n现在可以直接关掉本页,凭证已经在服务端存好了。';back.style.display='block'}` +
`else{tip.textContent='回传失败:'+((j&&j.error)||'服务端异常')+'\\n请回到工具页重新点「引导登录」,再来本页点一次书签。'}})` +
`.catch(function(e){tip.textContent='回传失败(网络或跨域):'+e+'\\n可回到工具页用「手动粘贴」备用方案。'})}` +
`bar.appendChild(mk('立即回传',post));bar.appendChild(mk('关闭',function(){stop();if(box.parentNode)box.parentNode.removeChild(box)}));` +
`var base=ck(),baseS=JSON.stringify(st()),baseUrl=location.href;` +
`if(STRONG.test(base)||STRONG.test(baseS)){post()}` +
`else{tip.textContent='实时监测中:登录成功后会自动回传,不用再点书签。\\n如果已经登录好了,点「立即回传」。';` +
`tm=setInterval(function(){if(done){stop();return}var c=ck(),s=JSON.stringify(st());` +
`if(c!==base||s!==baseS||location.href!==baseUrl){if(weak(ck(),st())){stop();post()}}},1200);` +
`tmo=setTimeout(function(){if(!done){stop();tip.textContent='监测已超时(15 分钟)。登录成功后请再点一次书签,或点「立即回传」。'}},900000)}})();`;
return 'javascript:' + js;
}
/** 打开登录页 + 书签工具条(manual 与 QR 兜底共用) */
function collectToolsHtml(loginUrl) {
const bm = buildCollectBookmarklet();
return `
书签只需拖一次,之后每次引导登录都能直接点它;它会在登录页持续监测,登录成功后自动回传。
`;
}
function bindCollectTools(loginUrl) {
const btn = $('lgOpenBtn');
if (btn) {
if (!loginUrl) btn.disabled = true;
else btn.onclick = () => startGuidedLogin(loginUrl);
}
// 「新标签页打开」是兜底:同样先落本地进度,避免关掉工具页后无法续上
const fb = $('lgOpenFallback');
if (fb && loginUrl) {
fb.onclick = () => {
if (currentLogin) savePending(currentLogin.session, currentLogin.panType, currentLogin.kind);
};
}
}
function renderQr(d) {
let img = '';
if (d.qr.image) img = `
`;
else if (d.qr.content) {
try {
const qr = qrcode(0, 'M');
qr.addData(d.qr.content);
qr.make();
img = `
`;
} catch (e) { img = `二维码渲染失败:${esc(e.message)}
`; }
}
$('loginBody').innerHTML = `
${d.note ? `${esc(d.note)}
` : ''}
${d.loginUrl ? `扫码无效?可改用网页引导:
${collectToolsHtml(d.loginUrl)}` : ''}`;
bindCollectTools(d.loginUrl);
}
function startLoginPoll() { clearInterval(loginPollTimer); loginPollTimer = setInterval(pollLoginOnce, 1800); }
async function pollLoginOnce() {
if (!currentLogin) return;
try {
const r = await fetch('/v1/login/poll?session=' + encodeURIComponent(currentLogin.session), { headers: hd() }).then(x => x.json());
const d = r.data || {};
const st = d.status;
const el = $('lgStatus');
if (st === 'done') {
clearInterval(loginPollTimer);
// 服务端在「回传」时就已经落盘(savedId 有值),这里只需展示结果,不再重复提交
if (d.savedId) {
if (el) el.dataset.done = '1';
return loginSavedSuccess('书签回传的凭证已自动保存到你的账号');
}
if (el) { el.dataset.done = '1'; el.innerHTML = '' + esc(d.message || '登录成功,正在保存…'); }
submitLogin();
return;
}
if (st === 'failed' || st === 'expired') {
clearInterval(loginPollTimer);
clearPending();
$('loginMsg').textContent = d.message || '登录失败,请重试';
return;
}
// pending:QR 展示扫码进度;manual 有消息才更新(保留「等待登录页回传凭证」这类提示)
if (el && !el.dataset.done && d.message) {
el.innerHTML = '' + esc(d.message);
}
} catch (e) { clearInterval(loginPollTimer); $('loginMsg').textContent = '轮询异常:' + e.message; }
}
async function submitLogin() {
try {
const r = await fetch('/v1/login/submit', { method: 'POST', headers: hd(true), body: JSON.stringify({ session: currentLogin.session, scope: 'user' }) }).then(x => x.json());
if (r.id) loginSavedSuccess();
else $('loginMsg').textContent = '保存失败:' + (r.error || '');
} catch (e) { $('loginMsg').textContent = '保存异常:' + e.message; }
}
function renderManual(d, meta, opts) {
const restored = !!(opts && opts.restored);
const hint = meta.authHint || '';
const kind = /Token|Authorization/i.test(hint) ? 'token' : 'cookie';
$('loginBody').innerHTML = `
${restored ? '已回到工具页,正在等待登录页回传凭证。若还没登录,接着往下做:
' : ''}
1. 点「打开官方登录页」——会在当前标签页打开官网(不新开窗口,本页进度已保存);
2. 登录成功后,在登录页点书签栏的 「网盘凭证·抓取」(拖一次到书签栏即可长期重复使用);
3. 书签会实时监测登录状态,检测到就自动回传并立即保存到你的账号——之后直接关掉登录页也行。
${collectToolsHtml(d.loginUrl)}
${restored ? '等待登录页回传凭证…' : '等待登录…'}
${d.note ? `${esc(d.note)}
` : ''}
书签用不了?手动粘贴${kind === 'cookie' ? 'Cookie' : 'Token / Authorization'}(备用)
`;
bindCollectTools(d.loginUrl);
$('lgSaveBtn').onclick = async () => {
const val = $('lgVal').value.trim();
if (!val) return void ($('loginMsg').textContent = '请先粘贴凭证');
const credential = kind === 'cookie' ? { cookie: val } : (val.startsWith('Bearer ') ? { authorization: val } : { token: val });
const authType = kind === 'cookie' ? 'cookie' : (val.startsWith('Bearer ') ? 'authorization' : 'accesstoken');
try {
const r = await fetch('/v1/login/submit', { method: 'POST', headers: hd(true), body: JSON.stringify({ session: currentLogin ? currentLogin.session : undefined, panType: currentLogin.panType, credential, authType, scope: 'user' }) }).then(x => x.json());
if (r.id) loginSavedSuccess();
else $('loginMsg').textContent = '保存失败:' + (r.error || '');
} catch (e) { $('loginMsg').textContent = '保存异常:' + e.message; }
};
startLoginPoll();
}
function loginSavedSuccess(msg) {
clearInterval(loginPollTimer);
clearPending();
$('loginMsg').textContent = '';
$('loginBody').innerHTML = `
✓ 凭证已保存
${esc(msg || '已绑定到你的账号(加密存储),解析时按最久未用自动轮询。')}
`;
loadAccList();
setTimeout(closeLoginModal, 1600);
}
/* ============ 积分与捐献 ============ */
async function loadMe() {
if (!token) return;
const r = await fetch('/v1/me', { headers: hd() });
if (r.status === 401) {
// 本地 token 在服务端已不存在(数据重置 / 账号被删或禁用):立刻清掉,别让 UI 假装还登录着
logoutLocal(true);
applyAuthUI();
return;
}
if (!r.ok) return;
const j = await r.json();
const u = j.user || {};
$('myPoints').textContent = u.points ?? 0;
$('myTime').textContent = u.allowanceExpiresAt > Date.now()
? '剩 ' + Math.ceil((u.allowanceExpiresAt - Date.now()) / 3600000) + ' 小时'
: '未兑换';
const list = j.donated || [];
const checkTxt = (a) => {
if (!a.lastCheckAt) return '待校验';
if (a.lastCheckOk === false) return '已失效';
if (a.lastCheckMethod === 'unknown') return '无法校验';
return '有效';
};
$('myDonatedWrap').innerHTML = list.length
? '我的捐献 (系统每日 03:00 校验,持续有效每天赠积分)' + list.length + ' 个账号
| 网盘 | 积分 | 有效期 | 校验 | 状态 |
' +
list.map(a => `
| ${esc(PAN_MAP[a.panType] || a.panType)} |
${a.pointsAwarded ?? 0} |
${a.expiresAt ? fmtShort(a.expiresAt) + ' 到期' : '永久'} |
${checkTxt(a)} |
${a.enabled ? '启用' : '停用'} |
`).join('') + '
'
: '尚未捐献任何账号。
';
}
/* 拉取积分规则填充说明 */
async function loadDonRule() {
const r = await fetch('/v1/admin/config').then(x=>x.json()).catch(()=>null);
const c = r?.config;
if (c) {
$('donRule1').textContent = '捐献即送 ' + c.pointsPerDonation + ' 分';
$('donRule2').textContent = (c.pointsPerDay > 0 ? c.pointsPerDay + ' 分' : '0 分(未启用)');
if (c.donationDays > 0) $('donDays').value = c.donationDays;
}
}
loadDonRule();
$('donateBtn').onclick = async () => {
const panType = $('donType').value;
const val = $('donVal').value.trim();
if (!token) return $('donMsg').textContent = '请先登录再捐献';
if (!panType || !val) return $('donMsg').textContent = '请选网盘并粘贴凭证';
const kind = val.includes('=') ? 'cookie' : 'token';
const days = Number($('donDays').value) || 0;
const body = { panType, label: $('donLabel').value.trim() || username, days,
cookie: kind === 'cookie' ? val : undefined,
token: kind === 'token' ? val : undefined };
const r = await fetch('/v1/donate', { method:'POST', headers: hd(true), body: JSON.stringify(body) });
const j = await r.json();
if (r.ok) {
const exp = j.expiresAt ? ',有效期至 ' + fmtShort(j.expiresAt) : ',永久有效';
$('donMsg').textContent = '捐献成功,当前积分 ' + j.points + exp + ';每日校验有效再送 ' + (j.pointsPerDay ?? 0) + ' 分';
$('donVal').value = ''; loadMe();
}
else $('donMsg').textContent = '失败:' + (j.error || r.status);
};
$('redeemBtn').onclick = async () => {
const h = Number($('redeemH').value);
if (!token) return $('redeemMsg').textContent = '请先登录';
if (!h || h <= 0) return $('redeemMsg').textContent = '请输入有效小时数';
const r = await fetch('/v1/me/redeem', { method:'POST', headers: hd(true), body: JSON.stringify({ hours: h }) });
const j = await r.json();
if (r.ok) { $('redeemMsg').textContent = '兑换成功,剩余积分 ' + j.points; loadMe(); }
else $('redeemMsg').textContent = '失败:' + (j.error || r.status);
};
applyAuthUI();
loadPans();