// ==UserScript== // @name 跳转链接修复(移除重定向外链直达) // @description 修复跳转链接为站外直链(移除重定向),免去拦截页面点击步骤可直达站外;拦截页面自动跳转;已适配爱发电、百度、CSDN、豆瓣、码云、花瓣网、简书、掘金、力扣(Leetcode)、51CTO 博客、牛客网、开源中国、pixiv、微信、微信开放社区、QQ 邮箱、PC 版 QQ、腾讯文档、360 搜索、少数派、腾讯云开发者社区、微博、YouTube、语雀、知乎、知乎专栏 // @namespace maomao1996.remove-redirect // @version 2.0.0 // @author maomao1996 // @homepage https://github.com/maomao1996/tampermonkey-scripts // @supportURL https://github.com/maomao1996/tampermonkey-scripts/issues // @license MIT // @match *://*/* // @grant none // @downloadURL none // ==/UserScript== (function() { "use strict"; var r = Array.isArray; var isFunction = function(r) { return typeof r === "function"; }; var isString = function(r) { return typeof r === "string"; }; var t = location.hostname.replace(/^www\./, ""); function validateUrl(r) { if (!isString("string")) return false; try { new URL(r); return true; } catch (r) { return false; } } var e = location.pathname; var o = [ [ "51CTO \u535a\u5ba2", "blog.51cto.com", { autojump: { validator: function() { return e === "/transfer"; }, separator: "?" } } ] ]; var a = [ [ "\u7231\u53d1\u7535", "afdian.net", { transform: { selector: '[href*="afdian.net/link?target="]' }, autojump: { validator: function() { return e === "/link"; } } } ] ]; var n = [ [ "\u767e\u5ea6", "baidu.com", { transform: { selector: "#content_left > [mu]", customTransform: function customTransform(r) { var t = r.getAttribute("mu"); if (validateUrl(t) && !t.includes(".baidu.com")) r.querySelectorAll("a[href]").forEach((function(r) { return r.setAttribute("href", t); })); } } } ] ]; var u = [ [ "CSDN", "link.csdn.net", { autojump: {} } ] ]; var i = [ [ "\u8c46\u74e3", "douban.com", { autojump: { validator: function() { return e === "/link2/"; }, queryName: "url" } } ] ]; var l = [ [ "\u7801\u4e91", "gitee.com", { transform: { selector: '[href*="gitee.com/link?target="]' }, autojump: { validator: function() { return e === "/link"; } } } ] ]; var c = [ [ "\u82b1\u74e3\u7f51", "huaban.com", { autojump: { validator: function() { return e === "/go"; }, selector: ".wrapper button.ant-btn" } } ] ]; var m = [ [ "\u7b80\u4e66", "jianshu.com", { transform: { selector: '[href*="links.jianshu.com/go?to="]', separator: "go?to=" }, autojump: { validator: function() { return e === "/go-wild"; }, queryName: "url" } } ] ]; var f = [ [ "\u6398\u91d1", "juejin.cn", { transform: { selector: '[href*="link.juejin.cn?target="]' } } ], [ , "link.juejin.cn", { autojump: {} } ] ]; var s = [ [ "\u529b\u6263\uff08Leetcode\uff09", "leetcode.cn", { transform: { selector: '[href*="/link/?target="]' } } ] ]; var d = [ [ "\u725b\u5ba2\u7f51", "nowcoder.com", { transform: { selector: [ '[href*="gw-c.nowcoder.com/api/sparta/jump/link?link="]', '[href*="hd.nowcoder.com/link.html?target="]' ].join(","), separator: /\?target|link\=/ } } ], [ , "hd.nowcoder.com", { autojump: {} } ] ]; var v = [ [ "\u5f00\u6e90\u4e2d\u56fd", /^(?:my\.)?oschina\.net$/, { transform: { selector: '[href*="oschina.net/action/GoToLink?url="]', separator: "GoToLink?url=" }, autojump: { validator: function() { return e === "/action/GoToLink"; }, queryName: "url" } } ] ]; var p = [ [ "pixiv", "pixiv.net", { transform: { selector: '[href*="/jump.php?"]', separator: "?" }, autojump: { validator: function() { return e === "/jump.php"; }, selector: "a[href]", separator: "?" } } ] ]; var h = [ [ "\u5fae\u4fe1", "weixin110.qq.com", { autojump: { validator: function() { return e === "/cgi-bin/mmspamsupport-bin/newredirectconfirmcgi"; }, getOriginalUrl: function() { return document.querySelector(".weui-msg p.weui-msg__desc").textContent; }, selector: "a.weui-btn.weui-btn_default" } } ], [ "\u5fae\u4fe1\u5f00\u653e\u793e\u533a", "developers.weixin.qq.com", { autojump: { validator: function() { return e === "/community/middlepage/href"; }, queryName: "href" } } ], [ "QQ \u90ae\u7bb1", "mail.qq.com", { autojump: { validator: function() { return e === "/cgi-bin/readtemplate"; }, selector: "div.c-footer a.c-footer-a1", queryName: "gourl" } } ], [ "PC \u7248 QQ", "c.pc.qq.com", { autojump: { validator: function() { return e === "/middlem.html"; }, queryName: "pfurl" } } ], [ "\u817e\u8baf\u6587\u6863", "docs.qq.com", { autojump: { validator: function() { return e === "/scenario/link.html"; }, queryName: "url" } } ] ]; var y = [ [ "360 \u641c\u7d22", "so.com", { transform: { selector: 'a[href*="so.com/link?"][data-mdurl]', customTransform: function customTransform(r) { var t = r.getAttribute("data-mdurl"); if (validateUrl(t)) r.setAttribute("href", t); } } } ] ]; var _ = [ [ "\u5c11\u6570\u6d3e", "sspai.com", { transform: { selector: '[href*="sspai.com/link?target="]' }, autojump: { validator: function() { return e === "/link"; } } } ] ]; var b = [ [ "\u817e\u8baf\u4e91\u5f00\u53d1\u8005\u793e\u533a", "cloud.tencent.com", { transform: { selector: '[href*="/developer/tools/blog-entry?target="]' }, autojump: { validator: function() { return e === "/developer/tools/blog-entry"; } } } ] ]; var g = [ [ "\u5fae\u535a", "weibo.com", { transform: { selector: '[href*="weibo.cn/sinaurl?u="]', queryName: "u" } } ], [ , "weibo.cn", { autojump: { validator: function() { return e === "/sinaurl"; }, queryName: "u" } } ] ]; var j = [ [ "YouTube", "youtube.com", { transform: { selector: '[href*="youtube.com/redirect?event="]', queryName: "q" } } ] ]; var q = [ [ "\u8bed\u96c0", "yuque.com", { autojump: { validator: function() { return e === "/r/goto"; }, queryName: "url" } } ] ]; var w = [ [ "\u77e5\u4e4e\u3001\u77e5\u4e4e\u4e13\u680f", /^(?:zhuanlan\.)?zhihu\.com$/, { transform: { selector: '[href*="link.zhihu.com/?target="]' } } ], [ , "link.zhihu.com", { autojump: {} } ] ]; var k = Object.freeze({ __proto__: null, afdianNet: a, baiduCom: n, csdnNet: u, doubanCom: i, giteeCom: l, huabanCom: c, jianshuCom: m, juejinCn: f, leetcodeCn: s, m_51CtoCom: o, nowcoderCom: d, oschinaNet: v, pixivNet: p, qqCom: h, soCom: y, sspaiCom: _, tencentCom: b, weiboCom: g, youtubeCom: j, yuqueCom: q, zhihuCom: w }); function _array_like_to_array(r, t) { if (t == null || t > r.length) t = r.length; for (var e = 0, o = new Array(t); e < t; e++) o[e] = r[e]; return o; } function _array_with_holes(r) { if (Array.isArray(r)) return r; } function _iterable_to_array_limit(r, t) { var e = r == null ? null : typeof Symbol !== "undefined" && r[Symbol.iterator] || r["@@iterator"]; if (e == null) return; var o = []; var a = true; var n = false; var u, i; try { for (e = e.call(r); !(a = (u = e.next()).done); a = true) { o.push(u.value); if (t && o.length === t) break; } } catch (r) { n = true; i = r; } finally { try { if (!a && e["return"] != null) e["return"](); } finally { if (n) throw i; } } return o; } function _non_iterable_rest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _sliced_to_array(r, t) { return _array_with_holes(r) || _iterable_to_array_limit(r, t) || _unsupported_iterable_to_array(r, t) || _non_iterable_rest(); } function _unsupported_iterable_to_array(r, t) { if (!r) return; if (typeof r === "string") return _array_like_to_array(r, t); var e = Object.prototype.toString.call(r).slice(8, -1); if (e === "Object" && r.constructor) e = r.constructor.name; if (e === "Map" || e === "Set") return Array.from(e); if (e === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)) return _array_like_to_array(r, t); } var C = Object.values(k).flat(); var N = C.find((function(r) { var e = _sliced_to_array(r, 2), o = e[1]; if (isString(o)) return o === t; return o.test(t); })); if (r(N)) { var A = N[2], U = A.transform, S = A.autojump; if (U) { var T = U.selector, L = U.queryName, O = U.separator, x = O === void 0 ? "?target=" : O, z = U.customTransform, I = z === void 0 ? function(r) { var t = L ? new URL(r.href).searchParams.get(L) : r.href.split(x)[1]; if (t) r.href = decodeURIComponent(t); } : z; var R = new MutationObserver((function() { document.querySelectorAll(T).forEach(I); })); R.observe(document.body, { childList: true, subtree: true }); } if (S) (function() { var r; var t = S.validator, e = S.getOriginalUrl, o = S.selector, a = S.separator, n = S.queryName, u = n === void 0 ? "target" : n; if (t && !t()) return; if (isFunction(e)) { var i = e(); if (i && validateUrl(i)) return location.replace(i); } if (o && document.querySelector(o)) return document.querySelector(o).click(); var l = location.search; var c = decodeURIComponent(a ? (r = l.split(a)) === null || r === void 0 ? void 0 : r[1] : new URLSearchParams(l).get(u) || ""); validateUrl(c) && location.replace(c); })(); } })();