重定向链接转直链

将页面内所有重定向式的链接替换为直链

  1. // ==UserScript==
  2. // @name Direct Link
  3. // @name:zh-CN 重定向链接转直链
  4. // @description Replace redirect links with direct links
  5. // @description:zh-CN 将页面内所有重定向式的链接替换为直链
  6. // @namespace https://github.com/cilxe/JavaScriptProjects
  7. // @version 0.2.4
  8. // @author cilxe
  9. // @match *://*.youtube.com/*
  10. // @match *://*.zhihu.com/*
  11. // @match *://*.steampowered.com/*
  12. // @match *://*.steamcommunity.com/*
  13. // @match *://*.pixiv.net/*
  14. // @match *://*.vk.com/*
  15. // @match *://*.hoyolab.com/*
  16. // @match *://*.jianshu.com/*
  17. // @match *://*.juejin.cn/*
  18. // @match *://*.epicgames.com/*
  19. // @match *://*.mozilla.org/*
  20. // @match *://*.firefox.com/*
  21. // @match *://*.leetcode.cn/*
  22. // @match *://*.oschina.net/*
  23. // @match *://*.gitee.com/*
  24. // @match *://*.xda-developers.com/*
  25. // @match *://*.sspai.com/*
  26. // @match *://*.gcores.com/*
  27. // @match *://*.deviantart.com/*
  28. // @match *://union-click.jd.com/*
  29. // @match *://*.tmall.com/*
  30. // @match *://s.click.taobao.com/*
  31. // @match *://s.click.tmall.com/*
  32. // @match *://wiki.biligame.com/*
  33. // @match *://*.linkstars.com/*
  34. // @match *://tieba.baidu.com/*
  35. // @match *://ala.baidu.com/*
  36. // @match *://*.linkedin.com/*
  37. // @match *://*.theverge.com/*
  38. // @match *://*.douban.com/*
  39. // @match *://sourceforge.net/*
  40. // @icon data:image/png;base64,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
  41. // @run-at document-start
  42. // @grant GM_registerMenuCommand
  43. // @grant unsafeWindow
  44. // @sandbox JavaScript
  45. // @license MIT
  46. // ==/UserScript==
  47.  
  48. /*
  49. ## Main features
  50. - Replace redirect links with direct links
  51. - Clean SourceForge tracking links
  52. - Additional features via script menu
  53.  
  54. ## Currently supported sites
  55. - youtube.com
  56. - epicgames.com
  57. - mozilla.org / firefox.com (adjust.com)
  58. - hoyolab.com (adjust.com)
  59. - juejin.cn
  60. - leetcode.cn
  61. - oschina.net
  62. - gitee.com
  63. - xda-developers.com
  64. - sspai.com
  65. - gcores.com
  66. - zhihu.com
  67. - Steam (Store, Hub)
  68. - pixiv.net
  69. - vk.com
  70. - deviantart.com
  71. - tmall.com (goto)
  72. - linkstars.com (Prevent redirection)
  73. - union-click.jd.com (Prevent redirection)
  74. - s.click.(tmall|taobao).com (Prevent redirection)
  75. - wiki.biligame.com
  76. - tieba.baidu.com
  77. - linkedin.com
  78. - sourceforge.net
  79. */
  80.  
  81. (() => {
  82. const DELAY_TIME = { fast: 600, normal: 1000, slow: 2500 };
  83. let topScroll = 0;
  84. const INDEX_TARGET = ['target'];
  85. const INDEX_ADJUST = ['redirect', 'fallback'];
  86. const INDEX_URL = ['url'];
  87. const INDEX_TO = ['to'];
  88. const INDEX_Q = ['q'];
  89. const INDEX_GOTO = ['goto'];
  90. const regStr = '(youtube|steamcommunity|zhihu|jianshu|juejin|leetcode|'
  91. + 'oschina|gitee|sspai|gcores|alipay|epicgames|linkedin|vk|adjust|'
  92. + 'game.bilibili|douban|sourceforge).(com|net|cn|hk)$';
  93. let hostRegex = new RegExp(regStr);
  94. const pageHost = window.location.hostname;
  95. const pageParams = window.location.search;
  96. const doc = document;
  97.  
  98. // SourceForge link cleaning function
  99. function cleanSourceForgeLink(originalLink) {
  100. try {
  101. const url = new URL(originalLink);
  102. const oaparams = new URLSearchParams(url.search).get('oaparams');
  103. if (!oaparams) return originalLink;
  104. const oaComponents = oaparams.split('__');
  105. const oadestComponent = oaComponents.find(comp => comp.startsWith('oadest='));
  106. if (!oadestComponent) return originalLink;
  107. const destUrlEncoded = oadestComponent.split('oadest=')[1];
  108. const destUrl = decodeURIComponent(destUrlEncoded);
  109. const finalUrl = new URL(destUrl);
  110. return finalUrl.origin + finalUrl.pathname.replace(/\/$/, '');
  111. } catch (e) {
  112. console.error('Error cleaning SourceForge URL:', e);
  113. return originalLink;
  114. }
  115. }
  116.  
  117. let linkDirect;
  118. switch (true) {
  119. case /(pixiv.net|deviantart.com)$/.test(pageHost):
  120. hostRegex = /(pixiv.net|deviantart.com)$/;
  121. linkDirect = (directURLParams, delayTime) => {
  122. const timeoutID = setTimeout(() => {
  123. const links = doc.getElementsByTagName('a');
  124. for (let i = 0; i < links.length; i++) {
  125. if (hostRegex.test(links[i].hostname)) {
  126. const params = new URLSearchParams(links[i].search);
  127. directURLParams.forEach((k) => {
  128. if (params.has(k) && links[i].href !== decodeURIComponent(params.get(k))) {
  129. links[i].href = decodeURIComponent(params.get(k));
  130. }
  131. });
  132. if (/jump.php|outgoing/.test(links[i].pathname)) {
  133. if (links[i].href !== decodeURIComponent(links[i].search.substring(1, links[i].href.length))) {
  134. links[i].href = decodeURIComponent(links[i].search.substring(1, links[i].href.length));
  135. }
  136. }
  137. }
  138. }
  139. clearTimeout(timeoutID);
  140. }, delayTime);
  141. };
  142. break;
  143. case /xda-developers.com$/.test(pageHost):
  144. hostRegex = /(xda-developers.com|shop-links.co|anrdoezrs.net|a9yw.net|pxf.io|viglink.com|awin1.com)$/;
  145. linkDirect = (directURLParams, delayTime) => {
  146. const timeoutID = setTimeout(() => {
  147. const links = doc.getElementsByTagName('a');
  148. for (let i = 0; i < links.length; i++) {
  149. if (hostRegex.test(links[i].hostname)) {
  150. const params = new URLSearchParams(links[i].search);
  151. directURLParams.forEach((k) => {
  152. if (params.has(k) && links[i].href !== decodeURIComponent(params.get(k))) {
  153. links[i].href = decodeURIComponent(params.get(k));
  154. }
  155. });
  156. let realLink = links[i].href;
  157. if (/https?/.test(links[i].search)) {
  158. realLink = links[i].search.substring(1, links[i].href.length);
  159. } else if (/https?/.test(links[i].pathname)) {
  160. realLink = links[i].pathname.substring(links[i].pathname.lastIndexOf('http'), links[i].href.length);
  161. }
  162. if (links[i].href !== decodeURIComponent(realLink)) {
  163. links[i].href = decodeURIComponent(realLink);
  164. }
  165. }
  166. }
  167. clearTimeout(timeoutID);
  168. }, delayTime);
  169. };
  170. break;
  171. case /^(tieba|ala).baidu.com$/.test(pageHost):
  172. linkDirect = (directURLParams, delayTime) => {
  173. const timeoutID = setTimeout(() => {
  174. const links = doc.getElementsByClassName('j-no-opener-url');
  175. for (let i = 0; i < links.length; i++) {
  176. if (/^jump2?.bdimg.com$/.test(links[i].hostname) && links[i].innerText.startsWith('http')) {
  177. links[i].href = links[i].innerText;
  178. }
  179. }
  180. clearTimeout(timeoutID);
  181. }, delayTime);
  182. };
  183. break;
  184. case /sourceforge.net$/.test(pageHost):
  185. linkDirect = (directURLParams, delayTime) => {
  186. const timeoutID = setTimeout(() => {
  187. const links = doc.getElementsByTagName('a');
  188. for (let i = 0; i < links.length; i++) {
  189. if (/sourceforge.net$/.test(links[i].hostname)) {
  190. const cleanedLink = cleanSourceForgeLink(links[i].href);
  191. if (links[i].href !== cleanedLink) {
  192. links[i].href = cleanedLink;
  193. }
  194. }
  195. }
  196. clearTimeout(timeoutID);
  197. }, delayTime);
  198. };
  199. break;
  200. default:
  201. linkDirect = (directURLParams, delayTime) => {
  202. const timeoutID = setTimeout(() => {
  203. const links = doc.getElementsByTagName('a');
  204. for (let i = 0; i < links.length; i++) {
  205. if (hostRegex.test(links[i].hostname)) {
  206. const params = new URLSearchParams(links[i].search);
  207. directURLParams.forEach((k) => {
  208. if (params.has(k) && links[i].href !== params.get(k)) {
  209. links[i].href = params.get(k);
  210. }
  211. });
  212. }
  213. }
  214. clearTimeout(timeoutID);
  215. }, delayTime);
  216. };
  217. break;
  218. }
  219.  
  220. // Youtube additional steps
  221. function youtubeDirect() {
  222. function run(delayTime) {
  223. linkDirect(INDEX_Q, DELAY_TIME.fast);
  224. linkDirect(INDEX_Q, DELAY_TIME.normal * 2);
  225. const timeoutID = setTimeout(() => {
  226. linkDirect(INDEX_Q, 0);
  227. document.addEventListener('click', () => {
  228. linkDirect(INDEX_Q, DELAY_TIME.fast);
  229. });
  230. clearTimeout(timeoutID);
  231. }, delayTime);
  232. }
  233. run(2000);
  234. doc.addEventListener('DOMContentLoaded', () => {
  235. run(1000);
  236. });
  237. doc.onvisibilitychange = () => {
  238. run(1500);
  239. };
  240. }
  241.  
  242. // Main function
  243. (() => {
  244. let indexParam;
  245. let MenuTitle;
  246. switch (navigator.language) {
  247. case 'zh-CN' || 'zh-SG':
  248. MenuTitle = '手动重新替换';
  249. break;
  250. case 'zh-TW' || 'zh-HK':
  251. MenuTitle = '手動再次替換';
  252. break;
  253. default:
  254. MenuTitle = 'Retry link replacing.';
  255. break;
  256. }
  257.  
  258. const adjust = /(hoyolab|mozilla|firefox)\.(com|org)$/.test(pageHost);
  259. const usingTarget = /(juejin|leetcode|gitee|sspai|gcores|zhihu)\.(com|cn)$/.test(pageHost);
  260. const isSourceForge = /sourceforge.net$/.test(pageHost);
  261. const urlParam = new URLSearchParams(pageParams);
  262. switch (true) {
  263. case usingTarget:
  264. indexParam = INDEX_TARGET;
  265. break;
  266. case adjust:
  267. indexParam = INDEX_ADJUST;
  268. linkDirect(indexParam, DELAY_TIME.normal * 2);
  269. break;
  270. case pageHost.endsWith('youtube.com'):
  271. indexParam = INDEX_Q;
  272. youtubeDirect();
  273. break;
  274. case /(s.click.taobao.com|tmall.com)$/.test(pageHost):
  275. indexParam = INDEX_GOTO;
  276. if (/^s.click.(tmall|taobao).com$/.test(window.location.hostname)
  277. && new URLSearchParams(pageParams).has('tar')) {
  278. window.stop();
  279. const targetLink = decodeURIComponent(new URLSearchParams(window.location.search).get('tar'));
  280. if (/^https?:\/\//.test(targetLink)) {
  281. window.location.replace(targetLink);
  282. }
  283. }
  284. break;
  285. case isSourceForge:
  286. linkDirect([], DELAY_TIME.normal);
  287. break;
  288. case /(steampowered|steamcommunity|wiki.biligame|linkedin|douban).com$|pixiv.net$/.test(pageHost):
  289. indexParam = INDEX_URL;
  290. break;
  291. case /(vk|jianshu).com$/.test(pageHost):
  292. indexParam = INDEX_TO;
  293. break;
  294. case pageHost.endsWith('epicgames.com'):
  295. indexParam = ['redirectTo'];
  296. break;
  297. case pageHost.endsWith('oschina.net'):
  298. INDEX_URL.push('goto_page');
  299. indexParam = INDEX_URL;
  300. break;
  301. case pageHost.endsWith('xda-developers.com'):
  302. INDEX_URL.push('u', 'ued', 'referer');
  303. indexParam = INDEX_URL;
  304. break;
  305. case /(union-click.jd.com|www.linkstars.com)$/.test(pageHost):
  306. indexParam = INDEX_TO;
  307. if (urlParam.has(indexParam) && /^https?/.test(urlParam.get(indexParam))) {
  308. window.stop();
  309. window.location.href = decodeURIComponent(urlParam.get(indexParam));
  310. }
  311. break;
  312. case /(theverge.com|7tiv.net)$/.test(pageHost):
  313. hostRegex = /sjv.io$/;
  314. INDEX_URL.push('u');
  315. indexParam = INDEX_URL;
  316. if (pageHost.endsWith('7tiv.net')
  317. && new URLSearchParams(pageParams).has(indexParam)) {
  318. window.stop();
  319. window.location.href = decodeURIComponent(
  320. new URLSearchParams(pageParams).get(indexParam)
  321. );
  322. }
  323. break;
  324. default:
  325. indexParam = [''];
  326. break;
  327. }
  328.  
  329. doc.addEventListener('DOMContentLoaded', () => {
  330. linkDirect(indexParam, DELAY_TIME.normal);
  331. });
  332.  
  333. GM_registerMenuCommand(
  334. MenuTitle,
  335. () => { linkDirect(indexParam, 0); },
  336. 'D'
  337. );
  338.  
  339. window.onscroll = () => {
  340. const scrolls = doc.documentElement.scrollTop;
  341. if (scrolls <= 200) {
  342. linkDirect(indexParam, 0);
  343. topScroll = scrolls;
  344. }
  345. if (scrolls - topScroll > 100 && scrolls > 200) {
  346. linkDirect(indexParam, 0);
  347. topScroll = scrolls;
  348. }
  349. };
  350. })();
  351. })();
  352.  
  353. /*
  354. v0.2.5 2025.06.01
  355. - Added theverge.com|7tiv.net|douban.com|sourceForge.net.
  356. - Optimized performance and error handling.
  357. - Maintained all existing features with DS.
  358.  
  359. v0.2.3 2023.08.15
  360. - Add a alternate host `ala.baidu.com`, same as `tieba.baidu.com`.
  361. - Fix an error when decoding the URLs on the Chinese pages of youtube.com.
  362.  
  363. v0.2.2 2023.07.02
  364. - Performance improvements and issue fixes.
  365.  
  366. v0.2.1 2023.06.07
  367. - Fix an issue where the replacements weren't active on `deviantart.com`, which is missing on `siteRegex`.
  368. - Fix most timeout issues.
  369. - Minor issue fixes and optimisations .
  370.  
  371. v0.2.0 2023.06.02
  372. - Improve replacing efficiency on youtube.
  373. - Replacing more links on xda (a9yw.net|pxf.io), tieba.baidu.com (jump.baidu.com), linkedin.com.
  374. - Prevent redirection on `s.click.tmall.com` (beta).
  375. - Code reduction and other improvements.
  376.  
  377. v0.1.9 2023.05.24
  378. - Directing for wiki.biligame.com, www.linkstars.com.
  379. - Performance optimisation and bug fixes.
  380.  
  381. v0.1.8 2023.05.18
  382. - Directing for JD.com, Tmall.com.
  383. - Improve replacing efficiency on youtube.
  384.  
  385. v0.1.7 2023.05.15
  386. - Replace more redirecting links for xda-developers(vglink.com anrdoezrs.net).
  387. - Add a index param for shop-links.co.
  388. - Direc links for `Steam store and hub`, `Pixiv.net`.
  389. - Optimise regexps matching.
  390.  
  391. v0.1.6.1 2023.05.10
  392. - Fix an issue where has an undefined function, which may cause some functions to fail to execute.
  393.  
  394. v0.1.6 2023.05.10
  395. - Add support for sspai|gcores|zhihu.com (target).
  396. - Add another redirecting index param for oschina.net.
  397. - Remove landiannews.com for its low usage.
  398.  
  399. v0.1.5 2023.05.05
  400. - Errors fixes and code reduction.
  401. - Replacing the shop-links with direct links on **xda-developers.com**.
  402.  
  403. v0.1.4 2023.04.28
  404. - Expand effecting area.
  405. - Several optimisation.
  406. - More url index for adjust.
  407.  
  408. v0.1.3 2023.04.18
  409. - Improve effecting stability.
  410. - Apply direct link for mozilla.org, firefox.com (Adjust.com - redirect),
  411. - Apply direct link for leetcode.cn, oschina.net, gitee.com (target).
  412. - Add a script submenu to the tampermonky menu, which for the function of manually replacing with direct links.
  413.  
  414. v0.1.2 2023.04.15
  415. - Optimised link directing on youtube.com.
  416. - Performance optimisation.
  417.  
  418. v0.1.1 2023.04.06
  419. - Spelling correction.
  420.  
  421. v0.1.0 2023.04.06
  422. - Script optimisation.
  423. - Fix youtube matching.
  424.  
  425. v0.0.6 2023.03.27
  426. Replace direct url on Epicgames.com.
  427.  
  428. v0.0.5
  429. - Remove [Youtube.com] event redirection.
  430.  
  431. v0.0.4 2023.02.24
  432. - Added [Juejin.cn] redirecting.
  433.  
  434. v0.0.3 2023.01.25
  435. - Added [Jianshu.com] redirecting.
  436.  
  437. v0.0.2 2023.01.06
  438. - Clean Hoyolab [app.adjust.com] tracking urls.
  439.  
  440. v0.0.1 2022.12.27
  441. - Initial release, direct link for landiannews.com.
  442. */

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址