Greasy Fork is available in English.

百度网盘批量下载

搭配Motrix使用

// ==UserScript==
// @name 百度网盘批量下载
// @namespace greasyfork
// @version 0.0.1
// @license MIT
// @description 搭配Motrix使用
// @homepage http://140.245.52.124/bangumi
// @match https://pan.baidu.com/*
// @connect 1.94.138.197
// @connect 140.245.52.124
// @connect baidu.com
// @connect localhost
// @connect *
// @noframes
// @grant GM.info
// @grant GM.cookie
// @grant GM.addStyle
// @grant GM.xmlHttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @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(),
  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));
  }),
  aria2: data => {
    if (data?.url && Array.isArray(data.url)) {
      let obj = {
        id: u.uid(),
        method: "aria2.addUri",
        params: []
      };
      box?.aria2?.token && obj.params.push("token:" + box.aria2.token);
      obj.params.push(data.url);
      data?.info && obj.params.push(data.info);
      GM.xmlHttpRequest({
        url: box.aria2.jsonrpc,
        method: "POST",
        timeout: 2e3,
        data: JSON.stringify(obj),
        ontimeout: () => {
          u.dialog("\u8bf7\u68c0\u67e5Motrix\u662f\u5426\u5df2\u7ecf\u8fd0\u884c\u53ca\u76f8\u5173\u8bbe\u7f6e\u662f\u5426\u6b63\u786e");
        }
      });
    }
  },
  dialog: obj => {
    if (null != obj) {
      let dom = document.querySelector("#liveDialog");
      if (null == dom) {
        dom = document.createElement("dialog");
        dom.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>`;
    }
  },
  pwd: len => {
    len ??= 4;
    let arr = [], str = "abcdefghijklmnopqrstuvwxyz23456789ABCDEFGHKLMNPSTVWXY";
    for (let i = 0; i < len; i++) arr.push(str[Math.floor(1e3 * Math.random()) % str.length]);
    return arr.join("");
  },
  fixcookie: data => {
    data ??= [];
    let arr, pair = new Map(data.map(t => [ t.name, t.value ]));
    arr = Array.from(pair).map(t => t.join("="));
    return arr.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;
  },
  form: (str, data) => {
    let arr = document.querySelectorAll(`${str} [name]`);
    arr.length && arr.forEach(t => {
      let s = t.getAttribute("name");
      if (data.hasOwnProperty(s)) {
        let v = data[s];
        switch (t.getAttribute("type")) {
          case "radio":
          t.checked = v == t.value;
          break;
          case "checkbox":
          t.checked = !!v;
          break;
          default:
          t.value = v;
        }
      }
    });
  }
};
const box = {
  now: u.now(),
  wait: false,
  version: GM_info.script.version,
  home: "http://1.94.138.197"
};
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}');
const zset = () => {
  const dom = document.createElement("form");
  dom.method = "dialog";
  dom.insertAdjacentHTML("beforeend", '<label>\u8bbe\u7f6eAria2\u6216Motrix\u7684jsonrpc <input name="jsonrpc" type="text" autocomplete="off" placeholder="http://localhost:16800/jsonrpc" required></label><label>\u8bbe\u7f6eAria2\u6216Motrix\u8bbf\u95ee\u79d8\u94a5 <input name="token" type="text" autocomplete="off" placeholder="\u6ca1\u6709\u79d8\u94a5\u5219\u4e0d\u8981\u586b\u5199"></label><div class="btn-group"><button type="button"><i class="bi-x-square"></i> \u53d6\u6d88</button><button type="submit"><i class="bi-check2-square"></i> \u786e\u5b9a</button></div>');
  dom.addEventListener("submit", e => {
    e.preventDefault();
    e.stopPropagation();
    const body = new FormData(e.target);
    box.aria2 = Object.assign({}, box.defaults, Object.fromEntries(body.entries()));
    u.save("aria2", box.aria2);
    document.querySelector("#liveDialog").close();
  });
  dom.querySelector("button[type=button]").addEventListener("click", e => {
    e.preventDefault();
    e.stopPropagation();
    document.querySelector("#liveDialog").close();
  });
  u.dialog(dom);
  u.form("#liveDialog", box.aria2);
};
const gift = num => {
  const dom = document.createElement("form");
  dom.method = "dialog";
  dom.insertAdjacentHTML("beforeend", '<div><span name="uid"></span><span style="margin-left:3em">\u5f53\u524d\u70b9\u6570</span> <span name="num"></span></div><label>\u63a5\u6536\u8005 <input name="uid" type="text" autocomplete="off" placeholder="\u586b\u5199\u5bf9\u65b9\u7684uid" pattern="[0-9]{4,22}" required></label><label>\u8f6c\u79fb\u70b9\u6570 <input name="num" type="text" autocomplete="off" placeholder="\u586b\u5199\u5c06\u8f6c\u79fb\u7684\u89e3\u6790\u70b9\u6570" pattern="[0-9]{1,4}" required></label><div class="btn-group"><button name="signin" type="button"><i class="bi-clock"></i> \u7b7e\u5230</button><button name="vlike" type="button"><i class="bi-heart"></i> \u70b9\u8d5e</button><button type="submit"><i class="bi-check2-square"></i> \u786e\u5b9a</button></div><div name="tips" style="color: #3b8cff"><a href="http://140.245.52.124/bangumi" target="_blank">\u70b9\u51fb\u67e5\u770b\u811a\u672c\u8be6\u7ec6\u8bf4\u660e</a></div>');
  dom.querySelector("span[name=uid]").textContent = box.ui.uid;
  dom.querySelector("span[name=num]").textContent = num;
  dom.addEventListener("submit", e => {
    e.preventDefault();
    e.stopPropagation();
    const tips = document.querySelector("#liveDialog div[name=tips]");
    let body = new FormData(e.target);
    body = Object.fromEntries(body.entries());
    let i = Number.parseInt(body.num);
    Number.isNaN(i) && (i = 0);
    body.num = i;
    if (box.wait) tips.textContent = "\u53d6\u6d88\u8fde\u70b9\u64cd\u4f5c"; else if (body.uid == box.ui.uid) tips.textContent = "\u63a5\u6536\u8005\u4e0d\u80fd\u662f\u5f53\u524d\u767b\u5f55\u8d26\u53f7\u7684uid"; else if (body.num < 1) tips.textContent = "\u8f6c\u79fb\u89e3\u6790\u70b9\u6570\u7684\u6570\u91cf\u65e0\u6548"; else if (body.num > num) tips.textContent = "\u5269\u4f59\u89e3\u6790\u70b9\u6570\u4e0d\u8db3"; else {
      box.wait = true;
      body.ui = box.ui;
      u.ajax({
        url: `${box.home}/api/gift`,
        data: JSON.stringify(body)
      }).then(d => {
        box.wait = false;
        if (0 == d.code) {
          num -= body.num;
          document.querySelector("#liveDialog span[name=num]").textContent = num;
          document.querySelector("input[name=num]").value = "";
        }
        tips.textContent = d.message;
      });
    }
  });
  dom.querySelector("input[name=uid]").addEventListener("focus", e => {
    e.preventDefault();
    e.stopPropagation();
    e.target.value = "";
  });
  dom.querySelector("button[name=vlike]").addEventListener("click", async e => {
    e.preventDefault();
    e.stopPropagation();
    await u.ajax({
      url: `${box.home}/api/vlist?uid=${box.ui.uid}`
    }).then(d => {
      box.vlist = 0 == d.code ? d.data : [];
    });
    if (box.vlist.length) {
      let x, y = GM_getValue("douyin", []);
      if (y.length) {
        x = box.vlist.map(t => t.vid);
        y = y.filter(t => x.includes(t));
        GM_setValue("douyin", y);
        y.length && (box.vlist = box.vlist.filter(t => !y.includes(t.vid)));
      } else GM_setValue("douyin", []);
    }
    if (box.vlist.length) {
      let s = '<li><a href="https://www.douyin.com/discover?modal_id=[vid]" referrerpolicy="no-referrer" target="_blank"><img src="[cover]" crossOrigin="anonymous" referrerpolicy="no-referrer"><div class="title">[title]</div></a></li>';
      u.dialog(`<ul class="vlist">${u.tpl(s, box.vlist)}</ul>`);
    } else u.dialog("\u6682\u65e0\u53ef\u4f9b\u70b9\u8d5e\u7684\u89c6\u9891<br>\u8bf7\u5230\u7535\u62a5\u4ea4\u6d41\u7fa4\u81ea\u5df1\u6dfb\u52a0\u89c6\u9891");
  });
  dom.querySelector("button[name=signin]").addEventListener("click", e => {
    e.preventDefault();
    e.stopPropagation();
    if (!box.wait) {
      const tips = document.querySelector("#liveDialog div[name=tips]");
      const latest = u.load("tisign", 0);
      if (box.now > latest) {
        box.wait = true;
        u.save("tisign", box.now + 9e3);
        u.ajax({
          url: `${box.home}/api/signinbaidu`,
          data: JSON.stringify({
            ui: box.ui
          })
        }).then(d => {
          box.wait = false;
          tips.textContent = d.message;
          0 == d.code && (dom.querySelector("span[name=num]").textContent = d.num);
        });
      } else tips.textContent = "\u6bcf\u5929\u53ea\u80fd\u7b7e\u52301\u6b21";
    }
  });
  u.dialog(dom);
};
const captcha = obj => {
  u.dialog('<form method="dialog" style="width: 240px; min-width: auto"><div style="text-align: center"><img width="120" height="40"></div><div class="input-group"><input name="captcha" class="form-control" style="border: 1px solid #ccc; padding-left: 1em"><button class="btn btn-primary" type="submit">\u786e\u5b9a</button></div><div>\u770b\u4e0d\u6e05\u9a8c\u8bc1\u7801\u53ef\u4ee5\u70b9\u51fb\u56fe\u7247\u66f4\u6362</div></form>');
  let dom = document.querySelector("#liveDialog img");
  if (dom) {
    dom.setAttribute("src", obj.img);
    dom.addEventListener("click", async e => {
      const d = await u.ajax({
        url: `${box.home}/api/vcodebaidu`,
        data: `{"id":${obj.id}}`
      });
      if (0 == d.code) {
        e.target.src = d.data.img;
        obj.vcode = d.data.vcode;
        const dom1 = document.querySelector("#liveDialog input");
        dom1.value = "";
        dom1.focus();
      }
    });
    document.querySelector("#liveDialog form").addEventListener("submit", async e => {
      e.preventDefault();
      e.stopPropagation();
      const body = new FormData(e.target);
      obj.captcha = body.get("captcha");
      obj.ui = box.ui;
      if (4 == obj.captcha.length) {
        const d = await u.ajax({
          url: `${box.home}/api/dlink3`,
          data: JSON.stringify(obj)
        });
        if (0 == d?.code) {
          document.querySelector("#liveDialog").close();
          for (const i of d.data) await u.ajax({
            url: `${box.home}/api/dlink2`,
            data: JSON.stringify(Object.assign({
              ui: box.ui
            }, i))
          }).then(d => {
            0 == d.code && u.aria2(d.data);
          });
        }
      }
    });
  }
};
const dlink = async () => {
  if (box.wait) u.dialog("\u5360\u7ebf\u4e2d \u8bf7\u7a0d\u540e\u518d\u64cd\u4f5c<br>\u82e5\u8fde\u7eed\u591a\u6b21\u63d0\u793a\u6b64\u4fe1\u606f\u8bf7\u5237\u65b0\u9875\u9762"); else if (box.online) if (null == box?.share?.skey) u.dialog("\u811a\u672c\u8fd8\u672a\u51c6\u5907\u597d \u8bf7\u7a0d\u540e\u518d\u64cd\u4f5c"); else {
    const spath = box.dcontext.instanceForSystem.list.getCurrentPath();
    if (spath.startsWith(box.share.sdir)) {
      let d, body, busp;
      body = {
        id: u.uid(),
        method: "aria2.changeGlobalOption",
        params: []
      };
      box?.aria2?.token && body.params.push("token:" + box.aria2.token);
      body.params.push({
        "max-concurrent-downloads": "1"
      });
      d = await u.ajax({
        timeout: 5e3,
        url: box.aria2.jsonrpc,
        data: JSON.stringify(body)
      });
      if (d.hasOwnProperty("result")) {
        let files = [];
        for (const i of box.dcontext.instanceForSystem.list.getSelected()) i.isdir ? files = files.concat(await dscan(i.path)) : files.push(i);
        if (files.length) {
          files = files.map(t => ({
            fid: t.fs_id,
            out: t.path,
            size: t.size
          }));
          box.wait = true;
          box.icon.className = "bi-arrow-clockwise spinner";
          d = await u.ajax({
            url: `${box.home}/api/pibaidu`,
            data: JSON.stringify({
              ui: box.ui
            })
          });
          if (0 == d?.code) if (box.version == d.version) {
            const total = files.reduce((d, t) => {
              d += Math.ceil(t.size / 1073741824);
              return d;
            }, 0);
            if (d.num > total) if (2 == box.ui.vip) await u.ajax({
              url: `${box.home}/api/dlink5`,
              data: JSON.stringify({
                ui: box.ui,
                files: files
              })
            }).then(d => {
              0 == d?.code ? d.data.forEach(t => {
                u.aria2(t);
              }) : u.dialog(d.message);
            }); else {
              let lsfile = files.filter(t => t.size <= 314572800);
              if (lsfile.length) {
                let arr = [];
                do {
                  const chunk = lsfile.splice(0, 20);
                  arr.push(chunk);
                } while (0 < lsfile.length);
                for (const t of arr) {
                  d = await u.ajax({
                    timeout: 9e4,
                    url: `${box.home}/api/dlink6`,
                    data: JSON.stringify({
                      ui: box.ui,
                      files: t
                    })
                  });
                  0 == d?.code && d.data.forEach(t => {
                    u.aria2(t);
                  });
                }
              }
              box.share.files = files.filter(t => 314572800 < t.size).map(t => {
                t.size = Math.ceil(t.size / (1 << 30));
                return t;
              });
              if (box.share.files.length) {
                busp = {
                  surl: box.share.surl,
                  fields: "sign,timestamp",
                  channel: "chunlei",
                  web: 1,
                  app_id: "250528",
                  bdstoken: box.ui.token1,
                  logid: box.ui.logid,
                  clienttype: 0,
                  "dp-logid": unsafeWindow.bpDataInit.getDpLogId()
                };
                d = await fetch(`https://pan.baidu.com/share/tplconfig?${u.serialize(busp)}`).then(r => r.json());
                if (0 == d.errno) {
                  box.share.sign = d.data.sign;
                  box.share.timestamp = d.data.timestamp;
                  d = await u.ajax({
                    url: `${box.home}/api/dlink1`,
                    data: JSON.stringify({
                      ui: box.ui,
                      share: box.share
                    })
                  });
                  if (0 == d?.code) for (const i of d.data) await u.ajax({
                    url: `${box.home}/api/dlink2`,
                    data: JSON.stringify(Object.assign({
                      ui: box.ui
                    }, i))
                  }).then(d => {
                    0 == d?.code && u.aria2(d.data);
                  }); else 20 == d.code ? captcha(d.data) : d?.message && u.dialog(d.message);
                } else u.dialog("\u8bf7\u5c1d\u8bd5\u6e05\u7406\u6d4f\u89c8\u5668\u672c\u5730\u7f13\u5b58\u5e76\u91cd\u65b0\u767b\u5f55\u8d26\u53f7");
              }
            } else u.dialog("\u89e3\u6790\u70b9\u6570\u4e0d\u8db3");
          } else location.replace(d.homepage ?? GM.info.script.homepage); else u.dialog(d?.message);
          box.wait = false;
          box.icon.className = "bi-cloud-download";
        } else u.dialog("\u6ca1\u6709\u9700\u8981\u89e3\u6790\u7684\u6587\u4ef6 \u53ef\u80fd\u52fe\u9009\u4e86\u7a7a\u6587\u4ef6\u5939");
      } else u.dialog("1. \u68c0\u67e5Motrix\u662f\u5426\u5df2\u7ecf\u8fd0\u884c<br>2. \u70b9\u51fb\u300c\u8bbe\u7f6e\u300d\u6309\u94ae\u67e5\u770b\u8bbe\u7f6e\u662f\u5426\u4e0eMotrix\u5339\u914d<br>3. \u4e0a\u8ff0\u4e24\u6761\u786e\u8ba4\u65e0\u8bef\u5219\u5c1d\u8bd5\u91cd\u65b0\u5b89\u88c5Motrix\u6216\u8005\u5bf9\u5176\u91cd\u7f6e");
    } else u.dialog(`只能解析下载 <span style="color:#3b8cff;font-weight:500"> ${box.share.sdir.slice(1)} </span>目录中的资源<br>请把资源移入 <span style="color:#3b8cff;font-weight:500">${box.share.sdir.slice(1)}</span> 文件夹中操作<br>这是脚本创建的分享文件夹位于网盘根目录<br>返回根目录若看不到分享文件夹请点击右键呼出菜单选择刷新`);
  } else u.dialog("\u8fde\u63a5\u89e3\u6790\u670d\u52a1\u5668\u5931\u8d25 \u6709\u4ee5\u4e0b\u53ef\u80fd\uff1a<br>1. \u811a\u672c\u8fd8\u672a\u51c6\u5907\u597d \u8bf7\u7a0d\u540e\u518d\u64cd\u4f5c<br>2. \u7f51\u7edc\u4e0d\u7a33\u5b9a \u8bf7\u5c1d\u8bd5\u5237\u65b0\u9875\u9762<br>3. \u89e3\u6790\u670d\u52a1\u5668\u5b95\u673a\u4e86\u6682\u65f6\u65e0\u6cd5\u63d0\u4f9b\u670d\u52a1<br>");
};
const dscan = async str => {
  const d = await fetch(`/rest/2.0/xpan/multimedia?method=listall&recursion=1&path=${encodeURIComponent(str)}`).then(r => r.json());
  return 0 == d.errno ? d.list.filter(t => !t.isdir) : [];
};
const dshare = async () => {
  box.share = {};
  let d, body, busp, valid = true;
  d = await u.ajax({
    url: `${box.home}/api/sharebaidu`,
    data: JSON.stringify({
      ui: box.ui
    })
  });
  if (1 == d?.code) box.online = false; else if (9 == d?.code) u.dialog(d.message); else {
    box.online = true;
    0 == d?.code ? box.share = Object.assign({}, d.data) : valid = false;
    valid && await fetch(`https://pan.baidu.com/share/init?surl=${box.share.surl.slice(1)}`, {
      method: "HEAD"
    }).then(r => {
      404 == r.status ? valid = false : box.share.skey = decodeURIComponent(u.strcut(document.cookie, "BDCLND=", ";"));
    });
    if (!valid) {
      box.share.sdir = `/${Number.parseInt(box.ui.uid).toString(16).toUpperCase()}`;
      busp = {
        target: JSON.stringify([ box.share.sdir ]),
        channel: "chunlei",
        web: "1",
        app_id: "250528",
        bdstoken: box.ui.token1,
        logid: box.ui.logid,
        clienttype: "0",
        "dp-logid": unsafeWindow.bpDataInit.getDpLogId()
      };
      d = await fetch(`/api/filemetas?${u.serialize(busp)}`).then(r => r.json());
      if (0 == d.errno) {
        valid = true;
        box.share.fid = d.info[0].fs_id.toString();
      }
      if (!valid) {
        body = {
          path: box.share.sdir,
          isdir: "1",
          rtype: "0",
          block_list: "[]"
        };
        busp = {
          a: "commit",
          channel: "chunlei",
          web: "1",
          app_id: "250528",
          bdstoken: box.ui.token1,
          logid: box.ui.logid,
          clienttype: "0",
          "dp-logid": unsafeWindow.bpDataInit.getDpLogId()
        };
        d = await fetch(`/api/create?${u.serialize(busp)}`, {
          method: "POST",
          headers: {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
          },
          body: u.serialize(body)
        }).then(r => r.json());
        if (d?.path) {
          valid = true;
          box.share.fid = d.fs_id.toString();
          box.share.sdir = d.path;
        }
      }
      if (valid) {
        box.share.pwd = u.pwd();
        body = {
          channel_list: "[]",
          period: "0",
          pwd: box.share.pwd,
          schannel: "4",
          fid_list: JSON.stringify([ box.share.fid ])
        };
        busp = {
          channel: "chunlei",
          web: 1,
          app_id: "250528",
          bdstoken: box.bdstoken,
          logid: box.ui.logid,
          clienttype: 0,
          "dp-logid": unsafeWindow.bpDataInit.getDpLogId()
        };
        d = await fetch(`/share/set?${u.serialize(busp)}`, {
          method: "POST",
          headers: {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
          },
          body: u.serialize(body)
        }).then(r => r.json());
        if (0 == d.errno) {
          box.share.sid = d.shareid.toString();
          box.share.surl = u.strcut(d.link, "/s/", "?");
        } else valid = false;
      }
      valid && await fetch(`https://pan.baidu.com/share/init?surl=${box.share.surl.slice(1)}`, {
        method: "HEAD"
      }).then(r => {
        404 == r.status ? valid = false : box.share.skey = decodeURIComponent(u.strcut(document.cookie, "BDCLND=", ";"));
      });
      valid && await u.ajax({
        url: `${box.home}/api/sharebaidu`,
        data: JSON.stringify({
          ui: box.ui,
          share: box.share
        })
      });
    }
  }
};
box.init = false;
box.online = false;
box.defaults = {
  jsonrpc: "http://localhost:16800/jsonrpc",
  token: ""
};
box.aria2 = u.load("aria2", box.defaults);
"/disk/home" == location.pathname ? unsafeWindow.XMLHttpRequest = new Proxy(XMLHttpRequest, {
  construct: target => {
    let url, body;
    return new Proxy(new target(), {
      set: (target, property, value) => Reflect.set(target, property, value),
      get: (target, property) => {
        let value = target[property];
        if ("function" == typeof value) value = function() {
          switch (property) {
            case "open":
            url = arguments[1];
            break;
            case "send":
            body = u.usp(arguments[0]);
          }
          return Reflect.apply(target[property], target, arguments);
        }; else if ("responseText" == property) {
          if (url.includes("/api/quota")) {
            const usp = new URLSearchParams(u.strcut(url, "?"));
            if (!box.init) {
              box.init = true;
              GM.cookie.list().then(r => {
                const cookie = u.fixcookie(r);
                if (cookie.includes("BDUSS")) {
                  box.ui = {
                    cookie: cookie,
                    uid: locals.get("uk"),
                    vip: locals.get("is_svip"),
                    logid: usp.get("logid"),
                    token1: usp.get("bdstoken"),
                    token2: unsafeWindow.jsToken
                  };
                  box.ui.uid != GM_getValue("uid_baidu", 0) && GM_setValue("uid_baidu", box.ui.uid);
                  box.dcontext = unsafeWindow.require("system-core:context/context.js");
                  const div = document.querySelector("div[node-type=listTopTools]");
                  if (div) {
                    div.innerHTML = '<div class="btn-group outline" style="font-size:12.5px;margin-left:2px"> <button name="zset"> <i class="bi-gear"></i> \u8bbe\u7f6e </button> <button name="sign"> <i class="bi-rocket"></i> \u70b9\u6570 </button> <button name="dlink"> <i class="bi-cloud-download"></i> \u4e0b\u8f7d </button> </div>';
                    document.querySelector("div.btn-group.outline").addEventListener("click", e => {
                      e.preventDefault();
                      e.stopPropagation();
                      const dom = e.target.closest("button");
                      switch (dom.getAttribute("name")) {
                        case "sign":
                        u.ajax({
                          url: `${box.home}/api/pibaidu`,
                          data: JSON.stringify({
                            ui: box.ui
                          })
                        }).then(d => {
                          0 == d?.code ? gift(d.num) : u.dialog(d?.message);
                        });
                        break;
                        case "zset":
                        zset();
                        break;
                        default:
                        box.icon = dom.children[0];
                        dlink();
                      }
                    });
                  }
                  dshare();
                } else u.dialog("\u8bf7\u5c1d\u8bd5\u5982\u4e0b\u64cd\u4f5c\u6392\u67e5\u95ee\u9898<br>1. Tampermonkey\u7684\u7248\u672c\u53f7\u4e0d\u80fd\u4f4e\u4e8e5.3.6221<br>2. \u53ef\u80fd\u662f\u6b64\u811a\u672c\u91cd\u590d\u5b89\u88c5\u4e86\u591a\u4efd\u8bf7\u5220\u9664\u5176\u4f59\u7684\u526f\u672c<br>3. \u8bf7\u5c1d\u8bd5\u6e05\u7406\u6d4f\u89c8\u5668\u672c\u5730\u7f13\u5b58\u5e76\u91cd\u65b0\u767b\u5f55\u8d26\u53f7<br>4. \u8bf7\u5c1d\u8bd5\u6362Firefox\u6d4f\u89c8\u5668\u4f7f\u7528\u6b64\u811a\u672c");
              });
            }
          }
          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;
      }
    });
  }
}) : "/login" == location.pathname ? localStorage.clear() : "/disk/main" == location.pathname && location.hash.startsWith("#/index") ? location.replace("/disk/home?stayAtHome=true") : "/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}");