// ==UserScript==
// @name anti-redirect-improved
// @author Meriel
// @description 去除重定向, 支持必应/谷歌/百度/搜狗/360/知乎/贴吧/简书/豆瓣/微博...
// @version 1.0
// @grant GM_xmlhttpRequest
// @include *://www.google*
// @match *://www.baidu.com/*
// @match *://tieba.baidu.com/*
// @match *://v.baidu.com/*
// @match *://xueshu.baidu.com/*
// @match *://www.google.com/*
// @match *://docs.google.com/*
// @match *://mail.google.com/*
// @match *://play.google.com/*
// @match *://www.youtube.com/*
// @match *://encrypted.google.com/*
// @match *://www.so.com/*
// @match *://www.zhihu.com/*
// @match *://daily.zhihu.com/*
// @match *://zhuanlan.zhihu.com/*
// @match *://weibo.com/*
// @match *://twitter.com/*
// @match *://www.sogou.com/*
// @match *://juejin.im/*
// @match *://juejin.cn/*
// @match *://mail.qq.com/*
// @match *://addons.mozilla.org/*
// @match *://www.jianshu.com/*
// @match *://www.douban.com/*
// @match *://getpocket.com/*
// @match *://www.dogedoge.com/*
// @match *://51.ruyo.net/*
// @match *://steamcommunity.com/*
// @match *://mijisou.com/*
// @match *://blog.csdn.net/*
// @match *://*.blog.csdn.net/*
// @match *://*.oschina.net/*
// @match *://app.yinxiang.com/*
// @match *://www.logonews.cn/*
// @match *://afdian.net/*
// @match *://blog.51cto.com/*
// @match *://xie.infoq.cn/*
// @match *://gitee.com/*
// @match *://sspai.com/*
// @match *://*.bing.com/*
// @connect www.baidu.com
// @connect *
// @run-at document-start
// @namespace Violentmonkey Scripts
// @icon https://cn.bing.com/favicon.ico
// @license MIT
// ==/UserScript==
/******/ (() => {
// webpackBootstrap
/******/ var __webpack_modules__ = [
,
/* 0 */ /* 1 */
/***/ function (__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __runInitializers =
(this && this.__runInitializers) ||
function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue
? initializers[i].call(thisArg, value)
: initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __esDecorate =
(this && this.__esDecorate) ||
function (
ctor,
descriptorIn,
decorators,
contextIn,
initializers,
extraInitializers
) {
function accept(f) {
if (f !== void 0 && typeof f !== "function")
throw new TypeError("Function expected");
return f;
}
var kind = contextIn.kind,
key =
kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target =
!descriptorIn && ctor
? contextIn["static"]
? ctor
: ctor.prototype
: null;
var descriptor =
descriptorIn ||
(target
? Object.getOwnPropertyDescriptor(target, contextIn.name)
: {});
var _,
done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn)
context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access)
context.access[p] = contextIn.access[p];
context.addInitializer = function (f) {
if (done)
throw new TypeError(
"Cannot add initializers after decoration has completed"
);
extraInitializers.push(accept(f || null));
};
var result = (0, decorators[i])(
kind === "accessor"
? { get: descriptor.get, set: descriptor.set }
: descriptor[key],
context
);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object")
throw new TypeError("Object expected");
if ((_ = accept(result.get))) descriptor.get = _;
if ((_ = accept(result.set))) descriptor.set = _;
if ((_ = accept(result.init))) initializers.unshift(_);
} else if ((_ = accept(result))) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __awaiter =
(this && this.__awaiter) ||
function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step(
(generator = generator.apply(thisArg, _arguments || [])).next()
);
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.App = void 0;
const utils_1 = __webpack_require__(2);
let App = (() => {
var _a;
let _instanceExtraInitializers = [];
let _onHover_decorators;
let _onScroll_decorators;
return (
(_a = class App {
constructor() {
this.config =
(__runInitializers(this, _instanceExtraInitializers), void 0);
this.provides = [];
this.observer = new IntersectionObserver(
this.callbackCache.bind(this)
);
}
/**
* A 标签是否匹配服务提供者
* @param aElement
* @param provider
*/
isMatchProvider(aElement, provider) {
if (aElement.getAttribute(utils_1.Marker.RedirectStatusDone)) {
return false;
}
if (
provider.test instanceof RegExp &&
!provider.test.test(aElement.href)
) {
return false;
}
if (
typeof provider.test === "function" &&
!provider.test(aElement)
) {
return false;
}
if (provider.test instanceof Boolean) {
return provider.test;
}
return true;
}
/**
* 当鼠标移动到 A 标签上时
* @param event
*/
onHover(event) {
const aElement = event.target;
if (aElement.tagName !== "A") {
return;
}
// trigger on hover handler
for (const provider of this.provides) {
if (this.isMatchProvider(aElement, provider)) {
provider.resolve(aElement);
}
}
}
/**
* 当页面滚动时
*/
onScroll() {
console.time("onScroll");
const allLinkElements = [].slice.call(
document.querySelectorAll("a[href]")
);
for (const aElement of allLinkElements) {
if (aElement.getAttribute("data-observe")) {
continue;
} else {
aElement.setAttribute("data-observe", "true");
this.observer.observe(aElement);
}
}
console.timeEnd("onScroll");
}
/**
* 回调函数缓存
*/
callbackCache(entries) {
for (const entry of entries) {
const aElement = entry.target;
if (entry.isIntersecting) {
// trigger on scroll handler
for (const provider of this.provides) {
if (this.isMatchProvider(aElement, provider)) {
provider.resolve(aElement);
}
}
}
}
}
/**
* 当页面准备就绪时,进行初始化动作
*/
pageOnReady() {
return __awaiter(this, void 0, void 0, function* () {
for (const provider of this.provides) {
if (provider.onInit) {
yield provider.onInit();
}
// 如果页面处于初始的状态,没有滚动过,则出发一次onScroll事件
if (window.scrollY <= 0) {
this.onScroll();
}
}
});
}
/**
* 设置配置
* @param config
*/
setConfig(config) {
this.config = config;
return this;
}
/**
* 注册(不可用)服务提供者
* @param providers
*/
registerProvider(providers) {
for (const provideConfig of providers) {
// test 如果是 boolean
if (provideConfig.test === false) {
continue;
}
// test 如果是正则表达式
if (
provideConfig.test instanceof RegExp &&
!provideConfig.test.test(document.domain)
) {
continue;
}
// test 如果是一个function
if (
typeof provideConfig.test === "function" &&
provideConfig.test() === false
) {
continue;
}
const provider = new provideConfig.provider();
provider.isDebug = this.config.isDebug;
this.provides.push(provider);
// console.info(`[Anti-redirect]: 加载引擎 ${provideConfig.name}`);
// console.info(`当前页面: '${location.href}'`);
}
return this;
}
/**
* 启动应用
*/
bootstrap() {
addEventListener("scroll", this.onScroll.bind(this));
addEventListener("mousemove", this.onHover.bind(this));
addEventListener("DOMContentLoaded", this.pageOnReady.bind(this));
}
}),
(() => {
const _metadata =
typeof Symbol === "function" && Symbol.metadata
? Object.create(null)
: void 0;
_onHover_decorators = [(0, utils_1.throttleDecorator)(50)];
_onScroll_decorators = [(0, utils_1.debounceDecorator)(300)];
__esDecorate(
_a,
null,
_onHover_decorators,
{
kind: "method",
name: "onHover",
static: false,
private: false,
access: {
has: (obj) => "onHover" in obj,
get: (obj) => obj.onHover,
},
metadata: _metadata,
},
null,
_instanceExtraInitializers
);
__esDecorate(
_a,
null,
_onScroll_decorators,
{
kind: "method",
name: "onScroll",
static: false,
private: false,
access: {
has: (obj) => "onScroll" in obj,
get: (obj) => obj.onScroll,
},
metadata: _metadata,
},
null,
_instanceExtraInitializers
);
if (_metadata)
Object.defineProperty(_a, Symbol.metadata, {
enumerable: true,
configurable: true,
writable: true,
value: _metadata,
});
})(),
_a
);
})();
exports.App = App;
/***/
},
/* 2 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.antiRedirect =
exports.decreaseRedirect =
exports.increaseRedirect =
exports.getRedirect =
exports.debounceDecorator =
exports.throttleDecorator =
exports.getText =
exports.queryParser =
exports.matchLinkFromUrl =
exports.Marker =
void 0;
const debounce = __webpack_require__(3);
const throttle = __webpack_require__(4);
var Marker;
(function (Marker) {
Marker["RedirectCount"] = "redirect-count";
Marker["RedirectStatusDone"] = "anti-redirect-origin-href";
})(Marker || (exports.Marker = Marker = {}));
/**
* 根据url上的路径匹配,去除重定向
* @param {HTMLAnchorElement} aElement
* @param {RegExp} tester
* @returns {boolean}
*/
function matchLinkFromUrl(aElement, tester) {
const matcher = tester.exec(aElement.href);
if (
!(
(matcher === null || matcher === void 0
? void 0
: matcher.length) && matcher[1]
)
) {
return "";
}
let url = "";
try {
url = decodeURIComponent(matcher[1]);
} catch (e) {
url = /https?:\/\//.test(matcher[1]) ? matcher[1] : "";
}
return url;
}
exports.matchLinkFromUrl = matchLinkFromUrl;
class Query {
constructor(queryStr) {
this.queryStr = queryStr;
this.object = {};
this.object = this.toObject(queryStr.replace(/^\?+/, ""));
}
toObject(queryStr) {
const obj = {};
queryStr.split("&").forEach((item) => {
const arr = item.split("=") || [];
let key = arr[0] || "";
let value = arr[1] || "";
try {
key = decodeURIComponent(arr[0] || "");
value = decodeURIComponent(arr[1] || "");
} catch (err) {
//
}
if (key) {
obj[key] = value;
}
});
return obj;
}
toString() {
const arr = [];
for (const key in this.object) {
if (Object.prototype.hasOwnProperty.call(this.object, key)) {
const value = this.object[key];
arr.push(`${key}=${value}`);
}
}
return arr.length ? `?${arr.join("&")}` : "";
}
}
function queryParser(queryString) {
return new Query(queryString);
}
exports.queryParser = queryParser;
function getText(htmlElement) {
return (htmlElement.innerText || htmlElement.textContent).trim();
}
exports.getText = getText;
function throttleDecorator(wait, options = {}) {
return (originMethod, context) => {
return throttle(originMethod, wait, options);
};
}
exports.throttleDecorator = throttleDecorator;
function debounceDecorator(wait, options = {}) {
return (originMethod, context) => {
return debounce(originMethod, wait, options);
};
}
exports.debounceDecorator = debounceDecorator;
function getRedirect(aElement) {
return +(aElement.getAttribute(Marker.RedirectCount) || 0);
}
exports.getRedirect = getRedirect;
function increaseRedirect(aElement) {
const num = getRedirect(aElement);
aElement.setAttribute(Marker.RedirectCount, `${num}${1}`);
}
exports.increaseRedirect = increaseRedirect;
function decreaseRedirect(aElement) {
const num = getRedirect(aElement);
if (num > 0) {
aElement.setAttribute(Marker.RedirectCount, `${num - 1}`);
}
}
exports.decreaseRedirect = decreaseRedirect;
/**
* 去除重定向
* @param aElement A标签元素
* @param realUrl 真实的地址
* @param options
*/
function antiRedirect(aElement, realUrl, options = {}) {
options.debug =
typeof options.debug === "undefined"
? "production" !== "production"
: options.debug;
options.force = options.force;
if (!options.force && (!realUrl || aElement.href === realUrl)) {
return;
}
if (options.debug) {
aElement.style.backgroundColor = "green";
}
aElement.setAttribute(Marker.RedirectStatusDone, aElement.href);
aElement.href = realUrl;
}
exports.antiRedirect = antiRedirect;
/***/
},
/* 3 */
/***/ (module, __unused_webpack_exports, __webpack_require__) => {
/**
* lodash (Custom Build) <https://lodash.com/>
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = "Expected a function";
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/** `Object#toString` result references. */
var symbolTag = "[object Symbol]";
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/** Detect free variable `global` from Node.js. */
var freeGlobal =
typeof __webpack_require__.g == "object" &&
__webpack_require__.g &&
__webpack_require__.g.Object === Object &&
__webpack_require__.g;
/** Detect free variable `self`. */
var freeSelf =
typeof self == "object" && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function("return this")();
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
nativeMin = Math.min;
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @since 2.4.0
* @category Date
* @returns {number} Returns the timestamp.
* @example
*
* _.defer(function(stamp) {
* console.log(_.now() - stamp);
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
var now = function () {
return root.Date.now();
};
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
* invoked. The debounced function comes with a `cancel` method to cancel
* delayed `func` invocations and a `flush` method to immediately invoke them.
* Provide `options` to indicate whether `func` should be invoked on the
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
* with the last arguments provided to the debounced function. Subsequent
* calls to the debounced function return the result of the last `func`
* invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is
* invoked on the trailing edge of the timeout only if the debounced function
* is invoked more than once during the `wait` timeout.
*
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
*
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
* for details over the differences between `_.debounce` and `_.throttle`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to debounce.
* @param {number} [wait=0] The number of milliseconds to delay.
* @param {Object} [options={}] The options object.
* @param {boolean} [options.leading=false]
* Specify invoking on the leading edge of the timeout.
* @param {number} [options.maxWait]
* The maximum time `func` is allowed to be delayed before it's invoked.
* @param {boolean} [options.trailing=true]
* Specify invoking on the trailing edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // Avoid costly calculations while the window size is in flux.
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
*
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
* jQuery(element).on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* }));
*
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
* var source = new EventSource('/stream');
* jQuery(source).on('message', debounced);
*
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
function debounce(func, wait, options) {
var lastArgs,
lastThis,
maxWait,
result,
timerId,
lastCallTime,
lastInvokeTime = 0,
leading = false,
maxing = false,
trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing
? nativeMax(toNumber(options.maxWait) || 0, wait)
: maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
// Reset any `maxWait` timer.
lastInvokeTime = time;
// Start the timer for the trailing edge.
timerId = setTimeout(timerExpired, wait);
// Invoke the leading edge.
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
return maxing
? nativeMin(result, maxWait - timeSinceLastInvoke)
: result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime;
// Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
return (
lastCallTime === undefined ||
timeSinceLastCall >= wait ||
timeSinceLastCall < 0 ||
(maxing && timeSinceLastInvoke >= maxWait)
);
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
// Restart the timer.
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = undefined;
// Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = undefined;
return result;
}
function cancel() {
if (timerId !== undefined) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
function flush() {
return timerId === undefined ? result : trailingEdge(now());
}
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == "object" || type == "function");
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == "object";
}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return (
typeof value == "symbol" ||
(isObjectLike(value) && objectToString.call(value) == symbolTag)
);
}
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other =
typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, "");
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value)
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: reIsBadHex.test(value)
? NAN
: +value;
}
module.exports = debounce;
/***/
},
/* 4 */
/***/ (module, __unused_webpack_exports, __webpack_require__) => {
/**
* lodash (Custom Build) <https://lodash.com/>
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = "Expected a function";
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/** `Object#toString` result references. */
var symbolTag = "[object Symbol]";
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/** Detect free variable `global` from Node.js. */
var freeGlobal =
typeof __webpack_require__.g == "object" &&
__webpack_require__.g &&
__webpack_require__.g.Object === Object &&
__webpack_require__.g;
/** Detect free variable `self`. */
var freeSelf =
typeof self == "object" && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function("return this")();
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
nativeMin = Math.min;
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @since 2.4.0
* @category Date
* @returns {number} Returns the timestamp.
* @example
*
* _.defer(function(stamp) {
* console.log(_.now() - stamp);
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
var now = function () {
return root.Date.now();
};
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
* invoked. The debounced function comes with a `cancel` method to cancel
* delayed `func` invocations and a `flush` method to immediately invoke them.
* Provide `options` to indicate whether `func` should be invoked on the
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
* with the last arguments provided to the debounced function. Subsequent
* calls to the debounced function return the result of the last `func`
* invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is
* invoked on the trailing edge of the timeout only if the debounced function
* is invoked more than once during the `wait` timeout.
*
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
*
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
* for details over the differences between `_.debounce` and `_.throttle`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to debounce.
* @param {number} [wait=0] The number of milliseconds to delay.
* @param {Object} [options={}] The options object.
* @param {boolean} [options.leading=false]
* Specify invoking on the leading edge of the timeout.
* @param {number} [options.maxWait]
* The maximum time `func` is allowed to be delayed before it's invoked.
* @param {boolean} [options.trailing=true]
* Specify invoking on the trailing edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // Avoid costly calculations while the window size is in flux.
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
*
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
* jQuery(element).on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* }));
*
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
* var source = new EventSource('/stream');
* jQuery(source).on('message', debounced);
*
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
function debounce(func, wait, options) {
var lastArgs,
lastThis,
maxWait,
result,
timerId,
lastCallTime,
lastInvokeTime = 0,
leading = false,
maxing = false,
trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing
? nativeMax(toNumber(options.maxWait) || 0, wait)
: maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
// Reset any `maxWait` timer.
lastInvokeTime = time;
// Start the timer for the trailing edge.
timerId = setTimeout(timerExpired, wait);
// Invoke the leading edge.
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
return maxing
? nativeMin(result, maxWait - timeSinceLastInvoke)
: result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime;
// Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
return (
lastCallTime === undefined ||
timeSinceLastCall >= wait ||
timeSinceLastCall < 0 ||
(maxing && timeSinceLastInvoke >= maxWait)
);
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
// Restart the timer.
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = undefined;
// Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = undefined;
return result;
}
function cancel() {
if (timerId !== undefined) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
function flush() {
return timerId === undefined ? result : trailingEdge(now());
}
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
/**
* Creates a throttled function that only invokes `func` at most once per
* every `wait` milliseconds. The throttled function comes with a `cancel`
* method to cancel delayed `func` invocations and a `flush` method to
* immediately invoke them. Provide `options` to indicate whether `func`
* should be invoked on the leading and/or trailing edge of the `wait`
* timeout. The `func` is invoked with the last arguments provided to the
* throttled function. Subsequent calls to the throttled function return the
* result of the last `func` invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is
* invoked on the trailing edge of the timeout only if the throttled function
* is invoked more than once during the `wait` timeout.
*
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
*
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
* for details over the differences between `_.throttle` and `_.debounce`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to throttle.
* @param {number} [wait=0] The number of milliseconds to throttle invocations to.
* @param {Object} [options={}] The options object.
* @param {boolean} [options.leading=true]
* Specify invoking on the leading edge of the timeout.
* @param {boolean} [options.trailing=true]
* Specify invoking on the trailing edge of the timeout.
* @returns {Function} Returns the new throttled function.
* @example
*
* // Avoid excessively updating the position while scrolling.
* jQuery(window).on('scroll', _.throttle(updatePosition, 100));
*
* // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
* var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
* jQuery(element).on('click', throttled);
*
* // Cancel the trailing throttled invocation.
* jQuery(window).on('popstate', throttled.cancel);
*/
function throttle(func, wait, options) {
var leading = true,
trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
if (isObject(options)) {
leading = "leading" in options ? !!options.leading : leading;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
return debounce(func, wait, {
leading: leading,
maxWait: wait,
trailing: trailing,
});
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == "object" || type == "function");
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == "object";
}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return (
typeof value == "symbol" ||
(isObjectLike(value) && objectToString.call(value) == symbolTag)
);
}
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other =
typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, "");
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value)
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: reIsBadHex.test(value)
? NAN
: +value;
}
module.exports = throttle;
/***/
},
/* 5 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RuyoProvider = void 0;
const utils_1 = __webpack_require__(2);
class RuyoProvider {
constructor() {
this.test = /\/[^\?]*\?u=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("u")
);
}
}
exports.RuyoProvider = RuyoProvider;
/***/
},
/* 6 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MozillaProvider = void 0;
const utils_1 = __webpack_require__(2);
class MozillaProvider {
constructor() {
this.test = /outgoing\.prod\.mozaws\.net\/v\d\/\w+\/(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
(0, utils_1.matchLinkFromUrl)(aElement, this.test)
);
}
}
exports.MozillaProvider = MozillaProvider;
/***/
},
/* 7 */
/***/ function (__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __awaiter =
(this && this.__awaiter) ||
function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step(
(generator = generator.apply(thisArg, _arguments || [])).next()
);
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.YinXiangProvider = void 0;
const utils_1 = __webpack_require__(2);
class YinXiangProvider {
constructor() {
this.test = /^http:\/\//;
}
resolve(aElement) {
// 编辑器
if (aElement.hasAttribute("data-mce-href")) {
if (!aElement.onclick) {
(0, utils_1.antiRedirect)(aElement, aElement.href, {
force: true,
});
aElement.onclick = (e) => {
// 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
if (e.stopPropagation) {
e.stopPropagation();
}
aElement.setAttribute("target", "_blank");
window.top
? window.top.open(aElement.href)
: window.open(aElement.href);
};
}
}
// 分享页面
else if (
/^https:\/\/app\.yinxiang\.com\/OutboundRedirect\.action\?dest=/.test(
aElement.href
)
) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("dest")
);
}
}
onInit() {
return __awaiter(this, void 0, void 0, function* () {
const handler = (e) => {
const dom = e.target;
const tagName = dom.tagName.toUpperCase();
switch (tagName) {
case "A": {
this.resolve(dom);
break;
}
case "IFRAME": {
if (dom.hasAttribute("anti-redirect-handled")) {
return;
}
dom.setAttribute("anti-redirect-handled", "1");
dom.contentWindow.document.addEventListener(
"mouseover",
handler
);
break;
}
}
};
document.addEventListener("mouseover", handler);
return this;
});
}
}
exports.YinXiangProvider = YinXiangProvider;
/***/
},
/* 8 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CSDNProvider = void 0;
const utils_1 = __webpack_require__(2);
class CSDNProvider {
constructor() {
this.test = /^https?:\/\//;
}
resolve(aElement) {
var _a;
this.container = document.querySelector("#content_views");
if (
(_a = this.container) === null || _a === void 0
? void 0
: _a.contains(aElement)
) {
if (
!aElement.onclick &&
aElement.origin !== window.location.origin
) {
(0, utils_1.antiRedirect)(aElement, aElement.href, {
force: true,
});
aElement.onclick = (e) => {
// 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
if (e.stopPropagation) {
e.stopPropagation();
}
aElement.setAttribute("target", "_blank");
};
}
}
}
}
exports.CSDNProvider = CSDNProvider;
/***/
},
/* 9 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OSChinaProvider = void 0;
const utils_1 = __webpack_require__(2);
class OSChinaProvider {
constructor() {
this.test = /oschina\.net\/action\/GoToLink\?url=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("url")
);
}
}
exports.OSChinaProvider = OSChinaProvider;
/***/
},
/* 10 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZhihuDailyProvider = void 0;
const utils_1 = __webpack_require__(2);
class ZhihuDailyProvider {
constructor() {
this.test = /zhihu\.com\/\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.ZhihuDailyProvider = ZhihuDailyProvider;
/***/
},
/* 11 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GoogleDocsProvider = void 0;
const utils_1 = __webpack_require__(2);
class GoogleDocsProvider {
constructor() {
this.test = /www\.google\.com\/url\?q=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("q")
);
}
}
exports.GoogleDocsProvider = GoogleDocsProvider;
/***/
},
/* 12 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PocketProvider = void 0;
const utils_1 = __webpack_require__(2);
class PocketProvider {
constructor() {
this.test = /getpocket\.com\/redirect\?url=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("url")
);
}
}
exports.PocketProvider = PocketProvider;
/***/
},
/* 13 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GmailProvider = void 0;
const utils_1 = __webpack_require__(2);
class GmailProvider {
constructor() {
this.test = true;
this.REDIRECT_PROPERTY = "data-saferedirecturl";
}
resolve(aElement) {
// 移除这个属性,那么 a 链接就不会跳转
// FIXME: gmail 是多层 iframe 嵌套
if (aElement.getAttribute(this.REDIRECT_PROPERTY)) {
aElement.removeAttribute(this.REDIRECT_PROPERTY);
(0, utils_1.antiRedirect)(aElement, aElement.href);
}
}
}
exports.GmailProvider = GmailProvider;
/***/
},
/* 14 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JuejinProvider = void 0;
const utils_1 = __webpack_require__(2);
class JuejinProvider {
constructor() {
this.test = /link\.juejin\.(im|cn)\/\?target=(.*)/;
}
resolve(aElement) {
const finalURL = new URL(aElement.href).searchParams.get("target");
(0, utils_1.antiRedirect)(aElement, finalURL);
if (this.test.test(aElement.title)) {
aElement.title = finalURL;
}
}
}
exports.JuejinProvider = JuejinProvider;
/***/
},
/* 15 */
/***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.QQMailProvider = void 0;
class QQMailProvider {
constructor() {
this.test = true;
}
resolve(aElement) {
var _a;
this.container = document.querySelector("#contentDiv");
if (
(_a = this.container) === null || _a === void 0
? void 0
: _a.contains(aElement)
) {
if (aElement.onclick) {
aElement.onclick = (e) => {
// 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
if (e.stopPropagation) {
e.stopPropagation();
}
};
}
}
}
}
exports.QQMailProvider = QQMailProvider;
/***/
},
/* 16 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MiJiProvider = void 0;
const utils_1 = __webpack_require__(2);
class MiJiProvider {
constructor() {
this.test = /mijisou\.com\/url_proxy\?proxyurl=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("proxyurl")
);
}
}
exports.MiJiProvider = MiJiProvider;
/***/
},
/* 17 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GooglePlayProvider = void 0;
const utils_1 = __webpack_require__(2);
class GooglePlayProvider {
test(aElement) {
if (/google\.com\/url\?q=(.*)/.test(aElement.href)) {
return true;
} else if (/^\/store\/apps\/details/.test(location.pathname)) {
return true;
}
return false;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("q")
);
// 移除开发者栏目下的重定向
const eles = [].slice.call(document.querySelectorAll("a.hrTbp"));
for (const ele of eles) {
if (!ele.href) {
continue;
}
if (ele.getAttribute(utils_1.Marker.RedirectStatusDone)) {
continue;
}
ele.setAttribute(utils_1.Marker.RedirectStatusDone, ele.href);
ele.setAttribute("target", "_blank");
ele.addEventListener(
"click",
(event) => {
event.stopPropagation();
},
true
);
}
}
}
exports.GooglePlayProvider = GooglePlayProvider;
/***/
},
/* 18 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SteamProvider = void 0;
const utils_1 = __webpack_require__(2);
class SteamProvider {
constructor() {
this.test = /steamcommunity\.com\/linkfilter\/\?url=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("url")
);
}
}
exports.SteamProvider = SteamProvider;
/***/
},
/* 19 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TiebaProvider = void 0;
const utils_1 = __webpack_require__(2);
class TiebaProvider {
constructor() {
this.test = /jump\d*\.bdimg\.com/;
}
resolve(aElement) {
if (!this.test.test(aElement.href)) {
return;
}
let url = "";
const text = aElement.innerText || aElement.textContent || "";
try {
if (/https?:\/\//.test(text)) {
url = decodeURIComponent(text);
}
} catch (e) {
url = /https?:\/\//.test(text) ? text : "";
}
if (url) {
(0, utils_1.antiRedirect)(aElement, url);
}
}
}
exports.TiebaProvider = TiebaProvider;
/***/
},
/* 20 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwitterProvider = void 0;
const utils_1 = __webpack_require__(2);
class TwitterProvider {
constructor() {
this.test = /t\.co\/\w+/;
}
resolve(aElement) {
if (!this.test.test(aElement.href)) {
return;
}
if (/https?:\/\//.test(aElement.title)) {
const url = decodeURIComponent(aElement.title);
(0, utils_1.antiRedirect)(aElement, url);
return;
}
const innerText = aElement.innerText.replace(/…$/, "");
if (/https?:\/\//.test(innerText)) {
(0, utils_1.antiRedirect)(aElement, innerText);
return;
}
}
}
exports.TwitterProvider = TwitterProvider;
/***/
},
/* 21 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaiduVideoProvider = void 0;
const utils_1 = __webpack_require__(2);
const gm_http_1 = __webpack_require__(22);
class BaiduVideoProvider {
constructor() {
this.test = /v\.baidu\.com\/link\?url=/;
}
resolve(aElement) {
gm_http_1.default
.request({
url: aElement.href,
method: "GET",
anonymous: true,
})
.then((res) => {
if (res.finalUrl) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
}
})
.catch((err) => {
if (err.finalUrl) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
}
});
}
}
exports.BaiduVideoProvider = BaiduVideoProvider;
/***/
},
/* 22 */
/***/ function (module) {
(function webpackUniversalModuleDefinition(root, factory) {
if (true) module.exports = factory();
else {
}
})(this, function () {
return /******/ (function (modules) {
// webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __nested_webpack_require_535__(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,
__nested_webpack_require_535__
);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/
}
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __nested_webpack_require_535__.m = modules;
/******/
/******/ // expose the module cache
/******/ __nested_webpack_require_535__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __nested_webpack_require_535__.d = function (
exports,
name,
getter
) {
/******/ if (!__nested_webpack_require_535__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter,
/******/
});
/******/
}
/******/
};
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __nested_webpack_require_535__.n = function (module) {
/******/ var getter =
module && module.__esModule
? /******/ function getDefault() {
return module["default"];
}
: /******/ function getModuleExports() {
return module;
};
/******/ __nested_webpack_require_535__.d(getter, "a", getter);
/******/ return getter;
/******/
};
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __nested_webpack_require_535__.o = function (
object,
property
) {
return Object.prototype.hasOwnProperty.call(object, property);
};
/******/
/******/ // __webpack_public_path__
/******/ __nested_webpack_require_535__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __nested_webpack_require_535__(
(__nested_webpack_require_535__.s = 0)
);
/******/
})(
/************************************************************************/
/******/ [
/* 0 */
/***/ function (module, exports, __webpack_require__) {
"use strict";
/**
* Created by axetroy on 17-6-23.
*/
/// <reference path="./index.d.ts" />
var __assign =
(this && this.__assign) ||
Object.assign ||
function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
function isFunction(func) {
return typeof func === "function";
}
var Http = (function () {
function Http(config) {
if (config === void 0) {
config = {};
}
this.config = config;
}
Http.prototype.setConfig = function (config) {
if (config === void 0) {
config = {};
}
this.config = __assign({}, this.config, config);
};
Http.prototype.create = function (config) {
return new Http(config);
};
Http.prototype.request = function (config) {
var _this = this;
return new Promise(function (resolve, reject) {
var commonRequestConfig = {
method: config.method,
url: config.url,
data: config.body,
header: config.headers,
};
var GM_xmlhttpRequestConfig = __assign(
{},
commonRequestConfig,
config,
_this.config
);
var onreadystatechange =
GM_xmlhttpRequestConfig.onreadystatechange,
onerror = GM_xmlhttpRequestConfig.onerror,
onabort = GM_xmlhttpRequestConfig.onabort,
ontimeout = GM_xmlhttpRequestConfig.ontimeout;
GM_xmlhttpRequestConfig.synchronous = true; // async
GM_xmlhttpRequestConfig.onreadystatechange = function (
response
) {
try {
isFunction(onreadystatechange) &&
onreadystatechange.call(this, response);
} catch (err) {
reject(err);
}
if (response.readyState !== 4) return;
response.status >= 200 && response.status < 400
? resolve(response)
: reject(response);
};
GM_xmlhttpRequestConfig.onerror = function (response) {
try {
isFunction(onerror) && onerror.call(this, response);
reject(response);
} catch (err) {
reject(err);
}
};
GM_xmlhttpRequestConfig.onabort = function (response) {
try {
isFunction(onabort) && onabort.call(this, response);
reject(response);
} catch (err) {
reject(err);
}
};
GM_xmlhttpRequestConfig.ontimeout = function (response) {
try {
isFunction(ontimeout) && ontimeout.call(this, response);
reject(response);
} catch (err) {
reject(err);
}
};
if (_this.config.debug) {
// console.log(
// "%c[" +
// commonRequestConfig.method.toUpperCase() +
// "]%c: " +
// commonRequestConfig.url,
// "color: green",
// "color: #000;text-style: under-line"
// );
}
GM_xmlhttpRequest(__assign({}, GM_xmlhttpRequestConfig));
});
};
Http.prototype.get = function (url, data, headers, config) {
if (headers === void 0) {
headers = {};
}
if (config === void 0) {
config = {};
}
return this.request(
__assign(
{ url: url, method: "GET", body: data, headers: headers },
config
)
);
};
Http.prototype.post = function (url, data, headers, config) {
if (headers === void 0) {
headers = {};
}
if (config === void 0) {
config = {};
}
return this.request(
__assign(
{
url: url,
method: "POST",
body: data,
headers: headers,
},
config
)
);
};
Http.prototype.put = function (url, data, headers, config) {
if (headers === void 0) {
headers = {};
}
if (config === void 0) {
config = {};
}
return this.request(
__assign(
{
url: url,
method: "POST",
body: data,
headers: headers,
},
config
)
);
};
Http.prototype["delete"] = function (
url,
data,
headers,
config
) {
if (headers === void 0) {
headers = {};
}
if (config === void 0) {
config = {};
}
return this.request(
__assign(
{
url: url,
method: "DELETE",
body: data,
headers: headers,
},
config
)
);
};
Http.prototype.head = function (url, data, headers, config) {
if (headers === void 0) {
headers = {};
}
if (config === void 0) {
config = {};
}
return this.request(
__assign(
{
url: url,
method: "HEAD",
body: data,
headers: headers,
},
config
)
);
};
return Http;
})();
exports.Http = Http;
var timeout = 5000;
exports.timeout = timeout;
var http = new Http({ timeout: timeout });
exports.http = http;
exports.default = http;
/***/
},
/******/
]
);
});
/***/
},
/* 23 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WeboProvider = void 0;
const utils_1 = __webpack_require__(2);
class WeboProvider {
constructor() {
this.test = /t\.cn\/\w+/;
}
resolve(aElement) {
if (
!(
this.test.test(aElement.href) &&
/^https?:\/\//.test(aElement.title)
)
) {
return;
}
const url = decodeURIComponent(aElement.title);
if (url) {
aElement.href = url;
(0, utils_1.antiRedirect)(aElement, url);
}
}
}
exports.WeboProvider = WeboProvider;
/***/
},
/* 24 */
/***/ function (__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __awaiter =
(this && this.__awaiter) ||
function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step(
(generator = generator.apply(thisArg, _arguments || [])).next()
);
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaiduProvider = void 0;
const utils_1 = __webpack_require__(2);
const gm_http_1 = __webpack_require__(22);
const p_retry_1 = __webpack_require__(25);
class BaiduProvider {
constructor() {
this.test = /www\.baidu\.com\/link\?url=/;
}
resolve(aElement) {
if (
(0, utils_1.getRedirect)(aElement) <= 2 &&
this.test.test(aElement.href)
) {
(0, utils_1.increaseRedirect)(aElement);
(0, p_retry_1.default)(() => this.handlerOneElement(aElement), {
retries: 3,
})
.then((res) => {
(0, utils_1.decreaseRedirect)(aElement);
})
.catch((err) => {
(0, utils_1.decreaseRedirect)(aElement);
});
}
}
handlerOneElement(aElement) {
return __awaiter(this, void 0, void 0, function* () {
try {
const res = yield gm_http_1.default.request({
url: aElement.href,
method: "GET",
anonymous: true,
});
if (res.finalUrl) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
}
return res;
} catch (err) {
if (err.finalUrl) {
(0, utils_1.antiRedirect)(aElement, err.finalUrl);
return err;
} else return Promise.reject(new Error(`[http]: ${aElement.href} fail`));
}
});
}
}
exports.BaiduProvider = BaiduProvider;
/***/
},
/* 25 */
/***/ (
__unused_webpack___webpack_module__,
__webpack_exports__,
__webpack_require__
) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ AbortError: () => /* binding */ AbortError,
/* harmony export */ default: () => /* binding */ pRetry,
/* harmony export */
});
/* harmony import */ var retry__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(26);
const networkErrorMsgs = new Set([
"Failed to fetch", // Chrome
"NetworkError when attempting to fetch resource.", // Firefox
"The Internet connection appears to be offline.", // Safari
"Network request failed", // `cross-fetch`
"fetch failed", // Undici (Node.js)
]);
class AbortError extends Error {
constructor(message) {
super();
if (message instanceof Error) {
this.originalError = message;
({ message } = message);
} else {
this.originalError = new Error(message);
this.originalError.stack = this.stack;
}
this.name = "AbortError";
this.message = message;
}
}
const decorateErrorWithCounts = (error, attemptNumber, options) => {
// Minus 1 from attemptNumber because the first attempt does not count as a retry
const retriesLeft = options.retries - (attemptNumber - 1);
error.attemptNumber = attemptNumber;
error.retriesLeft = retriesLeft;
return error;
};
const isNetworkError = (errorMessage) =>
networkErrorMsgs.has(errorMessage);
async function pRetry(input, options) {
return new Promise((resolve, reject) => {
options = {
onFailedAttempt() {},
retries: 10,
...options,
};
const operation =
retry__WEBPACK_IMPORTED_MODULE_0__.operation(options);
const abortHandler = () => {
operation.stop();
reject(options.signal?.reason);
};
if (options.signal && !options.signal.aborted) {
options.signal.addEventListener("abort", abortHandler, {
once: true,
});
}
const cleanUp = () => {
options.signal?.removeEventListener("abort", abortHandler);
operation.stop();
};
operation.attempt(async (attemptNumber) => {
try {
const result = await input(attemptNumber);
cleanUp();
resolve(result);
} catch (error) {
try {
if (!(error instanceof Error)) {
throw new TypeError(
`Non-error was thrown: "${error}". You should only throw errors.`
);
}
if (error instanceof AbortError) {
throw error.originalError;
}
if (
error instanceof TypeError &&
!isNetworkError(error.message)
) {
throw error;
}
await options.onFailedAttempt(
decorateErrorWithCounts(error, attemptNumber, options)
);
if (!operation.retry(error)) {
throw operation.mainError();
}
} catch (finalError) {
decorateErrorWithCounts(finalError, attemptNumber, options);
cleanUp();
reject(finalError);
}
}
});
});
}
/***/
},
/* 26 */
/***/ (module, __unused_webpack_exports, __webpack_require__) => {
module.exports = __webpack_require__(27);
/***/
},
/* 27 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
var RetryOperation = __webpack_require__(28);
exports.operation = function (options) {
var timeouts = exports.timeouts(options);
return new RetryOperation(timeouts, {
forever: options && (options.forever || options.retries === Infinity),
unref: options && options.unref,
maxRetryTime: options && options.maxRetryTime,
});
};
exports.timeouts = function (options) {
if (options instanceof Array) {
return [].concat(options);
}
var opts = {
retries: 10,
factor: 2,
minTimeout: 1 * 1000,
maxTimeout: Infinity,
randomize: false,
};
for (var key in options) {
opts[key] = options[key];
}
if (opts.minTimeout > opts.maxTimeout) {
throw new Error("minTimeout is greater than maxTimeout");
}
var timeouts = [];
for (var i = 0; i < opts.retries; i++) {
timeouts.push(this.createTimeout(i, opts));
}
if (options && options.forever && !timeouts.length) {
timeouts.push(this.createTimeout(i, opts));
}
// sort the array numerically ascending
timeouts.sort(function (a, b) {
return a - b;
});
return timeouts;
};
exports.createTimeout = function (attempt, opts) {
var random = opts.randomize ? Math.random() + 1 : 1;
var timeout = Math.round(
random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt)
);
timeout = Math.min(timeout, opts.maxTimeout);
return timeout;
};
exports.wrap = function (obj, options, methods) {
if (options instanceof Array) {
methods = options;
options = null;
}
if (!methods) {
methods = [];
for (var key in obj) {
if (typeof obj[key] === "function") {
methods.push(key);
}
}
}
for (var i = 0; i < methods.length; i++) {
var method = methods[i];
var original = obj[method];
obj[method] = function retryWrapper(original) {
var op = exports.operation(options);
var args = Array.prototype.slice.call(arguments, 1);
var callback = args.pop();
args.push(function (err) {
if (op.retry(err)) {
return;
}
if (err) {
arguments[0] = op.mainError();
}
callback.apply(this, arguments);
});
op.attempt(function () {
original.apply(obj, args);
});
}.bind(obj, original);
obj[method].options = options;
}
};
/***/
},
/* 28 */
/***/ (module) => {
function RetryOperation(timeouts, options) {
// Compatibility for the old (timeouts, retryForever) signature
if (typeof options === "boolean") {
options = { forever: options };
}
this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));
this._timeouts = timeouts;
this._options = options || {};
this._maxRetryTime = (options && options.maxRetryTime) || Infinity;
this._fn = null;
this._errors = [];
this._attempts = 1;
this._operationTimeout = null;
this._operationTimeoutCb = null;
this._timeout = null;
this._operationStart = null;
this._timer = null;
if (this._options.forever) {
this._cachedTimeouts = this._timeouts.slice(0);
}
}
module.exports = RetryOperation;
RetryOperation.prototype.reset = function () {
this._attempts = 1;
this._timeouts = this._originalTimeouts.slice(0);
};
RetryOperation.prototype.stop = function () {
if (this._timeout) {
clearTimeout(this._timeout);
}
if (this._timer) {
clearTimeout(this._timer);
}
this._timeouts = [];
this._cachedTimeouts = null;
};
RetryOperation.prototype.retry = function (err) {
if (this._timeout) {
clearTimeout(this._timeout);
}
if (!err) {
return false;
}
var currentTime = new Date().getTime();
if (err && currentTime - this._operationStart >= this._maxRetryTime) {
this._errors.push(err);
this._errors.unshift(new Error("RetryOperation timeout occurred"));
return false;
}
this._errors.push(err);
var timeout = this._timeouts.shift();
if (timeout === undefined) {
if (this._cachedTimeouts) {
// retry forever, only keep last error
this._errors.splice(0, this._errors.length - 1);
timeout = this._cachedTimeouts.slice(-1);
} else {
return false;
}
}
var self = this;
this._timer = setTimeout(function () {
self._attempts++;
if (self._operationTimeoutCb) {
self._timeout = setTimeout(function () {
self._operationTimeoutCb(self._attempts);
}, self._operationTimeout);
if (self._options.unref) {
self._timeout.unref();
}
}
self._fn(self._attempts);
}, timeout);
if (this._options.unref) {
this._timer.unref();
}
return true;
};
RetryOperation.prototype.attempt = function (fn, timeoutOps) {
this._fn = fn;
if (timeoutOps) {
if (timeoutOps.timeout) {
this._operationTimeout = timeoutOps.timeout;
}
if (timeoutOps.cb) {
this._operationTimeoutCb = timeoutOps.cb;
}
}
var self = this;
if (this._operationTimeoutCb) {
this._timeout = setTimeout(function () {
self._operationTimeoutCb();
}, self._operationTimeout);
}
this._operationStart = new Date().getTime();
this._fn(this._attempts);
};
RetryOperation.prototype.try = function (fn) {
// console.log("Using RetryOperation.try() is deprecated");
this.attempt(fn);
};
RetryOperation.prototype.start = function (fn) {
// console.log("Using RetryOperation.start() is deprecated");
this.attempt(fn);
};
RetryOperation.prototype.start = RetryOperation.prototype.try;
RetryOperation.prototype.errors = function () {
return this._errors;
};
RetryOperation.prototype.attempts = function () {
return this._attempts;
};
RetryOperation.prototype.mainError = function () {
if (this._errors.length === 0) {
return null;
}
var counts = {};
var mainError = null;
var mainErrorCount = 0;
for (var i = 0; i < this._errors.length; i++) {
var error = this._errors[i];
var message = error.message;
var count = (counts[message] || 0) + 1;
counts[message] = count;
if (count >= mainErrorCount) {
mainError = error;
mainErrorCount = count;
}
}
return mainError;
};
/***/
},
/* 29 */
/***/ function (__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __awaiter =
(this && this.__awaiter) ||
function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step(
(generator = generator.apply(thisArg, _arguments || [])).next()
);
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DogeDogeProvider = void 0;
const utils_1 = __webpack_require__(2);
const gm_http_1 = __webpack_require__(22);
class DogeDogeProvider {
constructor() {
this.test = /www\.dogedoge\.com\/rd\/.{1,}/;
}
resolve(aElement) {
if (
(0, utils_1.getRedirect)(aElement) <= 2 &&
this.test.test(aElement.href)
) {
(0, utils_1.increaseRedirect)(aElement);
this.handlerOneElement(aElement)
.then((res) => {
(0, utils_1.decreaseRedirect)(aElement);
})
.catch((err) => {
(0, utils_1.decreaseRedirect)(aElement);
});
}
}
handlerOneElement(aElement) {
return __awaiter(this, void 0, void 0, function* () {
try {
const res = yield gm_http_1.default.request({
url: aElement.href,
method: "GET",
anonymous: true,
});
if (res.finalUrl) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
}
return res;
} catch (err) {
// console.error(err);
}
});
}
}
exports.DogeDogeProvider = DogeDogeProvider;
/***/
},
/* 30 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DouBanProvider = void 0;
const utils_1 = __webpack_require__(2);
class DouBanProvider {
constructor() {
this.test = /douban\.com\/link2\/?\?url=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("url")
);
}
}
exports.DouBanProvider = DouBanProvider;
/***/
},
/* 31 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GoogleProvider = void 0;
const utils_1 = __webpack_require__(2);
class GoogleProvider {
constructor() {
this.test = true;
}
resolve(aElement) {
const traceProperties = [
"ping",
"data-jsarwt",
"data-usg",
"data-ved",
];
// 移除追踪
for (const property of traceProperties) {
if (aElement.getAttribute(property)) {
aElement.removeAttribute(property);
}
}
// 移除多余的事件
if (aElement.getAttribute("onmousedown")) {
aElement.removeAttribute("onmousedown");
}
// 尝试去除重定向
if (aElement.getAttribute("data-href")) {
const realUrl = aElement.getAttribute("data-href");
(0, utils_1.antiRedirect)(aElement, realUrl);
}
const url = new URL(aElement.href);
if (url.searchParams.get("url")) {
(0, utils_1.antiRedirect)(aElement, url.searchParams.get("url"));
}
}
}
exports.GoogleProvider = GoogleProvider;
/***/
},
/* 32 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JianShuProvider = void 0;
const utils_1 = __webpack_require__(2);
class JianShuProvider {
constructor() {
this.test = (aElement) => {
const isLink1 = /links\.jianshu\.com\/go/.test(aElement.href);
const isLink2 = /link\.jianshu\.com(\/)?\?t=/.test(aElement.href);
const isLink3 = /jianshu\.com\/go-wild\/?\?(.*)url=/.test(
aElement.href
);
if (isLink1 || isLink2 || isLink3) {
return true;
}
return false;
};
}
resolve(aElement) {
const search = new URL(aElement.href).searchParams;
(0, utils_1.antiRedirect)(
aElement,
search.get("to") || search.get("t") || search.get("url")
);
}
}
exports.JianShuProvider = JianShuProvider;
/***/
},
/* 33 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SoProvider = void 0;
const utils_1 = __webpack_require__(2);
class SoProvider {
constructor() {
this.test = /so\.com\/link\?(.*)/;
}
resolve(aElement) {
const url =
aElement.getAttribute("data-mdurl") ||
aElement.getAttribute("e-landurl");
if (url) {
(0, utils_1.antiRedirect)(aElement, url);
}
// remove track
aElement.removeAttribute("e_href");
aElement.removeAttribute("data-res");
}
}
exports.SoProvider = SoProvider;
/***/
},
/* 34 */
/***/ function (__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __awaiter =
(this && this.__awaiter) ||
function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step(
(generator = generator.apply(thisArg, _arguments || [])).next()
);
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SoGouProvider = void 0;
const utils_1 = __webpack_require__(2);
const gm_http_1 = __webpack_require__(22);
class SoGouProvider {
constructor() {
this.test = /www\.sogou\.com\/link\?url=/;
}
resolve(aElement) {
return __awaiter(this, void 0, void 0, function* () {
try {
if (
(0, utils_1.getRedirect)(aElement) <= 2 &&
this.test.test(aElement.href)
) {
(0, utils_1.increaseRedirect)(aElement);
const res = yield gm_http_1.default.request({
url: aElement.href,
method: "GET",
anonymous: true,
});
(0, utils_1.decreaseRedirect)(aElement);
const finalUrl = res.finalUrl;
if (finalUrl && !this.test.test(finalUrl)) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
} else {
const matcher =
res.responseText.match(/URL=['"]([^'"]+)['"]/);
if (
matcher === null || matcher === void 0 ? void 0 : matcher[1]
) {
(0, utils_1.antiRedirect)(aElement, res.finalUrl);
}
}
}
} catch (err) {
(0, utils_1.decreaseRedirect)(aElement);
// console.error(err);
}
});
}
parsePage(res) {
const responseText = res.responseText.replace(
/(src=[^>]*|link=[^>])/g,
""
);
const html = document.createElement("html");
html.innerHTML = responseText;
// let selector = '#main .results div.vrwrap>h3';
// let selector = '#main .results h3>a';
const selector = '#main .results a[href*="www.sogou.com/link?url="]';
const remotes = [].slice.call(
html.querySelectorAll("#main .results a[href]")
);
const locals = [].slice.call(document.querySelectorAll(selector));
for (const localEle of locals) {
for (const remoteEle of remotes) {
let localText = (0, utils_1.getText)(localEle);
let remoteText = (0, utils_1.getText)(remoteEle);
// 通用按钮,例如【点击下载】
if (localEle.classList.contains("str-public-btn")) {
localText = (0, utils_1.getText)(localEle.parentNode);
remoteText = (0, utils_1.getText)(remoteEle.parentNode);
} else if (localEle.classList.contains("str_img")) {
// 图片
localText = (0, utils_1.getText)(
localEle.parentNode.parentNode
);
remoteText = (0, utils_1.getText)(
remoteEle.parentNode.parentNode
);
}
if (!localText || localText !== remoteText) {
return;
}
(0, utils_1.antiRedirect)(localEle, remoteEle.href);
}
}
}
onInit() {
return __awaiter(this, void 0, void 0, function* () {
if (!/www\.sogou\.com\/web/.test(window.top.location.href)) {
return;
}
const query = (0, utils_1.queryParser)(window.top.location.search);
// 搜索使用http搜索,得到的是直接链接
const url = `${location.protocol
.replace(/:$/, "")
.replace("s", "")}://${
location.host + location.pathname + query
}`;
gm_http_1.default
.get(url)
.then((res) => {
this.parsePage(res);
})
.catch((err) => {
// console.error(err);
});
return this;
});
}
}
exports.SoGouProvider = SoGouProvider;
/***/
},
/* 35 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YoutubeProvider = void 0;
const utils_1 = __webpack_require__(2);
class YoutubeProvider {
constructor() {
this.test = /www\.youtube\.com\/redirect\?.{1,}/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("q")
);
}
}
exports.YoutubeProvider = YoutubeProvider;
/***/
},
/* 36 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZhihuProvider = void 0;
const utils_1 = __webpack_require__(2);
class ZhihuProvider {
constructor() {
this.test = /zhihu\.com\/\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.ZhihuProvider = ZhihuProvider;
/***/
},
/* 37 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaiduXueshuProvider = void 0;
const utils_1 = __webpack_require__(2);
class BaiduXueshuProvider {
constructor() {
this.test = /xueshu\.baidu\.com\/s?\?(.*)/; // 此处无用
}
resolve(aElement) {
const realHref =
aElement.getAttribute("data-link") ||
aElement.getAttribute("data-url");
if (realHref) {
(0, utils_1.antiRedirect)(aElement, decodeURIComponent(realHref));
}
}
}
exports.BaiduXueshuProvider = BaiduXueshuProvider;
/***/
},
/* 38 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZhihuZhuanlanProvider = void 0;
const utils_1 = __webpack_require__(2);
class ZhihuZhuanlanProvider {
constructor() {
this.test = /link\.zhihu\.com\/\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.ZhihuZhuanlanProvider = ZhihuZhuanlanProvider;
/***/
},
/* 39 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogonewsProvider = void 0;
const utils_1 = __webpack_require__(2);
class LogonewsProvider {
constructor() {
this.test = /link\.logonews\.cn\/\?url=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("url")
);
}
}
exports.LogonewsProvider = LogonewsProvider;
/***/
},
/* 40 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AfDianNetProvider = void 0;
const utils_1 = __webpack_require__(2);
class AfDianNetProvider {
constructor() {
this.test = /afdian\.net\/link\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.AfDianNetProvider = AfDianNetProvider;
/***/
},
/* 41 */
/***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Blog51CTO = void 0;
class Blog51CTO {
constructor() {
this.test = true;
}
resolve(aElement) {
var _a;
this.container = document.querySelector(".article-detail");
if (
(_a = this.container) === null || _a === void 0
? void 0
: _a.contains(aElement)
) {
if (!aElement.onclick && aElement.href) {
aElement.onclick = function antiRedirectOnClickFn(e) {
e.stopPropagation();
e.preventDefault();
e.stopImmediatePropagation();
const $a = document.createElement("a");
$a.href = aElement.href;
$a.target = aElement.target;
$a.click();
};
}
}
}
}
exports.Blog51CTO = Blog51CTO;
/***/
},
/* 42 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InfoQProvider = void 0;
const utils_1 = __webpack_require__(2);
class InfoQProvider {
constructor() {
this.test = /infoq\.cn\/link\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.InfoQProvider = InfoQProvider;
/***/
},
/* 43 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GiteeProvider = void 0;
const utils_1 = __webpack_require__(2);
class GiteeProvider {
constructor() {
this.test = /gitee\.com\/link\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.GiteeProvider = GiteeProvider;
/***/
},
/* 44 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SSPaiProvider = void 0;
const utils_1 = __webpack_require__(2);
class SSPaiProvider {
constructor() {
this.test = /sspai\.com\/link\?target=(.*)/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
new URL(aElement.href).searchParams.get("target")
);
}
}
exports.SSPaiProvider = SSPaiProvider;
/***/
},
/* 45 */
/***/ (__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BingProvider = void 0;
const utils_1 = __webpack_require__(2);
const textDecoder = new TextDecoder();
class BingProvider {
constructor() {
this.test = /.+\.bing\.com\/ck\/a\?.*&u=a1(.*).*&ntb=1/;
}
resolve(aElement) {
(0, utils_1.antiRedirect)(
aElement,
textDecoder.decode(
Uint8Array.from(
atob(
aElement.href
.split("&u=a1")[1]
.split("&ntb=1")[0]
.replace(/[-_]/g, (e) => ("-" == e ? "+" : "/"))
.replace(/[^A-Za-z0-9\\+\\/]/g, "")
)
.split("")
.map((e) => e.charCodeAt(0))
)
)
);
}
}
exports.BingProvider = BingProvider;
},
/******/
];
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/
}
/******/ // Create a new module (and put it into the cache)
/******/ var module = (__webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {},
/******/
});
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(
module.exports,
module,
module.exports,
__webpack_require__
);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/
}
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for (var key in definition) {
/******/ if (
__webpack_require__.o(definition, key) &&
!__webpack_require__.o(exports, key)
) {
/******/ Object.defineProperty(exports, key, {
enumerable: true,
get: definition[key],
});
/******/
}
/******/
}
/******/
};
/******/
})();
/******/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function () {
/******/ if (typeof globalThis === "object") return globalThis;
/******/ try {
/******/ return this || new Function("return this")();
/******/
} catch (e) {
/******/ if (typeof window === "object") return window;
/******/
}
/******/
})();
/******/
})();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) =>
Object.prototype.hasOwnProperty.call(obj, prop);
/******/
})();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, {
value: "Module",
});
/******/
}
/******/ Object.defineProperty(exports, "__esModule", { value: true });
/******/
};
/******/
})();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
var exports = __webpack_exports__;
Object.defineProperty(exports, "__esModule", { value: true });
const app_1 = __webpack_require__(1);
const _51_ruyo_net_1 = __webpack_require__(5);
const addons_mozilla_org_1 = __webpack_require__(6);
const app_yinxiang_com_1 = __webpack_require__(7);
const blog_csdn_net_1 = __webpack_require__(8);
const oschina_com_1 = __webpack_require__(9);
const daily_zhihu_com_1 = __webpack_require__(10);
const docs_google_com_1 = __webpack_require__(11);
const getpocket_com_1 = __webpack_require__(12);
const gmail_google_com_1 = __webpack_require__(13);
const juejin_com_1 = __webpack_require__(14);
const mail_qq_com_1 = __webpack_require__(15);
const mijisou_com_1 = __webpack_require__(16);
const play_google_com_1 = __webpack_require__(17);
const steamcommunity_com_1 = __webpack_require__(18);
const tieba_baidu_com_1 = __webpack_require__(19);
const twitter_com_1 = __webpack_require__(20);
const video_baidu_com_1 = __webpack_require__(21);
const weibo_com_1 = __webpack_require__(23);
const www_baidu_com_1 = __webpack_require__(24);
const www_dogedoge_com_1 = __webpack_require__(29);
const www_douban_com_1 = __webpack_require__(30);
const www_google_com_1 = __webpack_require__(31);
const www_jianshu_com_1 = __webpack_require__(32);
const www_so_com_1 = __webpack_require__(33);
const www_sogou_com_1 = __webpack_require__(34);
const www_youtube_com_1 = __webpack_require__(35);
const www_zhihu_com_1 = __webpack_require__(36);
const xueshu_baidu_com_1 = __webpack_require__(37);
const zhuanlan_zhihu_com_1 = __webpack_require__(38);
const www_logonews_cn_1 = __webpack_require__(39);
const afadian_net_1 = __webpack_require__(40);
const blog_51cto_com_1 = __webpack_require__(41);
const infoq_cn_1 = __webpack_require__(42);
const gitee_com_1 = __webpack_require__(43);
const sspai_com_1 = __webpack_require__(44);
const bing_com_1 = __webpack_require__(45);
const gm_http_1 = __webpack_require__(22);
const app = new app_1.App();
const isDebug = "production" !== "production";
gm_http_1.default.setConfig({ debug: isDebug });
app
.setConfig({ isDebug })
.registerProvider([
{
// 测试地址: https://www.zhihu.com/question/25258775
name: "知乎",
test: /www\.zhihu\.com/,
provider: www_zhihu_com_1.ZhihuProvider,
},
{
// 测试地址: https://zhuanlan.zhihu.com/p/20549978
name: "知乎专栏",
test: /zhuanlan\.zhihu\.com/,
provider: zhuanlan_zhihu_com_1.ZhihuZhuanlanProvider,
},
{
// 测试地址:
name: "知乎日报",
test: /daily\.zhihu\.com/,
provider: daily_zhihu_com_1.ZhihuDailyProvider,
},
{
name: "Google搜索",
test: /\w+\.google\./,
provider: www_google_com_1.GoogleProvider,
},
{
// 测试地址: https://docs.google.com/spreadsheets/d/1TFcEXMcKrwoIAECIVyBU0GPoSmRqZ7A0VBvqeKYVSww/htmlview
name: "Google Docs",
test: /docs\.google\.com/,
provider: docs_google_com_1.GoogleDocsProvider,
},
{
name: "Gmail",
test: /mail\.google\.com/,
provider: gmail_google_com_1.GmailProvider,
},
{
// 测试地址: https://play.google.com/store/movies/details/%E7%A7%BB%E5%8B%95%E8%BF%B7%E5%AE%AE_%E6%AD%BB%E4%BA%A1%E8%A7%A3%E8%97%A5?id=YNy7gRqwtMk
name: "Google Play",
test: /play\.google\.com/,
provider: play_google_com_1.GooglePlayProvider,
},
{
// 测试地址: https://www.youtube.com/watch?v=XTXSRRSv1bY
name: "Google Youtube",
test: /www\.youtube\.com/,
provider: www_youtube_com_1.YoutubeProvider,
},
{
// 测试地址: https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&q=chrome
name: "360搜索",
test: /www\.so\.com/,
provider: www_so_com_1.SoProvider,
},
{
name: "新浪微博",
test: /\.weibo\.com/,
provider: weibo_com_1.WeboProvider,
},
// 测试: https://twitter.com/ftium4/status/1512815116810522631
{
name: "Twitter",
test: /twitter\.com/,
provider: twitter_com_1.TwitterProvider,
},
{
// 测试: http://www.sogou.com/web?query=chrome&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1527&sst0=1504347367611&lkt=0%2C0%2C0&sugsuv=00091651B48CA45F593B61A29B131405&sugtime=1504347367611
name: "搜狗搜索",
test: /www\.sogou\.com/,
provider: www_sogou_com_1.SoGouProvider,
},
{
// 测试: https://www.baidu.com/s?wd=chrome&rsv_spt=1&rsv_iqid=0xcb136237000ed40e&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baidulocal&rsv_enter=1&rsv_sug3=7&rsv_sug1=7&rsv_sug7=101&rsv_sug2=0&inputT=813&rsv_sug4=989×tamp=1504349229266&rn=50&vf_bl=1
name: "百度搜索",
test: /www\.baidu\.com/,
provider: www_baidu_com_1.BaiduProvider,
},
{
// 测试: https://www.baidu.com/s?wd=chrome&pn=20&oq=chrome&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=2&rsv_pq=e043900d0000752d&rsv_t=6bb0UqEwp2Tle6TAMBDlU3Wg%2BSxoqvvOhZKyQgM%2BVQP8Gc54QZLhcDcj62eGfNG75aq5&rsv_page=1
name: "百度视频",
test: /v\.baidu\.com/,
provider: video_baidu_com_1.BaiduVideoProvider,
},
{
// 测试: http://xueshu.baidu.com/s?wd=paperuri%3A%28ae4d6b5da05eca552dab05aeefb966e6%29&ie=utf-8&filter=sc_long_sign&sc_ks_para=q%3D%E2%80%9C%E4%BA%92%E8%81%94%E7%BD%91%2B%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E2%80%9D%E6%A8%A1%E5%BC%8F%E6%8E%A2%E8%AE%A8%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8&tn=SE_baiduxueshu_c1gjeupa
name: "百度学术",
test: /xueshu\.baidu\.com/,
provider: xueshu_baidu_com_1.BaiduXueshuProvider,
},
{
// 测试地址: http://tieba.baidu.com/p/5300844180
name: "百度贴吧",
test: /tieba\.baidu\.com/,
provider: tieba_baidu_com_1.TiebaProvider,
},
{
// 测试地址: https://juejin.im/entry/59ac8fa551882524241a8802?utm_source=gold_browser_extension
name: "掘金",
test: /juejin\.(im|cn)/,
provider: juejin_com_1.JuejinProvider,
},
{
name: "QQ邮箱",
test: /mail\.qq\.com/,
provider: mail_qq_com_1.QQMailProvider,
},
{
// 测试地址: https://addons.mozilla.org/zh-CN/firefox/addon/evernote-web-clipper/
name: "Mozilla",
test: /addons\.mozilla\.org/,
provider: addons_mozilla_org_1.MozillaProvider,
},
{
// 测试地址: https://www.jianshu.com/p/979776ca44b8
// https://www.jianshu.com/p/fc8abc65bbb2
name: "简书",
test: /www\.jianshu\.com/,
provider: www_jianshu_com_1.JianShuProvider,
},
{
// 测试地址: https://www.douban.com/doulist/240962/
// 测试地址: https://www.douban.com/search?cat=1002&q=%E9%BB%91%E9%95%9C
name: "豆瓣",
test: /douban\.com/,
provider: www_douban_com_1.DouBanProvider,
},
{
// 测试地址: https://getpocket.com/a/recommended/
// 需要登陆
name: "Pocket",
test: /getpocket\.com/,
provider: getpocket_com_1.PocketProvider,
},
{
// 测试地址: https://www.dogedoge.com/results?q=chrome
name: "DogeDoge",
test: /www\.dogedoge\.com/,
provider: www_dogedoge_com_1.DogeDogeProvider,
},
{
// 测试地址: https://51.ruyo.net/15053.html
name: "Ruyo",
test: /51\.ruyo\.net/,
provider: _51_ruyo_net_1.RuyoProvider,
},
{
// 测试地址: https://steamcommunity.com/sharedfiles/filedetails/?id=1311535531
name: "Steam",
test: /steamcommunity\.com/,
provider: steamcommunity_com_1.SteamProvider,
},
{
// 测试地址: https://mijisou.com/?q=chrome&category_general=on&time_range=&language=zh-CN&pageno=1
name: "秘迹",
test: /mijisou\.com/,
provider: mijisou_com_1.MiJiProvider,
},
{
// 测试地址: https://github.com/axetroy/anti-redirect/issues/350
name: "CSDN",
test: /blog\.csdn\.net/,
provider: blog_csdn_net_1.CSDNProvider,
},
{
// 测试地址:https://my.oschina.net/chipo/blog/3067672
name: "OS China",
test: /oschina\.net/,
provider: oschina_com_1.OSChinaProvider,
},
{
// 测试地址: https://github.com/axetroy/anti-redirect/issues/350
name: "印象笔记",
test: /app\.yinxiang\.com/,
provider: app_yinxiang_com_1.YinXiangProvider,
},
{
// 测试地址: https://www.logonews.cn/2021073002420141.html
name: "标志情报局",
test: /www\.logonews\.cn/,
provider: www_logonews_cn_1.LogonewsProvider,
},
{
// 测试地址: https://afdian.net/a/xiaofanEric
name: "爱发电",
test: /afdian\.net/,
provider: afadian_net_1.AfDianNetProvider,
},
{
// 测试地址: https://blog.51cto.com/u_11512826/2068421
name: "51CTO博客",
test: /blog\.51cto\.com/,
provider: blog_51cto_com_1.Blog51CTO,
},
{
// 测试地址: https://xie.infoq.cn/link?target=https%3A%2F%2Fwww.finclip.com%2F%3Fchannel%3Dinfoqseo
name: "InfoQ",
test: /infoq\.cn/,
provider: infoq_cn_1.InfoQProvider,
},
{
// 测试地址: https://gitee.com/Tencent/ncnn
name: "Gitee",
test: /gitee.com/,
provider: gitee_com_1.GiteeProvider,
},
{
// 测试地址: https://sspai.com/post/77499
name: "少数派",
test: /sspai\.com/,
provider: sspai_com_1.SSPaiProvider,
},
{
// 测试地址: https://www.bing.com/search?q=helloworld
name: "Bing",
test: /bing\.com/,
provider: bing_com_1.BingProvider,
},
])
.bootstrap();
})();
/******/
})();