自动跳转所有url链接-外链

自动跳转url外链链接(包括Base64编码加密的url链接,支持几乎所有需要跳转的网站),支持通过脚本参数配置设置跳转方式(新标签页打开、直接打开、询问用户确认)

  1. // ==UserScript==
  2. // @name 自动跳转所有url链接-外链
  3. // @name:zh-CN 🦈 鲨鱼 - Url外链自动跳转
  4. // @namespace http://problem.pengyuyan.plus/
  5. // @version 5.2.0
  6. // @description 自动跳转url外链链接(包括Base64编码加密的url链接,支持几乎所有需要跳转的网站),支持通过脚本参数配置设置跳转方式(新标签页打开、直接打开、询问用户确认)
  7. // @author Breathe.
  8. // @run-at document-end
  9. // @include *://*.*.*/*url*
  10. // @include *://*.*.*/*target*
  11. // @include *://link.*.*
  12. // @exclude *://accounts.google.com/*
  13. // @grant none
  14. // @note 2024/12/20 优化脚本,支持通过脚本参数配置跳转方式
  15. // ==/UserScript==
  16.  
  17. (function() {
  18. 'use strict';
  19.  
  20. // ‌**脚本参数配置**‌
  21. // 通过修改以下变量来更改跳转方式
  22. // 0: 新标签页打开
  23. // 1: 直接打开
  24. // 2: 询问用户确认
  25. var jumpMode = 1; // 默认❶直接打开
  26.  
  27. // Base64解码函数
  28. function base64Decode(encodedStr) {
  29. try {
  30. return atob(encodedStr);
  31. } catch (e) {
  32. console.error('Base64解码失败:', e);
  33. return null;
  34. }
  35. }
  36.  
  37. // 检查URL是否有效的函数
  38. function isValidUrl(url) {
  39. const urlRegex = /^(https?:\/\/)(?:\w+(?:\.\w+)*(?:\.\w{2,})|(?:[0-9]{1,3}\.){3}[0-9]{1,3})(?::\d+)?(?:\/[^\s]*)?(?:\?[^\s]*)?(?:#[^\s]*)?$/i;
  40. return urlRegex.test(url);
  41. }
  42.  
  43. // 解析查询参数中的URL函数
  44. function parseUrlsFromQuery() {
  45. const urls = [];
  46. const query = window.location.search.substring(1);
  47. const params = new URLSearchParams(query);
  48.  
  49. for (const [key, value] of params) {
  50. if (key.toLowerCase() === 'target' || key.toLowerCase() === 'url') {
  51. let potentialUrl = value;
  52.  
  53. // 尝试直接验证URL
  54. if (isValidUrl(potentialUrl)) {
  55. urls.push(potentialUrl);
  56. } else {
  57. // 尝试Base64解码并验证
  58. const decodedUrl = base64Decode(potentialUrl);
  59. if (decodedUrl && isValidUrl(decodedUrl)) {
  60. urls.push(decodedUrl);
  61. } else {
  62. console.error(`无效的URL${potentialUrl},解码后也无效:${decodedUrl || 'null'}`);
  63. }
  64. }
  65. }
  66. }
  67.  
  68. return urls;
  69. }
  70.  
  71. // 打开URL的函数
  72. function openUrls(urls) {
  73. if (urls.length > 0) {
  74. const urlToOpen = urls[0];
  75. switch (jumpMode) {
  76. case 0:
  77. window.open(urlToOpen, '_blank'); // 新标签页打开
  78. break;
  79. case 1:
  80. window.location.href = urlToOpen; // 直接打开
  81. break;
  82. case 2:
  83. if (confirm(`准备跳转到以下链接:\n\n${urlToOpen} \n\n🏡 哆啦A梦!走,我们一起去新的网页 ⤵️`)) {
  84. window.location.href = urlToOpen; // 询问用户确认后打开
  85. }
  86. break;
  87. default:
  88. console.error('无效的跳转方式配置:', jumpMode);
  89. }
  90. }
  91. }
  92.  
  93. // 主函数
  94. function main() {
  95. const urls = parseUrlsFromQuery();
  96. if (urls.length > 0) {
  97. openUrls(urls);
  98. }
  99. }
  100.  
  101. // 执行主函数
  102. main();
  103.  
  104. // ‌**示例和说明**‌
  105. // 要更改跳转方式,请修改上面的 `jumpMode` 变量值。
  106. // 例如,要在新标签页中打开链接,将 `jumpMode` 设置为 0。
  107. // 要直接打开链接,将 `jumpMode` 设置为 1(默认值)。
  108. // 要询问用户确认后打开链接,将 `jumpMode` 设置为 2。
  109. })();