Greasy Fork

Greasy Fork is available in English.

百度网盘领劵

【官方渠道】解除百度网盘限速。每日领取【百度网盘】极速下载卷。每天都可以领3张。原理利用了官方游戏活动,【无封号风险】。联系作者请加QQ群:882776749【长期维护】

当前为 2025-08-07 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         百度网盘领劵
// @name:zh      百度网盘领卷
// @namespace    baiDuYunLingJuan
// @version      1.1.0
// @author       TING软件科技
// @description  【官方渠道】解除百度网盘限速。每日领取【百度网盘】极速下载卷。每天都可以领3张。原理利用了官方游戏活动,【无封号风险】。联系作者请加QQ群:882776749【长期维护】
// @license      AGPL v3
// @icon         https://vitejs.dev/logo.svg
// @match        https://pan.baidu.com/*
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js
// @require      data:application/javascript,%3Bwindow.Vue%20%3D%20Vue%3B
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/index.full.min.js
// @connect      wan.baidu.com
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_xmlhttpRequest
// @noframes
// ==/UserScript==

(e=>{if(typeof GM_addStyle=="function"){GM_addStyle(e);return}const a=document.createElement("style");a.textContent=e,document.head.append(a)})(" #AppBtn[data-v-6221d9fc]{position:fixed;bottom:100px;right:100px}#tingApp[data-v-24ee8511]{position:fixed;z-index:99999}body[data-v-24ee8511]{margin:0;padding:0;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:#f5f7fa}.content[data-v-24ee8511]{flex:1;box-sizing:border-box;background-color:#fff}.header[data-v-24ee8511]{text-align:center;margin-bottom:10px;padding:20px;background:linear-gradient(120deg,#a1c4fd,#c2e9fb);box-shadow:0 4px 6px #0000001a}.header h1[data-v-24ee8511]{margin:0;color:#2c3e50;font-size:28px}.header p[data-v-24ee8511]{margin:10px 0 0;color:#7f8c8d;font-size:16px}.task-list[data-v-24ee8511]{display:grid;padding:10px;box-sizing:border-box;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:14px;margin-top:20px}.task-card[data-v-24ee8511]{background:#fff;border-radius:12px;box-shadow:0 4px 15px #0000001a;padding:14px;transition:all .3s ease;border-left:5px solid #3498db}.task-card[data-v-24ee8511]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026}.task-card.processing[data-v-24ee8511]{border-left-color:#f39c12}.task-card.completed[data-v-24ee8511]{border-left-color:#27ae60}.task-card.error[data-v-24ee8511]{border-left-color:#e74c3c}.task-title[data-v-24ee8511]{font-size:16px;font-weight:600;margin:0 0 10px;color:#2c3e50;display:flex;justify-content:space-between;align-items:center}.task-module[data-v-24ee8511]{background-color:#ecf0f1;color:#7f8c8d;padding:3px 8px;border-radius:12px;font-size:12px;font-weight:400}.task-info[data-v-24ee8511]{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:15px 0}.info-item[data-v-24ee8511]{font-size:14px}.info-label[data-v-24ee8511]{color:#7f8c8d;font-weight:500}.info-value[data-v-24ee8511]{color:#2c3e50;font-weight:600;word-break:break-all}.task-status[data-v-24ee8511]{padding:8px 12px;border-radius:20px;font-size:13px;font-weight:500;text-align:center;margin-top:10px}.status-pending[data-v-24ee8511]{background-color:#f8f9fa;color:#6c757d}.status-processing[data-v-24ee8511]{background-color:#fff3cd;color:#856404}.status-completed[data-v-24ee8511]{background-color:#d4edda;color:#155724}.status-error[data-v-24ee8511]{background-color:#f8d7da;color:#721c24}.progress-bar[data-v-24ee8511]{height:8px;background-color:#ecf0f1;border-radius:4px;margin:15px 0;overflow:hidden}.progress-fill[data-v-24ee8511]{height:100%;background:linear-gradient(90deg,#3498db,#2ecc71);border-radius:4px;transition:width .3s ease}.loading[data-v-24ee8511]{text-align:center;padding:40px;color:#7f8c8d}.loading-spinner[data-v-24ee8511]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin-24ee8511 1s linear infinite;margin:0 auto 20px}@keyframes spin-24ee8511{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-state[data-v-24ee8511]{text-align:center;padding:60px 20px;color:#7f8c8d}.empty-state i[data-v-24ee8511]{font-size:48px;margin-bottom:20px;display:block}#el[data-v-24ee8511]{display:flex;justify-content:space-between} ");

