您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
redirect to the real URL directly when clicking on a link that contains a redirect URL
当前为
- // ==UserScript==
- // @name External Link Auto Redirect(Direct Link)
- // @name:zh-CN 外链自动重定向(默认直链)
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description redirect to the real URL directly when clicking on a link that contains a redirect URL
- // @description:zh-CN 点击包含重定向 URL 的链接时,直接跳转到到真实的 URL
- // @author uiliugang
- // @run-at document-start
- // @match *://*/*
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- const redirectRegex = /^https?:\/\/.*\?.*https?/;
- const videoExtensions = ['.mp4', '.m3u8', '.avi', '.mov', '.wmv', '.mkv', '.flv', '.webm', '.mpeg', '.mpg', '.mp2v', '.m4v', '.svi', '.asx', '.wmv', '.wmx', '.m4p', '.m4b', '.mxf', '.roq', '.nsv', '.flv', '.mpe?g', '.mp3v', '.m1v', '.m2v', '.vob', '.ifo', '.dat', '.divx', '.cpk', '.dirac', '.drc', '.mj2', '.mjv', '.mod', '.tod', '.rec', '.uvh', '.uvu', '.qt', '.rm', '.ram', '.rpm', '.smil', '.ice', '.gifv', '.nsv', '.3ivx', '.3gpp', '.f4v', '.f4p', '.f4a', '.f4b', '.mxf', '.roq', '.nsv', '.flv', '.m4v', '.avi', '.dat', '.divx', '.cpk', '.dirac', '.drc', '.mj2', '.mjp2', '.mjv', '.mod', '.tod', '.rec', 'uvh', 'uvu', 'qt', 'mov', 'movie', 'rm', 'ra', 'ram', 'rpm', 'smil', 'ice', 'mpe?g', 'mp2v', 'mp3v', 'm4v', 'svi', '.asx', 'wmv', 'wmx', 'wm', 'asf', 'amv', 'mpv', 'm1v', 'm2v', 'vob', '.ifo'];
- function processUrl(redirectURL) {
- const matches = redirectURL.match(redirectRegex);
- console.log(`Matches: ${matches}`);
- if (matches) {
- let index = redirectURL.substring(4).indexOf("http")+3;
- let realUrl = decodeURIComponent(redirectURL.substring(index + 1));
- console.log(`Decoded URL: ${realUrl}`);
- if (isValidUrlAndNotVideo(realUrl)) {
- return realUrl;
- }
- }
- return null;
- }
- function isValidUrlAndNotVideo(string) {
- try {
- const url = new URL(string);
- const pathname = url.pathname;
- for (const ext of videoExtensions) {
- if (pathname.endsWith(ext)) {
- return false;
- }
- }
- return true;
- } catch (e) {
- return false;
- }
- }
- function handleClick(e) {
- let url = '';
- let processedUrl = '';
- // 检查点击的元素是否具有 href 属性
- if (e.target && e.target.href) {
- url = e.target.href;
- processedUrl = processUrl(url);
- if (processedUrl) {
- e.preventDefault();
- window.open(processedUrl, '_blank');
- }
- }
- // 如果点击的元素没有 href 属性,则检查其父元素
- else if (e.target.parentElement && e.target.parentElement.href) {
- url = e.target.parentElement.href;
- processedUrl = processUrl(url);
- if (processedUrl) {
- e.preventDefault();
- window.open(processedUrl, '_blank');
- }
- }
- // 如果点击的元素或其父元素都没有 href 属性,则检查其祖先元素
- else if (e.target.parentElement && e.target.parentElement.parentElement && e.target.parentElement.parentElement.href) {
- url = e.target.parentElement.parentElement.href;
- processedUrl = processUrl(url);
- if (processedUrl) {
- e.preventDefault();
- window.open(processedUrl, '_blank');
- }
- }
- console.log(`Original URL: ${url}`);
- console.log(`Processed URL: ${processedUrl}`);
- }
- document.addEventListener('click', handleClick);
- let processedUrl = processUrl(window.location.href);
- if (processedUrl) {
- window.location.replace(processedUrl);
- }
- })();