Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

叉子网脚本没了 #33

Open
MC-dusk opened this issue Dec 25, 2021 · 1 comment
Open

叉子网脚本没了 #33

MC-dusk opened this issue Dec 25, 2021 · 1 comment

Comments

@MC-dusk
Copy link

MC-dusk commented Dec 25, 2021

The script you requested has been deleted, but here are some related scripts.

https://greasyfork.org/en/scripts/375881-bilibili-%E6%B8%AF%E6%BE%B3%E5%8F%B0

@MC-dusk
Copy link
Author

MC-dusk commented Dec 25, 2021

这是我最后的版本


// ==UserScript==
// @name               Bilibili 港澳台
// @namespace          http://kghost.info/
// @version            1.3.9
// @description        解除区域限制 (修正大会员限制,添加国际友人看国内功能)
// @supportURL         https://github.com/kghost/bilibili-area-limit
// @author             zealot0630
// @include            https://*.bilibili.com/*
// @run-at document-start
// @grant       GM_notification
// @grant       GM_cookie
// @grant       GM.setValue
// @grant       GM.getValue
// ==/UserScript==

/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = "./src/main.js");
/******/ })
/************************************************************************/
/******/ ({

/***/ "./src/main.js":
/*!*********************!*\
  !*** ./src/main.js ***!
  \*********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url */ "./src/url.js");


(function (XMLHttpRequest) {
  class ClassHandler {
    constructor(proxy) {
      this.proxy = proxy;
    }

    construct(target, args) {
      const obj = new target(...args);
      return new Proxy(obj, new this.proxy());
    }
  }

  const ProxyGetTarget = Symbol('ProxyGetTarget');
  const ProxyGetHandler = Symbol('ProxyGetHandler');
  class ObjectHandler {
    get(target, prop, receiver) {
      if (target.hasOwnProperty(prop)) {
        return Reflect.get(target, prop, receiver);
      } else if (prop == ProxyGetTarget) {
        return target;
      } else if (prop == ProxyGetHandler) {
        return this;
      } else {
        const value = target[prop];
        if (typeof value == 'function') return new Proxy(value, new NativeFunctionHandler());
        return value;
      }
    }

    set(target, prop, value, receiver) {
      return Reflect.set(target, prop, value);
    }
  }

  class FunctionHandler extends ObjectHandler {
    apply(target, thisArg, argumentsList) {
      const realThis = thisArg[ProxyGetTarget];
      if (!realThis) throw new Error('illegal invocations');
      return this.call(target, thisArg, realThis, argumentsList);
    }
  }

  class NativeFunctionHandler extends FunctionHandler {
    call(fn, proxy, realThis, argumentsList) {
      return fn.apply(realThis, argumentsList);
    }
  }

  class EventTargetHandler extends ObjectHandler {
    constructor() {
      super();
      this.listeners = {};
    }

    getListeners(event) {
      if (!this.listeners.hasOwnProperty(event)) this.listeners[event] = new Map();
      return this.listeners[event];
    }

    get(target, prop, receiver) {
      if (prop === 'addEventListener') {
        return new Proxy(target.addEventListener, new this.addEventListener());
      } else if (prop === 'removeEventListener') {
        return new Proxy(target.removeEventListener, new this.removeEventListener());
      } else return super.get(target, prop, receiver);
    }
  }

  EventTargetHandler.prototype.addEventListener = class extends (
    FunctionHandler
  ) {
    call(fn, proxy, realThis, argumentsList) {
      const event = argumentsList[0];
      const listener = argumentsList[1];
      const bridge = listener.bind(proxy);
      argumentsList[1] = bridge;
      proxy[ProxyGetHandler].getListeners(event).set(listener, bridge);
      return fn.apply(realThis, argumentsList);
    }
  };

  EventTargetHandler.prototype.removeEventListener = class extends (
    FunctionHandler
  ) {
    call(fn, proxy, realThis, argumentsList) {
      const event = argumentsList[0];
      const listener = argumentsList[1];
      const cache = proxy[ProxyGetHandler].getListeners(event);
      if (cache.has(listener)) {
        argumentsList[1] = cache.get(listener);
        cache.delete(listener);
      }
      return fn.apply(realThis, argumentsList);
    }
  };

  class XhrHandler extends EventTargetHandler {
    get(target, prop, receiver) {
      if (prop === 'open') {
        return new Proxy(target.open, new this.open());
      } else if (prop === 'send') {
        return new Proxy(target.send, new this.send());
      } else {
        return super.get(target, prop, receiver);
      }
    }
  }

  const showTamperMonkeyUpdate = () => {
    GM.getValue('__area__limit__', 0).then((last) => {
      if (last > new Date().getTime() - 86400000) return;
      if (confirm('Bilibili 港澳台: 无法获取播放文件信息,如果已开通大会员,请升级油猴到BETA版本')) {
        window.open(
          'https://chrome.google.com/webstore/detail/tampermonkey-beta/gcalenpjmijncebpfijmoaglllgpjagf',
          '_blank'
        );
      } else {
        GM.setValue('__area__limit__', new Date().getTime());
      }
    });
  };

  let limited = false;
  XhrHandler.prototype.open = class extends (
    FunctionHandler
  ) {
    call(fn, proxy, realThis, argumentsList) {
      const method = argumentsList[0];
      const url = argumentsList[1];

      if (method === 'GET') {
        if (limited && url.match(_url__WEBPACK_IMPORTED_MODULE_0__["url_play"])) {
          for (const [regs, to] of _url__WEBPACK_IMPORTED_MODULE_0__["url_replace_to"]) {
            function any() {
              for (const reg of regs) {
                if (document.title.match(reg)) return true;
              }
              return false;
            }
            if (any()) {
              argumentsList[1] = url.replace(_url__WEBPACK_IMPORTED_MODULE_0__["url_api_replace"], to.api);
              realThis.hookCookie = true;
              console.log(`BAL: playurl via proxy ${argumentsList[1]}.`);
              break;
            }
          }
        }
      }
      return fn.apply(realThis, argumentsList);
    }
  };

  XhrHandler.prototype.send = class extends (
    FunctionHandler
  ) {
    call(fn, proxy, realThis, argumentsList) {
      if (realThis.hookCookie) {
        GM_cookie.list({ domain: '.bilibili.com', name: 'SESSDATA' }, (cookies, error) => {
          if (error) {
            console.log('BAL: Error fetch cookie, not login');
            realThis.addEventListener('readystatechange', () => {
              if (realThis.readyState === 4 && realThis.status === 200) {
                const status = JSON.parse(realThis.response);
                if (status.code == -10403) showTamperMonkeyUpdate();
              }
            });
            fn.apply(realThis, argumentsList);
          } else {
            console.log(`BAL: Get Cookie ${cookies}`);
            realThis.setRequestHeader('X-Cookie', cookies[0].value);
            fn.apply(realThis, argumentsList);
          }
        });
      } else {
        fn.apply(realThis, argumentsList);
      }
    }
  };

  unsafeWindow.XMLHttpRequest = new Proxy(XMLHttpRequest, new ClassHandler(XhrHandler));

  const ProxyIsProxy = Symbol('ProxyIsProxy');
  class ObjectTreeHandler {
    constructor(target, subtree) {
      this.subtree = subtree;
      for (const key in subtree) {
        if (key in target) this.set(target, key, target[key]);
      }
    }

    get(target, prop, receiver) {
      if (prop == ProxyIsProxy) {
        return true;
      } else {
        return Reflect.get(target, prop, receiver);
      }
    }

    set(target, prop, value, receiver) {
      if (prop in this.subtree) {
        const sub = this.subtree[prop];
        if (typeof sub == 'object') {
          if (!value[ProxyIsProxy]) {
            if (Array.isArray(sub)) {
              return Reflect.set(target, prop, new Proxy(value, new ArrayTreeHandler(value, sub[0])));
            } else {
              return Reflect.set(target, prop, new Proxy(value, new ObjectTreeHandler(value, sub)));
            }
          } else {
            return Reflect.set(target, prop, value);
          }
        } else if (typeof sub == 'function') {
          return Reflect.set(target, prop, sub(value));
        } else {
          return Reflect.set(target, prop, value);
        }
      } else {
        return Reflect.set(target, prop, value);
      }
    }
  }

  class ArrayTreeHandler {
    constructor(target, subtree) {
      this.subtree = subtree;
      for (let [index, value] of target.entries()) {
        if (!value[ProxyIsProxy]) target[index] = new Proxy(value, new ObjectTreeHandler(value, subtree));
      }
    }

    get(target, prop, receiver) {
      if (Array.prototype.hasOwnProperty(prop) && !['length', 'slice', 'constructor', 'forEach'].includes(prop))
        console.log('BAL WARN: ArrayTreeHandler get ' + typeof prop + ':' + prop);
      return Reflect.get(target, prop, receiver);
    }

    set(target, prop, value, receiver) {
      if (!['__proto__'].includes(prop)) console.log('BAL WARN: ArrayTreeHandler set ' + typeof prop + ':' + prop);
      return Reflect.set(target, prop, value);
    }
  }

  const override = {
    __PGC_USERSTATE__: {
      area_limit: function (value) {
        if (value == 1) {
          console.log('BAL: modify area_limit = 0');
          limited = true;
          return 0;
        }
      },
    },
    __INITIAL_STATE__: {
      epInfo: {
        rights: {
          area_limit: function (value) {
            if (value == 1) {
              console.log('BAL: modify epInfo area_limit = 0');
              return 0;
            }
          },
        },
      },
      epList: [
        {
          rights: {
            area_limit: function (value) {
              if (value == 1) {
                console.log('BAL: modify epList area_limit = 0');
                return 0;
              }
            },
          },
        },
      ],
    },
  };

  (() => {
    var userstate = undefined;
    Object.defineProperty(unsafeWindow, '__PGC_USERSTATE__', {
      configurable: true,
      get: () => userstate,
      set: (v) => (userstate = new Proxy(v, new ObjectTreeHandler(v, override.__PGC_USERSTATE__))),
    });

    var state = undefined;
    Object.defineProperty(unsafeWindow, '__INITIAL_STATE__', {
      configurable: true,
      get: () => state,
      set: (v) => (state = new Proxy(v, new ObjectTreeHandler(v, override.__INITIAL_STATE__))),
    });
  })();

  window.addEventListener('load', () => {
    if (document.querySelector('div.error-body')) {
      // try load via proxy
      console.log('BAL: Load failed, try use proxy');
      const vid = /\/(BV[^?#]*)$/gm.exec(window.location.pathname)[1];
      for (const [u, loc] of _url__WEBPACK_IMPORTED_MODULE_0__["url_replace_to"]) {
        const detail = loc.api(undefined, 'https:') + 'x/web-interface/view/detail?bvid=' + vid;
        const xhr = new unsafeWindow.XMLHttpRequest();
        xhr.open('GET', detail);
        xhr.hookCookie = true;
        xhr.onreadystatechange = function () {
          if (this.readyState === xhr.DONE && this.status === 200) {
            const r = JSON.parse(this.responseText).data.View.redirect_url;
            console.log(`BAL: Redirected to ${r}.`);
            window.location = r;
          }
        };
        xhr.send();
      }
    }
  });
})(XMLHttpRequest);


/***/ }),

/***/ "./src/url.js":
/*!********************!*\
  !*** ./src/url.js ***!
  \********************/
/*! exports provided: url_status, url_play, url_season, url_api_replace, url_replace_to */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "url_status", function() { return url_status; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "url_play", function() { return url_play; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "url_season", function() { return url_season; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "url_api_replace", function() { return url_api_replace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "url_replace_to", function() { return url_replace_to; });
const url_status = /^(https:)?\/\/api\.bilibili\.com\/pgc\/view\/web\/season\/user\/status\?.*/;
const url_play = /^(https:)?\/\/api\.bilibili\.com\/pgc\/player\/web\/playurl\?.*/;
const url_season = /^(https:)?\/\/api\.bilibili\.com\/pgc\/view\/web\/season\?.*/;

const url_api_replace = /^(https:)?\/\/api\.bilibili\.com\//;

function build_replace_api(region) {
  return function (str, schema) {
    if (schema) return schema + '//bilibili-' + region + '-api.kghost.info/';
    else return '//bilibili-' + region + '-api.kghost.info/';
  };
}

const url_replace_to = [
  [
    // TW
    [/僅.*台/],
    {
      api: build_replace_api('tw'),
    },
  ],
  [
    // HK
    [/僅.*港/],
    {
      api: build_replace_api('hk'),
    },
  ],
  [
    // SG
    [/仅限东南亚/],
    {
      api: build_replace_api('sg'),
    },
  ],
  [
    // CN
    [/^((?!僅).)*$/],
    {
      api: build_replace_api('cn'),
    },
  ],
];


/***/ })

/******/ });
//# sourceMappingURL=bundle.js.map

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant