- // ==UserScript==
- // @name 「水水」链接跳转
- // @namespace https://www.wdssmq.com/
- // @version 1.0.0
- // @author 沉冰浮水
- // @description 自动跳过各种链接跳转页面,支持知乎,贴吧,QQ 和 QQ 邮箱等;
- // @license MIT
- // @null ----------------------------
- // @contributionURL https://github.com/wdssmq#%E4%BA%8C%E7%BB%B4%E7%A0%81
- // @contributionAmount 5.93
- // @null ----------------------------
- // @link https://github.com/wdssmq/userscript
- // @link https://afdian.com/@wdssmq
- // @link https://gf.qytechs.cn/zh-CN/users/6865-wdssmq
- // @null ----------------------------
- // @noframes
- // @run-at document-end
- // @match https://jump.bdimg.com/f*
- // @match https://jump2.bdimg.com/f*
- // @match http://jump.bdimg.com/safecheck/index?url=*
- // @match http://jump2.bdimg.com/safecheck/index?url=*
- // @match https://tieba.baidu.com/safecheck/index?url=*
- // @match https://c.pc.qq.com/middlem.html?pfurl=*
- // @match https://mail.qq.com/cgi-bin/readtemplate?t=*
- // @match https://www.jianshu.com/go-wild*
- // @match https://www.v2ex.com/t/*
- // @match https://link.zhihu.com/*
- // @match https://link.juejin.cn/?target=*
- // @grant GM_registerMenuCommand
- // @grant GM_setValue
- // @grant GM_getValue
- // ==/UserScript==
-
- /* eslint-disable */
- /* jshint esversion: 6 */
-
- (function () {
- 'use strict';
-
- const gm_name = "UrlGo";
-
- // 初始常量或函数
- const curUrl = window.location.href;
- const curHost = window.location.host;
-
- // -------------------------------------
-
- const _log = (...args) => console.log(`[${gm_name}]\n`, ...args);
-
- // -------------------------------------
-
- // const $ = window.$ || unsafeWindow.$;
- function $n(e) {
- return document.querySelector(e);
- }
- function $na(e) {
- return document.querySelectorAll(e);
- }
-
- // 指定元素内查找子元素
- function fnFindDom(el, selector) {
- return el.querySelectorAll(selector);
- }
-
- const _config = {
- data: {},
- dataDef: {
- 倒计时: 5,
- },
- menuCommand: () => {
- const _this = _config;
- for (const key in _this.data) {
- if (Object.hasOwnProperty.call(_this.data, key)) {
- GM_registerMenuCommand(`${key}:${_this.data[key]}`, () => {
- const newValue = prompt(`请输入新的${key}值`, _this.data[key]);
- if (newValue !== null) {
- _this.data[key] = newValue;
- GM_setValue("config", _this.data);
- _log(`已将${key}值修改为:${newValue}`);
- }
- });
- }
- }
- },
- load: () => {
- const _this = _config;
- _config.data = GM_getValue("config", _this.dataDef);
- _config.menuCommand();
- },
- };
-
- _config.load();
-
- // 从页面中获取链接
- function fnGetUrlInDOM(selector, attrName) {
- const $dom = $n(selector);
- if ($dom) {
- return $dom[attrName];
- }
- return null;
- }
-
- // 获取链接中的参数
- function fnGetParamInUrl(name, url) {
- const match = RegExp("[?&]" + name + "=(?<value>[^&]*)").exec(url);
- return match && decodeURIComponent(match.groups.value);
- }
-
- // 监测网址是否带有协议
- function fnCheckUrl(url) {
- if (url.indexOf("http") === 0) {
- return url;
- }
- return "http://" + url;
- }
-
- const siteList = [
- {
- name: "百度贴吧",
- hostList: ["jump2.bdimg.com", "tieba.baidu.com"],
- url: fnGetUrlInDOM("p.link", "textContent"),
- tipNode: [$n("p.content"), "after"],
- },
- {
- name: "QQ 客户端",
- hostList: ["c.pc.qq.com"],
- url: fnGetUrlInDOM("#url", "textContent"),
- tipNode: [$n("p.ui-title"), "after"],
- },
- {
- name: "QQ 邮箱",
- hostList: ["mail.qq.com"],
- url: fnGetUrlInDOM(".safety-url", "textContent"),
- tipNode: [$n(".safety-url"), "after"],
- },
- {
- name: "简书",
- hostList: ["www.jianshu.com"],
- url: fnGetParamInUrl("url", curUrl),
- },
- {
- name: "知乎",
- hostList: ["link.zhihu.com"],
- url: fnGetUrlInDOM("p.link", "textContent"),
- },
- {
- name: "掘金",
- hostList: ["link.juejin.cn"],
- url: fnGetParamInUrl("target", curUrl),
- tipNode: [$n("p.title"), "after"],
- },
- ];
-
- // 显示提示
- function fnShowTip(tipNode, text, url) {
- console.log(text);
- const $node = tipNode[0];
- const $insertTips = `<p class="go-tips" style="color: red;text-align: center;">
- <span>${text}</span>
- <a href="${url}" title="点击跳转">点击跳转</a>
- </p>`;
- const $tips = $n(".go-tips");
- // 判断是否已经有提示
- if ($tips) {
- $tips.querySelector("span").textContent = text;
- return;
- }
- switch (tipNode[1]) {
- default:
- case "after":
- $node.insertAdjacentHTML("afterend", $insertTips);
- break;
- }
- }
-
- // 各种中转页跳过
- siteList.forEach((site) => {
- const { name, hostList, url } = site;
- if (hostList.includes(curHost)) {
- if (!url) {
- return;
- }
- const newUrl = fnCheckUrl(url);
- if (site.tipNode) {
- let cntDown = _config.data["倒计时"];
- setInterval(() => {
- if (cntDown <= 0) {
- window.location.href = newUrl;
- return;
- }
- fnShowTip(site.tipNode, `即将跳转到,剩余 ${cntDown} 秒`, newUrl);
- cntDown--;
- }, 1000);
- } else {
- setTimeout(() => {
- window.location.href = newUrl;
- }, 10000);
- }
- }
- });
-
- // 百度贴吧的各种链接统一
- const arrHostList = [
- "jump.bdimg.com",
- "jump2.bdimg.com",
- ];
-
- if (arrHostList.includes(curHost)) {
- const newUrl = window.location.href.replace(curHost, "tieba.baidu.com");
- window.location.href = newUrl;
- }
-
- // 指定元素中的链接增加 target="_blank"
- const config = [
- [".markdown_body", ".reply_content"],
- ];
-
- const fnSetBlank = ($a) => {
- $a.setAttribute("target", "_blank");
- };
-
- config.forEach((e) => {
- const selector = e.join(",");
- const $$container = $na(selector);
- // // print $$container
- // _log($$container);
- // 遍历 $$container
- [].forEach.call($$container, ($el) => {
- const $$a = fnFindDom($el, "a");
- // _log($$a);
- if ($$a.length > 0) {
- [].map.call($$a, fnSetBlank);
- }
- });
- });
-
- })();