open the link directly

点击链接直接跳转

当前为 2022-03-27 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name open the link directly
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.0
  5. // @description 点击链接直接跳转
  6. // @author nediiii
  7. // @match *://*.csdn.net/*
  8. // @match *://*.gitee.com/*
  9. // @match *://*.uisdc.com/*
  10. // @match *://*.logonews.cn/*
  11. // @match *://*.afdian.net/*
  12. // @match *://*.tianyancha.com/*
  13. // @match *://*.oschina.net/*
  14. // @match *://*.pixiv.net/*
  15. // @match *://*.jianshu.com/*
  16. // @match *://*.juejin.cn/*
  17. // @match *://*.weibo.cn/*
  18. // @match *://*.yuque.com/*
  19. // @match *://*.segmentfault.com/*
  20. // @match *://*.zhihu.com/*
  21. // @license GPLv3 License
  22. // @icon https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
  23. // @grant GM_xmlhttpRequest
  24. // ==/UserScript==
  25.  
  26. (function () {
  27. 'use strict';
  28.  
  29. const urlReg = /\bhttps?:\/\/\S+/gi;
  30.  
  31. const weiboResolver = async (href) => {
  32. return new Promise((resolve, reject) => {
  33. GM_xmlhttpRequest({
  34. method: "GET",
  35. url: href,
  36. onload: function (response) {
  37. console.log({ response });
  38. if (response.status == 200) {
  39. let doc = new DOMParser().parseFromString(response.responseText, "text/html");
  40. let node = doc.querySelector('body > div > div:nth-child(2)');
  41. let str = node.innerText;
  42. console.log({ doc });
  43. console.log({ node });
  44. console.log({ str });
  45.  
  46. let realURI = href;
  47. var extractURL = str.match(urlReg);
  48. console.log({ extractURL });
  49. if (extractURL) {
  50. realURI = extractURL[0];
  51. }
  52. resolve(realURI)
  53. } else {
  54. reject(href)
  55. }
  56. },
  57. onerror: function (error) {
  58. console.log({ error });
  59. reject(href)
  60. }
  61. });
  62. });
  63. }
  64.  
  65. const segfaultResolver = async (href) => {
  66. return new Promise((resolve, reject) => {
  67. GM_xmlhttpRequest({
  68. method: "GET",
  69. url: href,
  70. onload: function (response) {
  71. console.log({ response });
  72. if (response.status == 200) {
  73. let doc = new DOMParser().parseFromString(response.responseText, "text/html");
  74. let node = doc.querySelector('body > p')
  75. let str = node.innerText;
  76. console.log({ doc });
  77. console.log({ node });
  78. console.log({ str });
  79.  
  80. let realURI = href;
  81. var extractURL = str.match(urlReg);
  82. console.log({ extractURL });
  83. if (extractURL) {
  84. realURI = extractURL[0];
  85. }
  86. resolve(realURI)
  87. } else {
  88. reject(href)
  89. }
  90. },
  91. onerror: function (error) {
  92. console.log({ error });
  93. reject(href)
  94. }
  95. });
  96. });
  97. }
  98.  
  99. const patter_match = {
  100.  
  101. // 注意这里的pattern需要去看对应网站dom里的a标签的实际herf值, console也会打印日志, 可以自己添加正则来增加网站支持
  102. // https://link.zhihu.com/?target=https%3A//greasyfork.org/en/scripts/5029-yet-another-%25E8%2587%25AA%25E5%258F%25A4cb%25E5%2587%25BA%25E8%25AF%2584%25E8%25AE%25BA-sharing-plugin
  103. zhihu: { pattern: /https?:\/\/link\.zhihu\.com\/?\?target=(.+)$/ },
  104. // https://www.jianshu.com/go-wild?ac=2&url=https%3A%2F%2Fnpm.taobao.org%2Fmirrors%2Felectron
  105. jianshu: { pattern: /https?:\/\/www\.jianshu\.com\/go-wild\?.*url=(.+)$/ },
  106. // https://links.jianshu.com/go?to=https%3A%2F%2Fnpm.taobao.org%2Fmirrors%2Felectron
  107. jianshu2: { pattern: /https?:\/\/links\.jianshu\.com\/go\?to=(.+)$/ },
  108. // href="https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.aliyun.com%2Fgroup%2Falisoftwaretech%2F"
  109. juejin: { pattern: /https?:\/\/link\.juejin\.cn\/?\?target=(.+)$/ },
  110.  
  111. // https://gitee.com/meetqy/acss-dnd
  112. // href="https://gitee.com/link?target=https%3A%2F%2Fcuyang.me%2Facss-dnd%2F"
  113. gitee: { pattern: /https?:\/\/gitee\.com\/link\?target=(.+)$/ },
  114.  
  115. // https://www.uisdc.com/build-b-end-grid-system
  116. // https://link.uisdc.com/?redirect=https%3A%2F%2Fuxdesign.cc%2Fresponsive-grids-and-how-to-actually-use-them-970de4c16e01
  117. uisdc: { pattern: /https?:\/\/link\.uisdc\.com\/?\?redirect=(.+)$/ },
  118.  
  119. // https://www.logonews.cn/apple-sues-sex-topic-blog-for-logo-infringement.html
  120. // https://link.logonews.cn/?url=http://aasd.k12.wi.us/district
  121. logonews: { pattern: /https?:\/\/link\.logonews\.cn\/?\?url=(.+)$/ },
  122.  
  123. // https://afdian.net/@AdventCirno
  124. // https://afdian.net/link?target=https%3A%2F%2Fwww.patreon.com%2Fuser%3Fu%3D6139561
  125. afdian: { pattern: /https?:\/\/afdian\.net\/link\?target=(.+)$/ },
  126.  
  127. // https://www.tianyancha.com/company/28723141
  128. // https://www.tianyancha.com/security?target=https%3A%2F%2Fss.knet.cn%2Fverifyseal.dll%3Fsn%3De18042711010873571xsuv000000%26pa%3D111332
  129. tianyancha: { pattern: /https?:\/\/www\.tianyancha\.com\/security\?target=(.+)$/ },
  130.  
  131. // https://www.pixiv.net/users/25237
  132. // href="/jump.php?url=https%3A%2F%2Ftwitter.com%2Fomiya_io"
  133. // href="/jump.php?https%3A%2F%2Finstagram.com%2Fsnatti89%2F"
  134. pixiv: { pattern: /\/jump\.php\?(?:url=)?(.+)$/ },
  135.  
  136. // https://my.oschina.net/androiddevs/blog/5496556
  137. // https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fmp.weixin.qq.com%2Fmp%2Fappmsgalbum%3F__biz%3DMzk0NDIwMTExNw%3D%3D%26action%3Dgetalbum%26album_id%3D1879128471667326981%23wechat_redirect
  138. // href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fmp.weixin.qq.com%2Fmp%2Fappmsgalbum%3F__biz%3DMzk0NDIwMTExNw%3D%3D%26action%3Dgetalbum%26album_id%3D1879128471667326981%23wechat_redirect"
  139. oschina: { pattern: /https?:\/\/www\.oschina\.net\/action\/GoToLink\?url=(.+)$/ },
  140.  
  141. // https://weibo.cn/sinaurl?u=https%3A%2F%2Fwww.freebsd.org%2F
  142. // https://weibo.cn/sinaurl?toasturl=https%3A%2F%2Ftime.geekbang.org%2F
  143. // https://weibo.cn/sinaurl?luicode=10000011&lfid=230259&u=http%3A%2F%2Ft.cn%2FA6qHeVlf
  144. // https://weibo.cn/sinaurl?f=w&u=http%3A%2F%2Ft.cn%2FA66XY2gI&ep=LlAsNz3HD%2C1683963007%2CLlpkandl6%2C7276218544
  145. // href="https://weibo.cn/sinaurl?f=w&u=http%3A%2F%2Ft.cn%2FA66XY2gI&ep=LlAsNz3HD%2C1683963007%2CLlpkandl6%2C7276218544"
  146. weibo: { pattern: /https?:\/\/weibo\.cn\/sinaurl\?f=w&u=(.+)$/, resolver: weiboResolver },
  147.  
  148. // segmentfault对链接进行加密处理, 不知道如何decode, 所以只能写一个函数去单独处理
  149. // https://link.segmentfault.com/?enc=LZyRulLABKpXOHl2vbA%2F4w%3D%3D.MWhFMvjhyBk1ReIRoGxyxa0VxGtg%2Foyk0DMtfzZTJoKbsgoJFtGCPHe8%2BZ1HbRdcvNsGaVfll9oGQXLsZCHK7w%3D%3D
  150. segfault: { pattern: /https?:\/\/link\.segmentfault\.com\/?\?enc=(.+)$/, resolver: segfaultResolver }
  151.  
  152. // 以下网站a标签的herf未修改, 推测是js做的弹窗, 所以不需要匹配, 也匹配不出来
  153. // csdn https://link.csdn.net/?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FJavaScript%2FReference%2FGlobal_Objects%2FRegExp
  154. // 语雀 https://www.yuque.com/r/goto?url=https%3A%2F%2Fwww.canva.cn%2F
  155. }
  156.  
  157. const resolveRealURI = async (href) => {
  158. const fallbackURI = href;
  159.  
  160. for (let i in patter_match) {
  161. const matcher = href.match(patter_match[i].pattern);
  162. if (!matcher) {
  163. continue;
  164. }
  165. console.log({ matcher });
  166.  
  167. if (patter_match[i].hasOwnProperty('resolver')) {
  168. // complex customize resolver
  169. console.log(patter_match[i].resolver)
  170. let realURI = await patter_match[i].resolver(href);
  171. return realURI;
  172. }
  173.  
  174. const encodeURI = matcher[1];
  175. // simple reg resolver
  176. return decodeURIComponent(encodeURI);
  177. }
  178. return fallbackURI;
  179. }
  180.  
  181. const getHref = (e) => {
  182. let target = e.target;
  183. while (target) {
  184. if (target.tagName.toLowerCase() === 'a' && target.hasAttribute('href')) {
  185. console.log("find element", { target })
  186. return target.getAttribute('href');
  187. }
  188. target = target.parentElement;
  189. }
  190. return null;
  191. }
  192.  
  193. document.addEventListener('click', (e) => {
  194. console.log({ e })
  195. let href = getHref(e);
  196. if (href) {
  197. e.stopPropagation();
  198. e.preventDefault();
  199. resolveRealURI(href).then((realURI) => {
  200. console.log({ realURI })
  201. window.open(realURI);
  202. });
  203. }
  204. }, { capture: true })
  205.  
  206.  
  207. })();