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

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

// ==UserScript==
// @name         自动跳转所有url链接-外链
// @name:zh-CN   🦈 鲨鱼 - Url外链自动跳转
// @namespace    http://problem.pengyuyan.plus/
// @version      5.2.0
// @description  自动跳转url外链链接(包括Base64编码加密的url链接,支持几乎所有需要跳转的网站),支持通过脚本参数配置设置跳转方式(新标签页打开、直接打开、询问用户确认)
// @author       Breathe.
// @run-at       document-end
// @include      *://*.*.*/*url*
// @include      *://*.*.*/*target*
// @include      *://link.*.*
// @exclude      *://accounts.google.com/*
// @grant        none
// @note         2024/12/20 优化脚本,支持通过脚本参数配置跳转方式
// ==/UserScript==

(function() {
    'use strict';

    // ‌**脚本参数配置**‌
    // 通过修改以下变量来更改跳转方式
    // 0: 新标签页打开
    // 1: 直接打开
    // 2: 询问用户确认
    var jumpMode = 1; // 默认❶直接打开

    // Base64解码函数
    function base64Decode(encodedStr) {
        try {
            return atob(encodedStr);
        } catch (e) {
            console.error('Base64解码失败:', e);
            return null;
        }
    }

    // 检查URL是否有效的函数
    function isValidUrl(url) {
        const urlRegex = /^(https?:\/\/)(?:\w+(?:\.\w+)*(?:\.\w{2,})|(?:[0-9]{1,3}\.){3}[0-9]{1,3})(?::\d+)?(?:\/[^\s]*)?(?:\?[^\s]*)?(?:#[^\s]*)?$/i;
        return urlRegex.test(url);
    }

    // 解析查询参数中的URL函数
    function parseUrlsFromQuery() {
        const urls = [];
        const query = window.location.search.substring(1);
        const params = new URLSearchParams(query);

        for (const [key, value] of params) {
            if (key.toLowerCase() === 'target' || key.toLowerCase() === 'url') {
                let potentialUrl = value;

                // 尝试直接验证URL
                if (isValidUrl(potentialUrl)) {
                    urls.push(potentialUrl);
                } else {
                    // 尝试Base64解码并验证
                    const decodedUrl = base64Decode(potentialUrl);
                    if (decodedUrl && isValidUrl(decodedUrl)) {
                        urls.push(decodedUrl);
                    } else {
                        console.error(`无效的URL:${potentialUrl},解码后也无效:${decodedUrl || 'null'}`);
                    }
                }
            }
        }

        return urls;
    }

    // 打开URL的函数
    function openUrls(urls) {
        if (urls.length > 0) {
            const urlToOpen = urls[0];
            switch (jumpMode) {
                case 0:
                    window.open(urlToOpen, '_blank'); // 新标签页打开
                    break;
                case 1:
                    window.location.href = urlToOpen; // 直接打开
                    break;
                case 2:
                    if (confirm(`准备跳转到以下链接:\n\n${urlToOpen} \n\n🏡 哆啦A梦!走,我们一起去新的网页 ⤵️`)) {
                        window.location.href = urlToOpen; // 询问用户确认后打开
                    }
                    break;
                default:
                    console.error('无效的跳转方式配置:', jumpMode);
            }
        }
    }

    // 主函数
    function main() {
        const urls = parseUrlsFromQuery();
        if (urls.length > 0) {
            openUrls(urls);
        }
    }

    // 执行主函数
    main();

    // ‌**示例和说明**‌
    // 要更改跳转方式,请修改上面的 `jumpMode` 变量值。
    // 例如,要在新标签页中打开链接,将 `jumpMode` 设置为 0。
    // 要直接打开链接,将 `jumpMode` 设置为 1(默认值)。
    // 要询问用户确认后打开链接,将 `jumpMode` 设置为 2。
})();