(function (vue, ElementPlus) {
  'use strict';

  const _export_sfc = (sfc, props) => {
    const target = sfc.__vccOpts || sfc;
    for (const [key, val] of props) {
      target[key] = val;
    }
    return target;
  };
  const _sfc_main$1 = {
    __name: "AppBtn",
    setup(__props) {
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElButton), {
          type: "primary",
          id: "AppBtn",
          size: "large"
        }, {
          default: vue.withCtx(() => [
            vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
          ]),
          _: 3
        });
      };
    }
  };
  const AppBtn = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-6221d9fc"]]);
  const config = {
    // 根据频道Id获取任务数组
    channelArr: [10066, 10065],
    // 过滤出免费任务
    taskModules: ["game_return_play", "new_game_play"]
  };
  window.addEventListener("message", (e) => {
    if (e.data.type === "start") {
      start();
    }
  });
  async function start(obj) {
    const tasks = await getAllTask();
    Promise.all(
      tasks.map((item) => getOneDownload(item.selectGameParams, item))
    ).then();
  }
  async function getAllTask() {
    const channelArr = config.channelArr;
    const promises = channelArr.map(
      (channel) => new Promise((resolve) => {
        GM_xmlhttpRequest({
          method: "GET",
          url: `https://wan.baidu.com/gameapi?action=bonus_pan_task_list&channel=${channel}`,
          headers: {
            "Content-Type": "application/json",
            Cookie: document.cookie
          },
          onload: function(response) {
            resolve(JSON.parse(response.responseText));
          }
        });
      })
    );
    const task_result = await Promise.all(promises);
    const taskOneWei = [];
    task_result.forEach((item) => {
      if (item.errorNo === 0 && item.result && item.result.data) {
        item.result.data.forEach((task) => {
          if (Array.isArray(task.data)) {
            taskOneWei.push(...task.data);
          }
        });
      }
    });
    const taskMianFei = taskOneWei.filter(
      (item) => config.taskModules.includes(item.taskModule)
    );
    const taskReal = taskMianFei.map((item) => {
      let selectGame = getRandomItem(item.taskGames);
      return {
        ...item,
        selectGame,
        selectGameParams: {
          ...url2obj(selectGame.gameUrl)
        }
      };
    });
    send_message({ type: "task_result", taskReal });
    return taskReal;
  }
  async function getOneDownload({ gameId, taskId, activityId }, task) {
    const sendApi = (params) => {
      GM_xmlhttpRequest({
        method: "GET",
        url: `https://wan.baidu.com/gameapi?${obj2url(params)}`,
        headers: {
          "Content-Type": "application/json",
          Cookie: document.cookie
        },
        onload: async function(response) {
          const data = JSON.parse(response.responseText);
          if (data.errorNo === 110503 || data.result && data.result.data && data.result.data.remainingTaskTime === 0) {
            await setStorage(getId(taskId), 0);
            return send_message({
              type: "task_status_update",
              taskId: params.taskId,
              status: `completed`,
              progress: 100
            });
          }
          if (data.errorNo !== 0) {
            return send_message({
              type: "task_status_update",
              taskId: params.taskId,
              errorNo: data.errorNo,
              status: `error`,
              progress: 40,
              errorMessage: `${data.message}(请刷新页面 或 重新登录 )`
            });
          }
          if (data.result && data.result.data && data.result.data.remainingTaskTime) {
            let finiTime = task.eachTaskNeedPlayTimeSecs - data.result.data.remainingTaskTime;
            send_message({
              type: "task_status_update",
              taskId: params.taskId,
              status: `processing`,
              progress: parseInt(
                finiTime / task.eachTaskNeedPlayTimeSecs * 100
              )
            });
            await setStorage(getId(taskId), data.result.data.remainingTaskTime);
          }
          if (data.result && data.result.data && data.result.data.nextReportInterval) {
            setTimeout(() => {
              sendApi({ ...params, isFirstReport: 0 });
            }, 10 * 1e3);
          }
        }
      });
    };
    sendApi({
      gameId,
      isFirstReport: await getStorage(getId(taskId)) ? 0 : 1,
      taskId,
      activityId,
      action: "bonus_task_game_play_report"
    });
  }
  function send_message(data) {
    window.postMessage({
      type: data.type,
      data
    });
  }
  function getId(taskId) {
    var date = /* @__PURE__ */ new Date();
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    return year + "_" + month + "_" + day + "_" + taskId;
  }
  function getRandomItem(arr) {
    return arr[Math.floor(Math.random() * arr.length)];
  }
  function url2obj(url) {
    var obj = {};
    var arr = url.split("?")[1].split("&");
    for (var i = 0; i < arr.length; i++) {
      var item = arr[i].split("=");
      if (item[0].trim()) {
        obj[item[0]] = item[1];
      }
    }
    return obj;
  }
  function obj2url(obj) {
    var url = "";
    for (var key in obj) {
      url += key + "=" + obj[key] + "&";
    }
    return url.substring(0, url.length - 1);
  }
  function setStorage(key, value) {
    return new Promise((resolve) => {
      GM_setValue(key, value);
      resolve();
    });
  }
  function getStorage(key) {
    return new Promise((resolve) => {
      resolve(GM_getValue(key, null));
    });
  }
  const _hoisted_1 = { id: "el" };
  const _hoisted_2 = { class: "content" };
  const _hoisted_3 = {
    key: 0,
    class: "loading"
  };
  const _hoisted_4 = {
    key: 1,
    class: "empty-state"
  };
  const _hoisted_5 = {
    key: 2,
    class: "task-list"
  };
  const _hoisted_6 = { class: "task-title" };
  const _hoisted_7 = { class: "task-module" };
  const _hoisted_8 = { class: "task-info" };
  const _hoisted_9 = { class: "info-item" };
  const _hoisted_10 = { class: "info-value" };
  const _hoisted_11 = { class: "info-item" };
  const _hoisted_12 = { class: "info-value" };
  const _hoisted_13 = {
    key: 0,
    class: "progress-bar"
  };
  const _hoisted_14 = { key: 0 };
  const _hoisted_15 = { key: 1 };
  const _hoisted_16 = { key: 2 };
  const _hoisted_17 = { key: 3 };
  const _hoisted_18 = { key: 4 };
  const _sfc_main = {
    __name: "App",
    setup(__props) {
      let drawer = vue.ref(false);
      const tasks = vue.ref([]);
      const loading = vue.ref(false);
      const handleStartTask = () => {
        loading.value = true;
        window.postMessage({ type: "start" }, "*");
      };
      const init = () => {
        const handleMessage = (event) => {
          let eventData = event.data;
          if (eventData.type === "task_result") {
            tasks.value = eventData.data.taskReal.map((task) => ({
              ...task,
              status: "pending",
              progress: 0
            }));
            loading.value = false;
          }
          if (event.data.type === "task_status_update") {
            const taskIndex = tasks.value.findIndex((task) => {
              return +task?.taskId === +eventData.data.taskId;
            });
            if (taskIndex !== -1) {
              tasks.value[taskIndex] = {
                ...tasks.value[taskIndex],
                ...eventData.data
              };
              if (eventData.data.errorNo === 110008) {
                ElementPlus.ElMessage({
                  message: `请登录【百度网盘网页版】后再领取下载卷`,
                  duration: 5e3,
                  type: "warning"
                });
              }
            } else {
              console.log(`找不到:${taskIndex}`);
            }
          }
        };
        window.addEventListener("message", handleMessage);
        vue.onBeforeUnmount(() => {
          window.removeEventListener("message", handleMessage);
        });
      };
      vue.onMounted(() => {
        init();
      });
      return (_ctx, _cache) => {
        const _component_el_button = vue.resolveComponent("el-button");
        const _component_el_drawer = vue.resolveComponent("el-drawer");
        return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
          vue.createVNode(AppBtn, {
            onClick: _cache[0] || (_cache[0] = ($event) => vue.isRef(drawer) ? drawer.value = !vue.unref(drawer) : drawer = !vue.unref(drawer))
          }, {
            default: vue.withCtx(() => _cache[2] || (_cache[2] = [
              vue.createTextVNode("打 开 插 件", -1)
            ])),
            _: 1,
            __: [2]
          }),
          vue.createVNode(_component_el_drawer, {
            modelValue: vue.unref(drawer),
            "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => vue.isRef(drawer) ? drawer.value = $event : drawer = $event),
            title: "百度下载卷领取助手"
          }, {
            default: vue.withCtx(() => [
              vue.createElementVNode("div", null, [
                vue.createVNode(_component_el_button, {
                  loading: loading.value,
                  onClick: handleStartTask,
                  type: "primary",
                  disabled: tasks.value.length
                }, {
                  default: vue.withCtx(() => [
                    vue.createTextVNode(vue.toDisplayString(tasks.value.length ? "明天再来领取吧~" : "开始领取"), 1)
                  ]),
                  _: 1
                }, 8, ["loading", "disabled"])
              ]),
              vue.createElementVNode("div", _hoisted_1, [
                vue.createElementVNode("div", _hoisted_2, [
                  loading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, _cache[3] || (_cache[3] = [
                    vue.createElementVNode("div", { class: "loading-spinner" }, null, -1),
                    vue.createElementVNode("p", null, "正在加载可用下载卷...", -1)
                  ]))) : tasks.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, _cache[4] || (_cache[4] = [
                    vue.createElementVNode("div", null, "📋", -1),
                    vue.createElementVNode("h3", null, "暂无任务,点击开始领取", -1)
                  ]))) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_5, [
                    _cache[7] || (_cache[7] = vue.createElementVNode("p", { style: { "color": "orange", "text-align": "right" } }, " 请勿刷新页面,否则可能影响领卷~", -1)),
                    (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(tasks.value, (task, index) => {
                      return vue.openBlock(), vue.createElementBlock("div", {
                        key: index,
                        class: vue.normalizeClass(["task-card", {
                          "processing": task.status === "processing",
                          "completed": task.status === "completed",
                          "error": task.status === "error"
                        }])
                      }, [
                        vue.createElementVNode("div", _hoisted_6, [
                          vue.createElementVNode("span", null, "极速下载卷 #" + vue.toDisplayString(index + 1), 1),
                          vue.createElementVNode("span", _hoisted_7, vue.toDisplayString(task.taskModule || "未知模块"), 1)
                        ]),
                        vue.createElementVNode("div", _hoisted_8, [
                          vue.createElementVNode("div", _hoisted_9, [
                            _cache[5] || (_cache[5] = vue.createElementVNode("div", { class: "info-label" }, "程序ID", -1)),
                            vue.createElementVNode("div", _hoisted_10, vue.toDisplayString(task.selectGameParams?.gameId || "N/A"), 1)
                          ]),
                          vue.createElementVNode("div", _hoisted_11, [
                            _cache[6] || (_cache[6] = vue.createElementVNode("div", { class: "info-label" }, "任务ID", -1)),
                            vue.createElementVNode("div", _hoisted_12, vue.toDisplayString(index + 1), 1)
                          ])
                        ]),
                        task.progress ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
                          vue.createElementVNode("div", {
                            class: "progress-fill",
                            style: vue.normalizeStyle({ width: task.progress + "%" })
                          }, null, 4)
                        ])) : vue.createCommentVNode("", true),
                        vue.createElementVNode("div", {
                          class: vue.normalizeClass(["task-status", {
                            "status-pending": task.status === "pending",
                            "status-processing": task.status === "processing",
                            "status-completed": task.status === "completed",
                            "status-error": task.status === "error"
                          }])
                        }, [
                          task.status === "pending" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_14, "等待领取")) : task.status === "processing" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_15, "领取中... " + vue.toDisplayString(task.progress) + "%", 1)) : task.status === "completed" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_16, "✅ 已领取,明天再来吧~")) : task.status === "error" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_17, "❌ 错误: " + vue.toDisplayString(task.errorMessage), 1)) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_18, "未知状态"))
                        ], 2)
                      ], 2);
                    }), 128))
                  ]))
                ])
              ])
            ]),
            _: 1
          }, 8, ["modelValue"])
        ], 64);
      };
    }
  };
  const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-24ee8511"]]);
  var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  window.GM_xmlhttpRequest = _GM_xmlhttpRequest;
  window.GM_setValue = _GM_setValue;
  window.GM_getValue = _GM_getValue;
  const link = document.createElement("link");
  link.rel = "stylesheet";
  link.href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/index.css";
  document.head.appendChild(link);
  const appContainer = document.createElement("div");
  const appId = `tingApp`;
  appContainer.id = appId;
  document.body.appendChild(appContainer);
  vue.createApp(App).use(ElementPlus).mount(appContainer);

})(Vue, ElementPlus);