// ==UserScript== // @name 新版度娘加速百度网盘SVIP高速下载 // @namespace momoz // @version 2.9.0 // @author momo // @description 度娘加速新UI:百度网盘SVIP解析高速下载。720px双栏暗色科技风弹窗,小文件解析(1.2G内),支持查询全部任务、复制直链、推送Aria2(免费解析由广告赞助:提交后广告自动打开,15秒后自动提交) // @license MIT // @icon https://nd-static.bdstatic.com/m-static/v20-main/home/img/icon-home-new.b4083345.png // @match *://pan.baidu.com/* // @match *://yun.baidu.com/* // @match *://pan.baidu.com/disk/home* // @match *://yun.baidu.com/disk/home* // @match *://pan.baidu.com/disk/main* // @match *://yun.baidu.com/disk/main* // @match *://pan.baidu.com/s/* // @match *://yun.baidu.com/s/* // @match *://pan.baidu.com/share/* // @match *://yun.baidu.com/share/* // @connect baidu.com // @connect 127.0.0.1 // @connect ty.shzxkq.com // @connect bdb.shzxkq.com // @connect bda.shzxkq.com // @grant GM_addStyle // @run-at document-idle // ==/UserScript== (function () { 'use strict'; var config = { gonggao: "小文件解析(1.2G内):每30分钟5次,解析等待1~18分钟", host_list: { "1": "https://bdb.shzxkq.com", "2": "https://bda.shzxkq.com" }, main_url: "https://bdb.shzxkq.com", bd_password: "asdf", title_name: "度娘加速", file_name: "", savePath: "D:\\Downloads", jsonrpc: "http://localhost:6800/jsonrpc", username: "", tab_id: "1", ua: "netdisk;", workdata: [], file_size: 0, file_icon: "file", mode: "small", // small | big 仅界面展示 last_link: "", batchFiles2: null, // 批量文件(batchNext 用) bdstoken: "", // 百度 bdstoken(batchNext 用) adToken: "" // 广告解锁 token(gate.php 门页) }; /* ========== 新 UI 样式 ========== */ GM_addStyle(` #dnui{--bg:#0E1015;--pop:#131722;--card:#1A2030;--card2:#202839;--line:#262E40;--txt:#F2F4F8;--sub:#8B93A7;--dim:#5C6577;--pri:#8B5CF6;--pri2:#22D3EE;--ok:#34D399;--run:#60A5FA;--wait:#FBBF24;--err:#F87171;--r-lg:18px;--r-md:12px;--r-sm:8px;all:initial} #dnui *,#dnui *::before,#dnui *::after{box-sizing:border-box;margin:0;padding:0} #dnui{position:fixed;top:0;left:0;right:0;bottom:0;z-index:2147483647;display:none;align-items:center;justify-content:center;font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;color:var(--txt);background:rgba(8,10,15,.72);backdrop-filter:blur(3px);-webkit-font-smoothing:antialiased} #dnui.show{display:flex} #dnui .popup{width:min(720px,96vw);max-height:92vh;display:flex;flex-direction:column;background:linear-gradient(180deg,#151A27,#12151E);border:1px solid #283250;border-radius:var(--r-lg);box-shadow:0 32px 90px rgba(0,0,0,.7);animation:dnpop .32s cubic-bezier(.2,.8,.3,1);overflow:hidden} @keyframes dnpop{from{opacity:0;transform:translateY(14px) scale(.985)}to{opacity:1;transform:none}} #dnui .hdr{display:flex;align-items:center;justify-content:space-between;padding:12px 22px 8px} #dnui .hdr-right{display:flex;align-items:center;gap:10px} #dnui .close{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;border:none;background:transparent;color:var(--sub);cursor:pointer;transition:.15s} #dnui .close:hover{background:rgba(255,255,255,.08);color:#fff} #dnui .close svg{width:14px;height:14px;fill:currentColor} #dnui .brand{display:flex;align-items:center;gap:10px} #dnui .brand .logo{width:28px;height:28px;border-radius:8px;background:linear-gradient(135deg,var(--pri),var(--pri2));display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px rgba(139,92,246,.5)} #dnui .brand .logo svg{width:15px;height:15px;fill:#0E1015} #dnui .brand .t{font-size:15px;font-weight:700;letter-spacing:.3px} #dnui .status{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ok);background:rgba(52,211,153,.1);border:1px solid rgba(52,211,153,.25);border-radius:999px;padding:3px 9px} #dnui .status .dot{width:6px;height:6px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px rgba(52,211,153,.15);animation:dnbreath 2.4s ease-in-out infinite} @keyframes dnbreath{0%,100%{opacity:1}50%{opacity:.35}} #dnui .notice{display:flex;align-items:center;gap:8px;margin:0 22px 8px;padding:6px 12px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);font-size:13px;color:var(--wait);font-weight:600} #dnui .notice svg{width:14px;height:14px;fill:var(--wait);flex:none} #dnui .notice span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;text-align:center} #dnui .tabs{display:flex;gap:4px;margin:0 22px 10px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:3px} #dnui .tab{flex:1;text-align:center;padding:7px 0;font-size:12.5px;color:var(--sub);border-radius:8px;cursor:pointer;transition:.18s;user-select:none;background:none;border:none} #dnui .tab:hover{color:var(--txt)} #dnui .tab.on{background:linear-gradient(135deg,rgba(139,92,246,.28),rgba(34,211,238,.16));color:#fff;font-weight:600;box-shadow:0 2px 8px rgba(139,92,246,.22),inset 0 0 0 1px rgba(139,92,246,.45)} #dnui .tab b{font-weight:700} #dnui .pop-main{display:grid;grid-template-columns:270px 1fr;gap:12px;padding:0 20px 14px;min-width:0;overflow:auto} #dnui .pop-main::-webkit-scrollbar{width:6px} #dnui .pop-main::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px} #dnui .col-sub,.dnui .col-task{min-width:0} #dnui .help-pane{display:none;grid-column:1/-1} #dnui.pop-help .help-pane{display:block} #dnui.pop-help .col-sub,#dnui.pop-help .col-task{display:none} #dnui .help-box{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:16px} #dnui .help-title{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;margin-bottom:12px} #dnui .help-title svg{width:16px;height:16px;fill:var(--pri2)} #dnui .contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px} #dnui .tool{display:flex;gap:10px;background:var(--card2);border:1px solid var(--line);border-radius:var(--r-md);padding:10px;transition:.18s} #dnui .tool:hover{border-color:rgba(139,92,246,.45)} #dnui .tool .t-ico{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,rgba(139,92,246,.22),rgba(34,211,238,.16));display:flex;align-items:center;justify-content:center;flex:none} #dnui .tool .t-ico svg{width:17px;height:17px;fill:var(--pri2)} #dnui .tool .t-main{flex:1;min-width:0} #dnui .tool .t-name{font-size:13px;font-weight:700} #dnui .tool .t-desc{font-size:11.5px;color:var(--sub);line-height:1.55;margin-top:4px} #dnui .tool .t-desc code{background:#0D1017;border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Consolas,monospace;font-size:11px;color:var(--pri2)} #dnui .tool .t-ops{margin-top:7px;display:flex;gap:8px;align-items:center;flex-wrap:wrap} #dnui .mini-btn{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;border-radius:8px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid rgba(139,92,246,.5);background:rgba(139,92,246,.12);color:var(--txt);transition:.15s} #dnui .mini-btn:hover{background:rgba(139,92,246,.24)} #dnui .mini-btn svg{width:12px;height:12px;fill:currentColor} #dnui .t-note{font-size:10.5px;color:var(--dim);margin-top:6px} #dnui .save-row{display:flex;align-items:center;gap:10px;margin-top:10px;padding-top:10px;border-top:1px solid var(--line);flex-wrap:wrap} #dnui .save-row label{font-size:12px;color:var(--sub);flex:none} #dnui .save-row input{flex:1;min-width:120px;height:32px;background:#0D1017;border:1px solid var(--line);border-radius:9px;color:var(--txt);font-size:12.5px;padding:0 12px;outline:none;transition:.18s} #dnui .save-row input:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(139,92,246,.18)} #dnui .submit{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:12px;height:100%;display:flex;flex-direction:column} #dnui .file-row{display:flex;align-items:center;gap:10px;background:var(--card2);border:1px solid var(--line);border-radius:10px;padding:9px 10px} #dnui .f-ico{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,rgba(139,92,246,.28),rgba(34,211,238,.2));display:flex;align-items:center;justify-content:center;flex:none} #dnui .f-ico svg{width:17px;height:17px;fill:var(--pri2)} #dnui .f-name{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} #dnui .f-size{font-size:10.5px;color:var(--dim);margin-top:2px;font-variant-numeric:tabular-nums} #dnui .ad-note{margin-top:18px;padding:14px 12px;border-radius:var(--r-md);background:linear-gradient(135deg,rgba(139,92,246,.1),rgba(34,211,238,.08));border:1px solid rgba(139,92,246,.28);font-size:14px;color:var(--sub);line-height:1.7;text-align:center} #dnui .ad-note b{display:block;font-size:15px;color:var(--txt);margin-bottom:4px} #dnui .ad-tip{margin-top:8px;padding:8px 10px;border-radius:8px;background:rgba(251,191,36,.08);border:1px solid rgba(251,191,36,.32);color:#FBBF24;font-size:12.5px;line-height:1.6;text-align:left} #dnui .task-pane{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:12px;height:100%;display:flex;flex-direction:column;min-height:0} #dnui .t-head{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap} #dnui .t-title{font-size:12.5px;font-weight:600;color:var(--sub);letter-spacing:.5px} #dnui .t-head-btns{display:flex;gap:16px;flex:1;justify-content:flex-end} #dnui .hb{height:32px;flex:1;min-width:0;border-radius:8px;font-size:12.5px;font-weight:600;cursor:pointer;border:1px solid var(--line);background:var(--card2);color:var(--txt);padding:0 12px;transition:.15s;text-align:center;white-space:nowrap} #dnui .hb:hover{border-color:var(--pri);color:#fff} #dnui .hb:disabled{opacity:.55;cursor:not-allowed;filter:saturate(.55)} #dnui .hb.primary{border:none;color:#0E1015;background:linear-gradient(135deg,var(--pri),var(--pri2));font-weight:700;box-shadow:0 3px 12px rgba(139,92,246,.35)} #dnui .hb.primary:hover{transform:translateY(-1px);box-shadow:0 6px 18px rgba(139,92,246,.5)} #dnui .hb.grad{border:none;color:#0E1015;background:linear-gradient(135deg,var(--pri2),var(--pri));font-weight:700;box-shadow:0 3px 12px rgba(34,211,238,.3)} #dnui .hb.grad:hover{transform:translateY(-1px);box-shadow:0 6px 18px rgba(34,211,238,.45)} #dnui .batch-bar{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap} #dnui .batch-bar[hidden]{display:none} #dnui .b-info{font-size:11.5px;color:var(--ok);font-weight:600} #dnui .b-ops{display:flex;gap:8px;margin-left:auto} #dnui .task-list{flex:1;overflow:auto;min-height:0;scrollbar-width:thin;scrollbar-color:var(--line) transparent} #dnui .task-list::-webkit-scrollbar{width:6px} #dnui .task-list::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px} #dnui .task{display:flex;align-items:center;gap:10px;background:var(--card2);border:1px solid var(--line);border-radius:var(--r-md);padding:9px 12px;margin-bottom:8px} #dnui .task:last-child{margin-bottom:0} #dnui .st{width:9px;height:9px;border-radius:50%;flex:none} #dnui .st.done{background:var(--ok);box-shadow:0 0 0 3px rgba(52,211,153,.14)} #dnui .st.run{background:var(--run);box-shadow:0 0 0 3px rgba(96,165,250,.14);animation:dnpulse 1.6s infinite} #dnui .st.wait{background:var(--wait);box-shadow:0 0 0 3px rgba(251,191,36,.14)} #dnui .st.err{background:var(--err);box-shadow:0 0 0 3px rgba(248,113,113,.14)} @keyframes dnpulse{0%,100%{opacity:1}50%{opacity:.45}} #dnui .t-body{flex:1;min-width:0} #dnui .t-fn{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} #dnui .t-st{font-size:10.5px;color:var(--sub);margin-top:2px} #dnui .t-ops{display:flex;gap:6px;flex:none} #dnui .op{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--sub);background:none;border:1px solid var(--line);border-radius:7px;padding:5px 8px;cursor:pointer;transition:.15s} #dnui .op:hover{color:var(--txt);border-color:var(--pri2);background:rgba(34,211,238,.06)} #dnui .op svg{width:11px;height:11px;fill:currentColor} #dnui .op.primary{color:var(--txt);border-color:rgba(139,92,246,.5);background:rgba(139,92,246,.12)} #dnui .op.primary:hover{background:rgba(139,92,246,.2)} #dnui .op.disabled{opacity:.35;pointer-events:none} #dnui .empty{padding:18px 0;text-align:center;color:var(--dim);font-size:12px;border:1px dashed var(--line);border-radius:var(--r-md)} #dnui .page-tabs{display:flex;gap:4px;margin-top:8px;background:var(--card2);border:1px solid var(--line);border-radius:8px;padding:3px} #dnui .ptab{flex:1;text-align:center;padding:6px 0;font-size:12px;color:var(--sub);border-radius:6px;cursor:pointer;transition:.15s;user-select:none;background:none;border:none} #dnui .ptab:hover{color:var(--txt)} #dnui .ptab.on{background:linear-gradient(135deg,rgba(139,92,246,.26),rgba(34,211,238,.14));color:#fff;font-weight:600;box-shadow:0 2px 6px rgba(139,92,246,.2),inset 0 0 0 1px rgba(139,92,246,.4)} #dnui .pane-tutorial{margin-top:8px} #dnui .toast{position:fixed;left:50%;top:50%;transform:translateX(-50%) translateY(-50%) translateY(10px);background:#232B3D;border:1px solid rgba(139,92,246,.35);color:var(--txt);font-size:13px;padding:10px 18px;border-radius:999px;opacity:0;transition:.3s;pointer-events:none;z-index:200;box-shadow:0 14px 34px rgba(0,0,0,.6);max-width:86vw} #dnui .toast.show{opacity:1;transform:translateX(-50%) translateY(-50%)} @media(max-width:720px){#dnui .pop-main{grid-template-columns:1fr}#dnui .col-task{order:-1}} `); /* ========== 工具函数 ========== */ function toast(msg, ms) { var el = document.getElementById('dnToast'); if (!el) { // 弹窗未打开时兜底:顶部浮动提示,避免"点击没反应" var old = document.getElementById('dnFloatTip'); if (old) old.remove(); var d = document.createElement('div'); d.id = 'dnFloatTip'; d.style.cssText = 'position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);background:#232B3D;border:1px solid rgba(139,92,246,.55);color:#F2F4F8;font-size:13px;padding:10px 18px;border-radius:999px;z-index:2147483647;box-shadow:0 12px 34px rgba(0,0,0,.55);font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;max-width:82vw;text-align:center'; d.textContent = msg; document.body.appendChild(d); setTimeout(function () { d.remove(); }, typeof ms === 'number' ? ms : 2600); return; } el.textContent = msg; el.classList.add('show'); clearTimeout(el._t); el._t = setTimeout(function () { el.classList.remove('show') }, typeof ms === 'number' ? ms : 2000); } function formatBytes(a, b) { b = b || 2; if (0 === a) return "0 B"; var c = 0 > b ? 0 : b, d = Math.floor(Math.log(a) / Math.log(1024)); return parseFloat((a / Math.pow(1024, d)).toFixed(c)) + " " + ["B", "KB", "MB", "GB", "TB"][d]; } function copyText(t) { var ta = document.createElement('textarea'); ta.style.position = 'fixed'; ta.style.opacity = 0; ta.value = t; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); } catch (e) { } document.body.removeChild(ta); } function getSelectedList() { var list = {}; var arr = []; try { arr = require('system-core:context/context.js').instanceForSystem.list.getSelected(); } catch (e) { var vue = document.querySelector('.wp-s-core-pan'); if (vue && vue.__vue__ && vue.__vue__.selectedList) { arr = vue.__vue__.selectedList; } } if (!arr || !arr.forEach) return list; arr.forEach(function (el) { if (el && el.fs_id) list[el.fs_id] = el; }); return list; } function getUsernameAndToken() { var html = document.documentElement.innerHTML; var m = html.match(/locals\.mset\(([\s\S]*?)\);/); if (m) { try { var d = JSON.parse(m[1]); return { username: d.username, bdstoken: d.bdstoken }; } catch (e) { } } m = html.match(/window\.locals\s*=\s*([\s\S]*?);/); if (m) { try { var d2 = JSON.parse(m[1]); return { username: d2.userInfo.username, bdstoken: d2.userInfo.bdstoken }; } catch (e) { } } return { username: "", bdstoken: "" }; } /* ========== 广告解锁(HillTopAds 门页) ========== */ function genAdToken() { var chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; var s = ''; for (var i = 0; i < 32; i++) s += chars.charAt(Math.floor(Math.random() * chars.length)); return s; } // 查询 30 分钟免看状态:该 IP 近期解锁过广告则直接提交,无需再开广告(2.8.1) function canBypassAd(cb) { var xhr = new XMLHttpRequest(); xhr.open('GET', config.main_url + '/ad_status.php', true); xhr.timeout = 8000; xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); cb && cb(r.bypass === 1); } catch (e) { cb && cb(false); } }; xhr.onerror = function () { cb && cb(false); }; xhr.send(); } // 获取广告 Direct URL(服务端 ad_url.php 读 hta-7577533.txt,会话内缓存)(2.8.4) var adUrlCache = null; function getAdUrl(cb) { if (adUrlCache) { cb && cb(adUrlCache); return; } var xhr = new XMLHttpRequest(); xhr.open('GET', config.main_url + '/ad_url.php', true); xhr.timeout = 8000; xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (r && r.ad_url && r.ad_url !== 'about:blank') { adUrlCache = r.ad_url; cb && cb(adUrlCache); return; } } catch (e) { } cb && cb(null); }; xhr.onerror = function () { cb && cb(null); }; xhr.send(); } // 一次点击全自动(2.8.4):同时打开广告窗 + 门页(auto),倒计时结束自动解锁提交,无需再点任何按钮 function adUnlock(cb) { var token = genAdToken(); config.adToken = token; getAdUrl(function (adUrl) { // 先开广告窗(Direct URL 按访问计费),再开门页 → 门页在活动标签,广告留后台加载 if (adUrl) { try { window.open(adUrl, '_blank'); } catch (e) { } } try { window.open(config.main_url + '/gate.php?token=' + token + '&auto=1', '_blank'); } catch (e) { } }); var tries = 0; (function poll() { if (tries > 60) { toast('广告解锁超时,请重试'); cb && cb(false); return; } var xhr = new XMLHttpRequest(); xhr.open('GET', config.main_url + '/check_unlock.php?token=' + token, true); xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (r.status === 1) { cb && cb(true); return; } tries++; setTimeout(poll, 2000); } catch (e) { tries++; setTimeout(poll, 2000); } }; xhr.onerror = function () { tries++; setTimeout(poll, 2000); }; xhr.send(); })(); } /* ========== 弹窗 HTML ========== */ var SVGFILE = ''; var SVGA2 = ''; var SVGCopy = ''; var SVGOpen = ''; var UI = { popup: function () { return `
`; } }; /* ========== 主逻辑 ========== */ var dnui = null, dnList = null; // 2.8.2:公告从服务器获取(失败时保留本地 config.gonggao 兜底) function loadNotice() { var xhr = new XMLHttpRequest(); xhr.open('GET', config.main_url + '/notice.php', true); xhr.timeout = 8000; xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (r && r.notice) { var el = document.getElementById('dnNotice'); if (el) el.textContent = r.notice; } } catch (e) { } }; xhr.onerror = function () { }; xhr.send(); } function openUI(fileInfo, batchFiles) { try { if (!dnui || !dnui.isConnected) { var d = document.createElement('div'); d.innerHTML = UI.popup(); dnui = d.firstElementChild; document.body.appendChild(dnui); bindUI(); loadNotice(); } // 批量模式:左侧文件卡显示批量信息 if (batchFiles && batchFiles.length) { var n = batchFiles.length; var total = batchFiles.reduce(function (s, f) { return s + (f.size || 0); }, 0); document.getElementById('dnFname').textContent = '已选 ' + n + ' 个文件'; document.getElementById('dnFsize').textContent = (total ? formatBytes(total) + ' · ' : '') + '批量提交'; var sub = document.getElementById('dnSub'); if (sub) sub.textContent = '批量提交 (' + n + ')'; dnui.classList.add('show'); return; } // 填充文件信息 config.file_name = fileInfo.server_filename || fileInfo.filename || "未知文件"; config.file_size = fileInfo.size || 0; document.getElementById('dnFname').textContent = config.file_name; document.getElementById('dnFsize').textContent = (config.file_size ? formatBytes(config.file_size) + ' · ' : '') + '已选文件'; var subB = document.getElementById('dnSub'); if (subB) subB.textContent = '提交解析'; dnui.classList.add('show'); } catch (e) { console.error('[度娘加速] openUI 失败', e); toast('打开弹窗失败:' + e.message); } } function closeUI() { if (dnui) dnui.classList.remove('show'); config.batchQueue = null; config.batchFiles = null; } function bindUI() { // 关闭遮罩 dnui.addEventListener('click', function (e) { if (e.target === dnui) closeUI(); }); // Tab 切换 var tabs = dnui.querySelectorAll('#dnTabs .tab'); tabs.forEach(function (t) { t.addEventListener('click', function () { tabs.forEach(function (x) { x.classList.remove('on') }); t.classList.add('on'); var m = t.getAttribute('data-m'); if (m === 'help') { dnui.classList.add('pop-help'); } else { dnui.classList.remove('pop-help'); config.mode = m; } }); }); // 提交解析(2.7.2:密码机制已去除,直接进入广告解锁流程) dnui.querySelector('#dnSub').addEventListener('click', function () { if (config.batchQueue && config.batchQueue.length) { var q = config.batchQueue; config.batchQueue = null; doBatchSubmit(q); return; } doSubmit(); }); // 查询全部任务 dnui.querySelector('#dnQuery').addEventListener('click', function () { doQueryAll(); }); // 批量复制直链 dnui.querySelector('#dnBatchCopy').addEventListener('click', function () { var items = getDoneItems(); if (!items.length) { toast('暂无成功直链'); return; } var txt = items.map(function (it) { return it.url; }).join('\n'); copyText(txt); toast('已复制 ' + items.length + ' 条直链'); }); // 批量推送 Aria2 dnui.querySelector('#dnBatchAria').addEventListener('click', function () { var items = getDoneItems(); if (!items.length) { toast('暂无成功直链'); return; } items.forEach(function (it) { sendAria2(it.url, it.name, true); }); toast('已推送 ' + items.length + ' 个任务至 Aria2'); }); // 联系我们:data-open 打开链接 / data-copy 复制(2.8.5 修复 data-open 无监听导致 Telegram 点击没反应) dnui.querySelectorAll('#dnHelp .mini-btn[data-copy], #dnHelp .mini-btn[data-open]').forEach(function (b) { b.addEventListener('click', function () { var url = b.getAttribute('data-open'); if (url) { window.open(url, '_blank'); toast('已打开 Telegram'); return; } copyText(b.getAttribute('data-copy')); toast('已复制'); }); }); // Esc 关闭 document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && dnui && dnui.classList.contains('show')) closeUI(); }); // 右上角关闭按钮(2.9.0) dnui.querySelector('#dnClose').addEventListener('click', function () { closeUI(); }); } function setSubLoading(on) { if (!dnui || !dnui.isConnected) return; var b = dnui.querySelector('#dnSub'); if (!b) return; if (on) { b.disabled = true; b.textContent = '广告解锁中…'; } else { b.disabled = false; b.textContent = '提交解析'; } } function doSubmit() { var sel = Object.keys(getSelectedList()); if (!sel.length) { toast('请先在网盘选择文件'); return; } setSubLoading(true); var res = getUsernameAndToken(); config.username = res.username; var bdstoken = res.bdstoken; var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://pan.baidu.com/share/set?bdstoken=' + encodeURIComponent(bdstoken) + '&period=1&pwd=' + encodeURIComponent(config.bd_password) + '&eflag_disable=true&channel_list=%5B%5D&schannel=4&fid_list=' + encodeURIComponent(JSON.stringify(sel)), true); xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (String(r.show_msg || '').indexOf('禁止') > -1) { setSubLoading(false); toast('该文件禁止分享'); return; } var shorturl = String(r.link || '').split('/').pop(); if (!shorturl) { setSubLoading(false); toast('初始化失败,请重试'); return; } // 2.8.1:30分钟内看过广告 → 免看直接提交;否则开门页看广告 canBypassAd(function (bypass) { if (bypass) { addWork(shorturl, config.bd_password, null, null, ''); return; } adUnlock(function (ok) { if (!ok) { setSubLoading(false); return; } addWork(shorturl, config.bd_password, null, null, config.adToken); }); }); } catch (e) { setSubLoading(false); toast('请求失败:' + e.message); } }; xhr.onerror = function () { setSubLoading(false); toast('网络错误,请重试'); }; xhr.send(); } function addWork(shorturl, password, cb, fileid, adToken) { var data = 'filename=' + encodeURIComponent(config.file_name) + '&username=' + encodeURIComponent(config.username) + '&baidu_fileid=' + encodeURIComponent(fileid || Object.keys(getSelectedList())[0] || '') + '&size=' + config.file_size + '&shorturl=' + encodeURIComponent(shorturl) + '&password=' + encodeURIComponent(password) + '&ad_token=' + encodeURIComponent(adToken || config.adToken || ''); var xhr = new XMLHttpRequest(); xhr.open('POST', config.main_url + '/addwork.php', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function () { setSubLoading(false); try { var r = JSON.parse(xhr.responseText); if (r.code === 0 || r.code === 13) { toast((r.code === 0 ? '任务提交成功' : '任务已存在') + ',等待解析后可查询', 10000); cb && cb(true); } else if (r.code === 109) { toast('提交被拦截:请先完成广告解锁(请更新到最新脚本)'); cb && cb(false); } else { toast('提交失败:' + (r.msg || r.code)); cb && cb(false); } } catch (e) { toast('响应解析失败'); cb && cb(false); } }; xhr.onerror = function () { setSubLoading(false); toast('提交网络错误'); cb && cb(false); }; xhr.send(data); } // 批量提交:多选文件 → 一次广告解锁 → 逐个建分享+提交 function doBatchSubmit(files) { if (!files || !files.length) { toast('没有可提交的文件'); return; } var res = getUsernameAndToken(); config.username = res.username; config.bdstoken = res.bdstoken; config.batchFiles2 = files; toast('批量提交:共 ' + files.length + ' 个文件'); // 2.8.1:30分钟内看过广告 → 免看直接批量提交;否则开门页看广告 canBypassAd(function (bypass) { if (bypass) { batchNext(); return; } toast('请先在门页完成广告解锁'); adUnlock(function (ok) { if (!ok) { config.batchFiles2 = null; setSubLoading(false); return; } batchNext(); }); }); } // 批量循环 function batchNext() { var files = config.batchFiles2; if (!files || !files.length) { setSubLoading(false); return; } var bdstoken = config.bdstoken; var total = files.length, ok = 0, fail = 0, i = 0; config.batchAbort = false; (function next() { if (config.batchAbort) { config.batchAbort = false; config.batchQueue = null; config.batchFiles = null; config.batchFiles2 = null; setSubLoading(false); toast('批量提交已中断,成功 ' + ok + ' 个'); return; } if (i >= total) { config.batchQueue = null; config.batchFiles = null; config.batchFiles2 = null; setSubLoading(false); toast('批量提交完成:成功 ' + ok + ' 个,失败 ' + fail + ' 个', 10000); return; } var f = files[i++]; config.file_name = f.server_filename || f.filename || '未知文件'; config.file_size = f.size || 0; toast('正在提交 (' + i + '/' + total + ') ' + config.file_name); var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://pan.baidu.com/share/set?bdstoken=' + encodeURIComponent(bdstoken) + '&period=1&pwd=' + encodeURIComponent(config.bd_password) + '&eflag_disable=true&channel_list=%5B%5D&schannel=4&fid_list=' + encodeURIComponent(JSON.stringify([f.fs_id])), true); xhr.onload = function () { var goNext = function () { setTimeout(next, 800); }; try { var r = JSON.parse(xhr.responseText); if (String(r.show_msg || '').indexOf('禁止') > -1) { fail++; goNext(); return; } var shorturl = String(r.link || '').split('/').pop(); if (!shorturl) { fail++; goNext(); return; } addWork(shorturl, config.bd_password, function (s) { if (s) ok++; else fail++; goNext(); }, f.fs_id); } catch (e) { fail++; goNext(); } }; xhr.onerror = function () { fail++; setTimeout(next, 800); }; xhr.send(); })(); } // 查询全部任务防重复:20 秒内不可重复查询(2.8.7) var lastQueryAt = 0; function doQueryAll() { var now = Date.now(); if (now - lastQueryAt < 20000) { var wait = Math.ceil((20000 - (now - lastQueryAt)) / 1000); toast('查询中,请 ' + wait + ' 秒后再试'); return; } lastQueryAt = now; // 2.8.9:点击立即给反馈,按钮进入查询中状态,避免误以为没点中 var qbtn = document.getElementById('dnQuery'); if (qbtn) { qbtn.disabled = true; qbtn.textContent = '查询中…'; } var queryDone = function () { if (qbtn) { qbtn.disabled = false; qbtn.textContent = '查询全部任务'; } }; var res = getUsernameAndToken(); config.username = res.username; if (!config.username) { queryDone(); toast('未获取到网盘账号'); return; } var xhr = new XMLHttpRequest(); xhr.open('GET', config.main_url + '/querywork_all.php?username=' + encodeURIComponent(config.username), true); xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (r.code === 0) { config.workdata = r.data || []; if (r.ua) config.ua = r.ua; renderList(config.workdata); var ok = 0; config.workdata.forEach(function (o) { if (o.workstate == 2 && String(o.download_url || '').indexOf('http') === 0) { ok++; if (!config.last_link) { config.last_link = o.download_url; config.last_name = o.filename; } } }); toast('查询成功:已解析成功 ' + ok + ' 个任务'); } else { toast('查询失败:' + (r.msg || '')); } } catch (e) { toast('查询响应异常'); } queryDone(); }; xhr.onerror = function () { toast('查询网络错误'); queryDone(); }; xhr.send(); } // 已解析成功的直链列表 function getDoneItems() { var arr = []; (config.workdata || []).forEach(function (o) { if (o.workstate == 2 && String(o.download_url || '').indexOf('http') === 0) { arr.push({ url: o.download_url, name: o.filename || '文件' }); } }); return arr; } function updateBatchBar() { var bar = dnui.querySelector('#dnBatchBar'); if (!bar) return; var items = getDoneItems(); if (!items.length) { bar.hidden = true; return; } bar.hidden = false; dnui.querySelector('#dnBatchInfo').textContent = '已成功 ' + items.length + ' 个任务'; } function renderList(list) { var box = dnui.querySelector('#dnList'); if (!list || !list.length) { box.innerHTML = '
暂无任务,点击「查询全部任务」获取解析状态
'; updateBatchBar(); return; } var html = ''; list.forEach(function (o) { var st = 'wait', stt = '排队中'; if (o.workstate == 2) { if (String(o.download_url || '').indexOf('http') === 0) { st = 'done'; stt = '解析完成'; } else { st = 'err'; stt = '链接异常'; } } else if (o.workstate == 1) { st = 'run'; stt = '解析中'; } else if (o.workstate >= 3) { st = 'err'; stt = '异常'; } var hasLink = (st === 'done'); html += '
' + '' + '
' + '
' + (o.filename || '未知文件') + '
' + '
' + stt + (o.workid ? ' · ID:' + o.workid : '') + '
' + '
' + '
' + '' + '' + '
'; }); box.innerHTML = html; // 绑定任务操作 box.querySelectorAll('.op').forEach(function (b) { b.addEventListener('click', function () { if (b.classList.contains('disabled')) { toast('该任务暂无直链'); return; } var url = b.getAttribute('data-url'); var name = b.getAttribute('data-name'); config.last_link = url; config.last_name = name; if (b.getAttribute('data-act') === 'copy') { copyText(url); toast('直链已复制'); } else { sendAria2(url, name); toast('已推送至 Aria2'); } }); }); updateBatchBar(); } // 百度盘域直链需要完整 UA + Referer,否则 aria2 一直 0 速度 function isBaiduLink(url) { return /baidu\.com/i.test(url || ''); } function getUaFor(url) { if (isBaiduLink(url)) return 'netdisk;5.2.6;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia'; return config.ua || 'netdisk;'; } function sendAria2(url, outFilename, silent) { var headers = ['User-Agent: ' + getUaFor(url)]; if (isBaiduLink(url)) headers.push('Referer: http://pan.baidu.com/disk/home'); var body = JSON.stringify({ "jsonrpc": "2.0", "method": "aria2.addUri", "id": "dnui", "params": [[url], { "header": headers, "out": outFilename, "dir": config.savePath, "pause": "false", "max-connection-per-server": "15", "seed-ratio": "0", "continue": "true", "user-agent": "LogStatistic" }] }); var xhr = new XMLHttpRequest(); xhr.open('POST', config.jsonrpc, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onload = function () { try { var r = JSON.parse(xhr.responseText); if (r.error) { if (!silent) { var em = String(r.error.message || ''); if (/directory|mkdir|cannot|create|path|d:/i.test(em)) { toast('下载位置「' + config.savePath + '」不存在或不可写,请在弹窗里修改'); } else { toast('Aria2 推送失败:' + (r.error.message || '连接被拒')); } } } else if (!silent) { toast('Aria2 已接收任务'); } } catch (e) { if (!silent) toast('Aria2 无响应,请确认已启动'); } }; xhr.onerror = function () { if (!silent) toast('Aria2 连接失败,请确认已启动(端口 6800)'); }; xhr.send(body); } /* ========== 页面按钮注入 ========== */ function isSharePage() { return location.href.indexOf('/share') > -1 || /pan\.baidu\.com\/s\//.test(location.href); } function btnMainClick() { try { if (isSharePage()) { toast('提示:请先保存到自己的网盘后,从网盘里解析'); return; } var sel = getSelectedList(); var keys = Object.keys(sel); if (!keys.length) { toast('请先在网盘选择一个文件'); return; } // 多选文件 → 批量提交(跳过文件夹) if (keys.length > 1) { var files = keys.map(function (k) { return sel[k]; }).filter(function (f) { return f.isdir != 1; }); if (!files.length) { toast('文件夹不支持批量解析'); return; } var skipped = keys.length - files.length; if (skipped) toast('已跳过 ' + skipped + ' 个文件夹'); config.batchQueue = files; config.batchFiles = files; openUI(null, files); return; } if (sel[keys[0]].isdir == 1) { toast('暂不支持文件夹解析'); return; } openUI(sel[keys[0]]); } catch (e) { console.error('[度娘加速] 点击异常', e); toast('操作异常:' + (e && e.message ? e.message : e)); } } // 复用网盘自带的按钮类,避免被工具栏布局压缩 function injectButton() { var btn = document.getElementById('dn_main_btn'); if (btn) return; var mk = function (tag, cls, inner) { var el = document.createElement(tag); el.id = 'dn_main_btn'; if (cls) el.className = cls; if (tag === 'a') el.href = 'javascript:;'; else el.type = 'button'; el.innerHTML = inner; el.style.cssText = 'margin-right:10px;color:#fff;background:linear-gradient(135deg,#8B5CF6,#22D3EE);border-color:rgba(255,255,255,.35);white-space:nowrap;'; el.addEventListener('click', btnMainClick); return el; }; var btnInner = '度娘加速'; var gBtnInner = '度娘加速'; // 1) 新版工具栏(必须用 h-group 包裹) var box = document.querySelector('.wp-s-agile-tool-bar__header.is-header-tool'); if (box) { var wrap = document.createElement('div'); wrap.className = 'wp-s-agile-tool-bar__h-group'; wrap.appendChild(mk('button', 'u-button nd-file-list-toolbar-action-item', btnInner)); box.prepend(wrap); return; } // 2) 分享页工具栏 var xb = document.querySelector('.x-button-box'); if (xb) { xb.prepend(mk('a', 'g-button', gBtnInner)); return; } // 3) 旧工具栏 var t = document.querySelector('.tcuLAu'); if (t) { t.prepend(mk('a', 'g-button', gBtnInner)); return; } // 4) 兜底 var bar = document.querySelector('.u-button'); if (bar && bar.parentElement) bar.parentElement.appendChild(mk('button', 'u-button', btnInner)); else document.body.appendChild(mk('button', '', '度娘加速')); } function init() { setTimeout(injectButton, 1200); // 监听页面变化,工具栏出现后补注入 var mo = new MutationObserver(function () { if (!document.getElementById('dn_main_btn')) injectButton(); }); mo.observe(document.body, { childList: true, subtree: true }); setTimeout(function () { mo.disconnect(); }, 30000); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();