Greasy Fork

Greasy Fork is available in English.

百度网盘批量下载

解析百度网盘直链

当前为 2024-12-23 提交的版本,查看 最新版本

在您安装前,Greasy Fork 希望您知道此脚本声明其包含了一些负面功能。这些功能也许会使脚本作者获利,而不能给您带来任何直接的金钱收益。

此脚本会在您访问的网站中插入广告

您只有在参与某些事后才能使用脚本的全部功能,如加入某群组、订阅某频道或在某页点赞等。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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
// ==/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 = `<div style="max-width:32rem;line-height:1.6">${obj.toString()}</div>`;
    }
  },
  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", '<button id="dlink" class="btn baidu"><i class="icon icon-picpre-download"></i> \u4e0b\u8f7d</button>');
              (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<br>\u53ef\u80fd\u670d\u52a1\u5668\u88ab\u653b\u51fb\u5d29\u4e86<br>\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<br>\u52a0\u5165\u7535\u62a5\u7fa4\u89e3\u9501\u6279\u91cf\u4e0b\u8f7d<br><a href="https://t.me/+dxxAFTo4bNI0ZGE9" target="_blank">hd2a</a>');
                }
              });
            }
          } 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();