Greasy Fork

Greasy Fork is available in English.

回到旧版B站主页

修改cookie回到旧版B站主页

当前为 2023-11-11 提交的版本,查看 最新版本

"use strict";
// ==UserScript==
// @name         回到旧版B站主页
// @namespace    http://salt.is.lovely/
// @version      0.1.3
// @description  修改cookie回到旧版B站主页
// @author       salt
// @license      MulanPSL2
// @match        https://*.bilibili.com/*
// @icon         https://www.bilibili.com/favicon.ico
// @grant        none
// ==/UserScript==

// 开源在 github https://github.com/Salt-lovely/salt-bili-back
// 在 http://greasyfork.icu/zh-CN/scripts/475203 安装

/*
Copyright (c) 2023 Salt_lovaly
回到旧版B站主页 is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
          http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
(() => {
  // node_modules/salt-lib/lib/storage/localStorage.js
  function innerParse(str) {
    if (str) {
      try {
        return JSON.parse(str);
      } catch (e) {
      }
    }
    return null;
  }
  function write(key, value2) {
    localStorage.setItem(key, JSON.stringify(value2));
  }
  function unsafeRead(key) {
    const storage = localStorage.getItem(key);
    return innerParse(storage);
  }
  function listen(listener, options = { passive: true }) {
    window.addEventListener("storage", listener, options);
    return () => window.removeEventListener("storage", listener, options);
  }
  function readAndListen(props) {
    const { key, defaultValue, listener, callOnChange = true, options = { passive: true } } = props;
    let v = unsafeRead(key);
    if (defaultValue !== void 0 && v === null) {
      write(key, defaultValue);
      v = defaultValue;
    }
    const fn = (ev) => {
      if (ev.key !== key || ev.storageArea !== localStorage)
        return;
      const newValue = innerParse(ev.newValue);
      const oldValue = innerParse(ev.oldValue);
      if (callOnChange && newValue === oldValue)
        return;
      const encapsulatedEvent = {
        key,
        newValue,
        oldValue,
        storageArea: ev.storageArea,
        url: ev.url
      };
      listener(encapsulatedEvent);
    };
    const off = listen(fn, options);
    return [v, off];
  }

  // node_modules/js-cookie/dist/js.cookie.mjs
  /*! js-cookie v3.0.5 | MIT */
  function assign(target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i];
      for (var key in source) {
        target[key] = source[key];
      }
    }
    return target;
  }
  var defaultConverter = {
    read: function(value2) {
      if (value2[0] === '"') {
        value2 = value2.slice(1, -1);
      }
      return value2.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
    },
    write: function(value2) {
      return encodeURIComponent(value2).replace(
        /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,
        decodeURIComponent
      );
    }
  };
  function init(converter, defaultAttributes) {
    function set2(name, value2, attributes) {
      if (typeof document === "undefined") {
        return;
      }
      attributes = assign({}, defaultAttributes, attributes);
      if (typeof attributes.expires === "number") {
        attributes.expires = new Date(Date.now() + attributes.expires * 864e5);
      }
      if (attributes.expires) {
        attributes.expires = attributes.expires.toUTCString();
      }
      name = encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/[()]/g, escape);
      var stringifiedAttributes = "";
      for (var attributeName in attributes) {
        if (!attributes[attributeName]) {
          continue;
        }
        stringifiedAttributes += "; " + attributeName;
        if (attributes[attributeName] === true) {
          continue;
        }
        stringifiedAttributes += "=" + attributes[attributeName].split(";")[0];
      }
      return document.cookie = name + "=" + converter.write(value2, name) + stringifiedAttributes;
    }
    function get(name) {
      if (typeof document === "undefined" || arguments.length && !name) {
        return;
      }
      var cookies = document.cookie ? document.cookie.split("; ") : [];
      var jar = {};
      for (var i = 0; i < cookies.length; i++) {
        var parts = cookies[i].split("=");
        var value2 = parts.slice(1).join("=");
        try {
          var found = decodeURIComponent(parts[0]);
          jar[found] = converter.read(value2, found);
          if (name === found) {
            break;
          }
        } catch (e) {
        }
      }
      return name ? jar[name] : jar;
    }
    return Object.create(
      {
        set: set2,
        get,
        remove: function(name, attributes) {
          set2(
            name,
            "",
            assign({}, attributes, {
              expires: -1
            })
          );
        },
        withAttributes: function(attributes) {
          return init(this.converter, assign({}, this.attributes, attributes));
        },
        withConverter: function(converter2) {
          return init(assign({}, this.converter, converter2), this.attributes);
        }
      },
      {
        attributes: { value: Object.freeze(defaultAttributes) },
        converter: { value: Object.freeze(converter) }
      }
    );
  }
  var api = init(defaultConverter, { path: "/" });

  // src/utils.ts
  var { remove, set } = api;
  var defaultExpires = new Date(3398759114e3);
  var defaultDomain = ".bilibili.com";
  var NEW_UI = 0;
  var OLD_UI = 1;
  var TRADITION_UI = 2;
  var STORAGE_KEY = "salt-lovely-bili-tool";
  function setCookie(name, value2 = "", expires = defaultExpires, domain = defaultDomain) {
    set(name, value2, { expires, domain });
  }
  function genResetCookieFn({
    delMap,
    setMap
  }) {
    console.log(`设置成功`);
    if (delMap)
      console.log(`将强制清除这些cookie: ${delMap.join(", ")}`);
    if (setMap)
      console.log(`将强制接管这些cookie: ${Object.keys(setMap).join(", ")}`);
    return () => {
      if (delMap)
        delMap.forEach((c) => remove(c));
      if (setMap)
        Object.keys(setMap).forEach((c) => setCookie(c, setMap[c]));
    };
  }

  // src/index.tsx
  var interval = 0;
  var setNewUI = () => {
    clearInterval(interval);
    setCookie("i-wanna-go-back", "0");
  };
  var setOldUI = () => {
    clearInterval(interval);
    const resetFn = genResetCookieFn({
      delMap: ["buvid3"],
      setMap: {
        "i-wanna-go-back": "1",
        "i-wanna-go-feeds": "-1",
        nostalgia_conf: "2"
      }
    });
    interval = setInterval(resetFn, 500);
  };
  var setTraditionalUI = () => {
    clearInterval(interval);
    const resetFn = genResetCookieFn({
      delMap: ["buvid3", "buvid4", "buvid_fp"],
      setMap: {
        "i-wanna-go-back": "1",
        "i-wanna-go-feeds": "1",
        nostalgia_conf: "2"
      }
    });
    interval = setInterval(resetFn, 500);
  };
  var setUICookie = (value2) => {
    switch (value2) {
      case NEW_UI:
        setNewUI();
        break;
      case OLD_UI:
        setOldUI();
        break;
      case TRADITION_UI:
        setTraditionalUI();
        break;
      case null:
        setNewUI();
        break;
      default:
        console.log("无法识别的UI模式", value2);
        setOldUI();
    }
  };
  var [value] = readAndListen({
    key: `${STORAGE_KEY}-ui-version`,
    defaultValue: OLD_UI,
    listener: (ev) => {
      const { newValue } = ev;
      setUICookie(newValue);
    }
  });
  setUICookie(value);
  console.log(
    `
欢迎使用盐酱牌回到旧版B站主页脚本!

下个版本将会在屏幕底部添加切换按钮
`
  );
})();