// ==UserScript== // @namespace greasyfork // @name 百度网盘批量下载 // @license MIT // @version 0.0.1 // @description 解析百度网盘直链 // @homepage http://1.94.138.197/bangumi // @antifeature ads // @antifeature membership // @match https://pan.baidu.com/* // @connect 1.94.138.197 // @connect baidu.com // @connect localhost // @connect * // @noframes // @grant GM_info // @grant GM_cookie // @grant GM_download // @grant GM_addStyle // @grant GM_getValue // @grant GM_openInTab // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant window.onurlchange // @grant unsafeWindow // @run-at document-body // @downloadURL none // ==/UserScript== const u = { host: () => location.hostname.split(".").slice(-2).join("_"), now: () => Math.floor(Date.now() / 1e3), uid: () => Date.now().toString(36).toUpperCase(), rand: num => Math.floor(1e6 * Math.random()) % num, serialize: obj => "object" == typeof obj ? new URLSearchParams(Object.entries(obj)).toString() : obj, usp: str => str ? Object.fromEntries(new URLSearchParams(str).entries()) : null, ajax: obj => new Promise(resolve => { "string" == typeof obj && (obj = { url: obj }); obj.method = obj.hasOwnProperty("data") ? "POST" : "GET"; GM_xmlhttpRequest(Object.assign({ responseType: "json", onerror: () => { resolve(JSON.parse('{"code":1,"message":"error"}')); }, ontimeout: () => { resolve(JSON.parse('{"code":1,"message":"timeout"}')); }, onload: r => { resolve("json" == r.responseType ? r.response : r); } }, obj)); }), dialog: obj => { if (null != obj) { let dom = document.querySelector("#liveDialog"); if (null == dom) { (dom = document.createElement("dialog")).id = "liveDialog"; document.body.appendChild(dom); dom.addEventListener("click", e => { if (e.target == e.currentTarget) { e.preventDefault(); e.stopPropagation(); e.target.close(); } }); setTimeout(() => { let dom = document.activeElement; "BODY" != dom.tagName && dom.blur(); }, 200); } dom.open || dom.showModal(); if (obj instanceof HTMLElement) { dom.innerHTML = ""; dom.appendChild(obj); } else dom.innerHTML = `
${obj.toString()}
`; } }, mcookie: (data, list, num) => { let arr; if (Array.isArray(list) && list.length) { num ??= list.length; arr = data.filter(t => list.includes(t.name)); } else { num = 1; arr = data.filter(t => t.httpOnly); } const pair = new Map(arr.map(t => [ t.name, t.value ])); return num > (arr = Array.from(pair).map(t => t.join("="))).length ? "" : arr.join("; "); }, load: (k, v) => { v ??= null; return GM_getValue(k + "_" + u.host(), v); }, save: (k, v) => { v ??= null; GM_setValue(k + "_" + u.host(), v); }, strcut: (str, a, b) => { let s, x, y, p = str.indexOf(a); if (-1 == p) s = str; else { x = p + a.length; if (null == b) y = str.length; else { p = str.indexOf(b, x); y = -1 == p ? str.length : p; } s = str.slice(x, y); } return s; }, download: (url, name, info) => { info ??= null; name ??= null; const obj = { url: url, name: name, conflictAction: "prompt", headers: { referer: location.href } }; GM_download(Object.assign(obj, info)); } }; const box = { menu: false, wait: false, version: GM_info.script.version, home: "http://1.94.138.197" }; if ("/disk/home" == location.pathname) { GM_addStyle('@import url("https://cdn.bootcdn.net/ajax/libs/bootstrap-icons/1.11.0/font/bootstrap-icons.min.css");body{max-width:100vw;overflow-x:hidden}#liveDialog{border:none;cursor:default;display:none;font-family:"Microsoft YaHei UI",monospace;font-size:14px !important;margin:auto;max-width:720px;padding:1.5rem;text-align:justify}#liveDialog[open]{display:block}#liveDialog a{text-decoration:none}#liveDialog ul{list-style:none inside none;margin:0;overflow-y:auto;padding:0;scrollbar-width:none}#liveDialog ul::-webkit-scrollbar{display:none}#liveDialog ul.ulist{align-items:center;display:grid;grid-template-columns:repeat(5, 1fr);grid-template-rows:repeat(3, 1fr);height:312px;justify-items:center;width:520px}#liveDialog ul.ulist>li{margin:0;padding:0}#liveDialog ul.ulist>li>img{border:none;border-radius:20%;display:block}#liveDialog ul.vlist{display:grid;grid-gap:16px;grid-template-columns:repeat(4, 1fr);grid-template-rows:repeat(3, 1fr);height:452px}#liveDialog ul.vlist>li{height:140px;margin:0;padding:0;width:160px}#liveDialog ul.vlist>li>a{color:#333;cursor:default;display:block}#liveDialog ul.vlist>li>a>img{display:block}#liveDialog ul.vlist>li>a>div.title{-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;line-height:1.25;margin:5px 0 0 2px;overflow:hidden;white-space:normal}#liveDialog form{display:block;margin:0;min-width:320px;padding:0}#liveDialog form input{box-shadow:none;color:#000}#liveDialog form input:focus{box-shadow:none;outline:none}#liveDialog form input[type=text]{background-color:#fff;border:1px solid #999;box-sizing:border-box;display:block;font-size:inherit;padding:.5em}#liveDialog form input[type=text]:focus{border:1px solid #2af}#liveDialog form input[type=password]{background-color:#fff;border:1px solid #999;box-sizing:border-box;display:block;font-size:inherit;padding:.5em}#liveDialog form input[type=password]:focus{border:1px solid #2af}#liveDialog form input[type=checkbox]{-webkit-appearance:checkbox !important}#liveDialog form input[type=radio]{-webkit-appearance:radio !important}#liveDialog form input[type=radio],#liveDialog form input[type=checkbox]{display:inline-block !important;height:1em;margin-right:.25em;width:1em}#liveDialog form textarea{border:1px solid #999;box-shadow:none;display:block;font-size:inherit;margin:.5rem 0;outline:none;padding:.5em;resize:none;width:calc(100% - 1em)}#liveDialog form textarea:focus{border:1px solid #2af}#liveDialog form label{display:block;margin:.5rem 0}#liveDialog form label>input{display:block;margin-top:.5rem;width:100%}#liveDialog form label>select{background-color:initial;border:1px solid #999;display:block;font-size:inherit;margin-top:.5rem;padding:.5em;width:100%}#liveDialog form>div{padding:8px 0}#liveDialog form>div.input-group{display:flex}#liveDialog form>div.input-group>input{flex:auto}#liveDialog form>div.input-group>button,#liveDialog form>div.input-group lable,#liveDialog form>div.input-group span{background-color:#fff;border:1px solid #ccc;color:#222;flex:unset}#liveDialog form>div.input-group>button,#liveDialog form>div.input-group lable,#liveDialog form>div.input-group span,#liveDialog form>div.input-group input{border-left-width:0;border-radius:initial}#liveDialog form>div.input-group>button:first-child,#liveDialog form>div.input-group lable:first-child,#liveDialog form>div.input-group span:first-child,#liveDialog form>div.input-group input:first-child{border-bottom-left-radius:.25rem;border-left-width:1px;border-top-left-radius:.25rem}#liveDialog form>div.input-group>button:last-child,#liveDialog form>div.input-group lable:last-child,#liveDialog form>div.input-group span:last-child,#liveDialog form>div.input-group input:last-child{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}#liveDialog form>div.inline>label{display:inline-block;margin-right:1.5rem}#liveDialog form>div>div:not([class]):before{content:"\xbb";margin-right:.5em}#liveDialog form>div>label{margin:.5rem 0}#liveDialog form>label:before{content:"\xbb";margin-right:.5em}button.btn{background-color:#fff;border:1px solid #ccc;border-radius:0;color:#333;cursor:default;display:inline-block;padding:5px 1rem;font-size:inherit}button.btn:hover{color:#fff;background-color:#000;border-color:#000}div.btn-group{box-sizing:border-box;display:inline-flex}div.btn-group.full{display:flex}div.btn-group.outline button{background-color:#fff;border:1px solid #ccc;color:#000}div.btn-group.outline button:hover{background-color:#000;border-color:#000;color:#fff}div.btn-group.outline button:not(:first-child){border-left:none}div.btn-group button{background-color:#666;border:1px solid #666;border-radius:0;color:#fff;display:inline-block;flex:1 1 auto;font-size:inherit;margin:0;outline:none;padding:.5em 1.25em;position:relative}div.btn-group button:first-child{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}div.btn-group button:last-child{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}div.btn-group button:hover{background-color:#000}div.center{align-content:center;display:flex;justify-content:center}div.summary{color:#888}i[class]::before{font-size:110%;vertical-align:-0.15em}@keyframes spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.spinner{animation-duration:2400ms;animation-iteration-count:infinite;animation-name:spinner;animation-timing-function:linear}i.spinner{animation:none}i.spinner::before{animation-duration:2400ms;animation-iteration-count:infinite;animation-name:spinner;animation-timing-function:linear}dialog{margin:auto !important}.btn.baidu{background-color:#8183f1;color:#fff;border-color:#8183f1;border-radius:4px;line-height:32px;padding:0 16px;font-size:14px}.btn.baidu:hover{background-color:#5E35B1;border-color:#5E35B1}#layoutMain{font-size:14px}div.file-name{font-family:"Microsoft YaHei UI", monospace}.wp-side-options,span.newIcon,span[node-type=find-apps],[node-type=header-union],dd.desc-box>div,img.btn-img-tips,span.user-name,[node-type=header-apps],dd:has(> .dir-card-small, > .dir-share-small, > .dir-apps-small){display:none !important}'); fetch("/rest/2.0/membership/user/info?method=query&clienttype=0&app_id=250528&web=1").then(r => r.json()).then(d => { if (d.hasOwnProperty("user_info")) { box.ui = { uid: d.user_info.uk.toString(), vip: d.user_info.is_svip ? 2 : 0 }; GM_cookie.list({}, (r, e) => { if (null == e) { box.ui.cookie = u.mcookie(r, [ "BAIDUID", "BDUSS", "STOKEN" ]); if (box.ui.cookie) box.dcontext = unsafeWindow.require("system-core:context/context.js"); else { let idx = 0, len = r.length; r.forEach(t => { GM_cookie.delete({ name: t.name }, e => { idx++; if (len <= idx) { localStorage.clear(); location.replace("https://pan.baidu.com/login"); } }); }); } } else u.dialog("\u4ec5\u652f\u6301Tampermonkey Beta"); }); } else GM_addStyle(".btn.baidu{display: none !important}"); }); unsafeWindow.XMLHttpRequest = new Proxy(XMLHttpRequest, { construct: target => { let url, body; return new Proxy(new target(), { set: (target, prop, value) => Reflect.set(target, prop, value), get: (target, prop) => { let value = target[prop]; if ("function" == typeof value) value = function() { switch (prop) { case "open": url = arguments[1]; break; case "send": body = arguments[0]; } return Reflect.apply(target[prop], target, arguments); }; else if ("responseText" == prop) if (url.includes("/api/quota")) { let usp = new URLSearchParams(u.strcut(url, "?")); box.logid = usp.get("logid"); box.token1 = usp.get("bdstoken"); box.token2 = unsafeWindow.jsToken; if (!box.menu) { box.menu = true; let dom = document.querySelector("div:has(>span.g-new-create)"); dom.insertAdjacentHTML("afterbegin", ''); (dom = document.querySelector("#dlink")).addEventListener("click", async e => { e.preventDefault(); e.stopPropagation(); const btn = e.target.querySelector("i.icon"); if (box.wait) u.dialog("\u8bf7\u7a0d\u540e\u518d\u64cd\u4f5c"); else { let d, files = box.dcontext.instanceForSystem.list.getSelected().filter(t => !t.isdir).map(t => ({ fid: t.fs_id, name: t.server_filename, path: t.path, size: Math.ceil(t.size / (1 << 20)) })); if (1 == files.length) { box.wait = true; btn.className = "icon icon-share"; if (null == box.ui?.logid) { box.ui.logid = box.logid; box.ui.token1 = box.token1; box.ui.token2 = box.token2; } 0 == (d = await u.ajax({ url: `${box.home}/api/dlink0`, data: JSON.stringify({ files: files, ui: box.ui, version: box.version }) })).code ? d.data.forEach(t => { u.download(t.url, t.name, t.info); }) : 1 == d.code ? u.dialog("\u8fde\u63a5\u89e3\u6790\u670d\u52a1\u5668\u5931\u8d25
\u53ef\u80fd\u670d\u52a1\u5668\u88ab\u653b\u51fb\u5d29\u4e86
\u660e\u5929\u518d\u5c1d\u8bd5\u5427") : d.message.startsWith("http") ? location.replace(d.message) : u.dialog(d.message); box.wait = false; btn.className = "icon icon-picpre-download"; } else u.dialog('\u8bf7\u52fe\u90091\u4e2a\u6587\u4ef6
\u52a0\u5165\u7535\u62a5\u7fa4\u89e3\u9501\u6279\u91cf\u4e0b\u8f7d
hd2a'); } }); } } else if (url.includes("/adx")) { const d = JSON.parse(value); if (d.hasOwnProperty("list")) { d.list = null; d.error_code = 31402; value = JSON.stringify(d); } } return value; } }); } }); } else "/disk/main" == location.pathname && location.hash.startsWith("#/index") ? location.replace(`/disk/home?stayAtHome=true#/all?path=${u.strcut(location.hash, "path=", "&")}`) : "/share/init" == location.pathname ? GM_addStyle("#init-new{background: none !important}#ft,iframe{display: none !important}") : location.pathname.startsWith("/s/") ? GM_addStyle(".bd-aside-ad,.module-share-footer{display: none !important}") : "/login" == location.pathname && localStorage.clear();