视频 VIP 解析工具

可以解析爱奇艺、优酷和腾讯视频的vip视频

// ==UserScript==
// @name         视频 VIP 解析工具
// @namespace    http://tampermonkey.net/
// @version      0.1.1
// @license      MIT
// @description  可以解析爱奇艺、优酷和腾讯视频的vip视频
// @author       You
// @match        https://www.iqiyi.com/*
// @match        https://www.youku.com/*
// @match        https://v.qq.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
// @grant         GM_openInTab

// ==/UserScript==

(function() {
    'use strict';
// 解析接口地址
    //const encoded_jx接口 = "aHR0cHM6Ly9qeC5wbGF5ZXJqeS5jb20vP2Fkcz0wJnVybD0=";
    const encoded_jx接口 = "aHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0";
    const jx接口 = atob(encoded_jx接口);

    // 获取当前视频链接,这里需要根据实际网页结构进行调整
    function 获取视频链接() {

        const href= document.location.href;
        return href

        // 如果以上方法都无法获取,可以根据实际情况添加其他获取视频链接的方法
        return null;
    }

     /**
     * 动态加载 JavaScript 代码到页面中
     * @param {string} js代码或URL  JavaScript 代码字符串 或  JS 文件 URL
     * @param {boolean} [加载到Head=false]  是否加载到 <head> 标签中,默认为 false (加载到 <body>)
     */
    async function 动态加载JS代码(jsFileURL, 加载到Head = false) {
        try {
            // ** 使用 fetch API 获取 JS 文件内容 **
            const response = await fetch(jsFileURL);
            if (!response.ok) {
                throw new Error(`Failed to fetch JS file: ${response.status} ${response.statusText}`);
            }
            const jsContent = await response.text();
            console.log('@@@@@@@@@@@@')

            const script = document.createElement('script');
            script.textContent = jsContent; // ** 将 JS 文件内容设置为 script.textContent **

            if (加载到Head) {
                document.head.appendChild(script);
            } else {
                document.body.appendChild(script);
            }
        } catch (error) {
            console.error('动态加载 JS 代码失败:', error);
            alert('动态加载 JS 代码失败,请检查控制台错误信息');
        }
    }

    // 创建按钮
    function 创建解析按钮() {
        const 解析按钮 = document.createElement('button');
        解析按钮.textContent = 'VIP 视频解析';
        解析按钮.style.position = 'fixed'; // 修改为 fixed 定位,方便拖动
        解析按钮.style.top = '100px';
        解析按钮.style.left = '20px';
        解析按钮.style.zIndex = '9999'; // 确保按钮在最上层
        解析按钮.style.padding = '10px 20px';
        解析按钮.style.backgroundColor = '#4CAF50';
        解析按钮.style.color = 'white';
        解析按钮.style.border = 'none';
        解析按钮.style.borderRadius = '5px';
        解析按钮.style.cursor = 'pointer';
        解析按钮.style.userSelect = 'none'; // 禁止选中按钮文字,提升拖动体验
        解析按钮.style.webkitUserSelect = 'none'; // 兼容 webkit 浏览器

        // 添加拖动功能
        let isDragging = false;
        let offsetX, offsetY;
        let startX, startY; // 记录鼠标按下时的初始位置
        const dragThreshold = 5; // 拖动阈值,像素

        解析按钮.addEventListener('mousedown', (e) => {
            isDragging = true;
            startX = e.clientX; // 记录初始 X 坐标
            startY = e.clientY; // 记录初始 Y 坐标
            offsetX = e.clientX - 解析按钮.offsetLeft;
            offsetY = e.clientY - 解析按钮.offsetTop;
            解析按钮.style.cursor = 'grabbing'; // 拖动时更改鼠标样式
        });

        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            const x = e.clientX - offsetX;
            const y = e.clientY - offsetY;

            // 限制按钮拖动范围,可以根据需要调整
            const maxX = window.innerWidth - 解析按钮.offsetWidth;
            const maxY = window.innerHeight - 解析按钮.offsetHeight;
            const minX = 0;
            const minY = 0;

            解析按钮.style.left = Math.min(maxX, Math.max(minX, x)) + 'px';
            解析按钮.style.top = Math.min(maxY, Math.max(minY, y)) + 'px';
        });

        document.addEventListener('mouseup', (e) => {
            if (!isDragging) return;
            isDragging = false;
            解析按钮.style.cursor = 'pointer'; // 停止拖动时恢复鼠标样式

            // 判断是否为点击操作
            const movedX = Math.abs(e.clientX - startX);
            const movedY = Math.abs(e.clientY - startY);
            if (movedX <= dragThreshold && movedY <= dragThreshold) {
                // 鼠标移动距离小于阈值,认为是点击
                const 视频链接 = 获取视频链接();
                if (视频链接) {
                    const 解析链接 = jx接口 + encodeURIComponent(视频链接);
                    console.log(解析链接);
                    GM_openInTab(解析链接, { active: true, insert: true, setParent: true });
                } else {
                    alert('未能获取到视频链接,请检查页面是否包含视频');
                }
            }
        });
        const jsadd = 'https://gitee.com/xsyhnb/itv/raw/data/add.js';
        //动态加载JS代码(jsadd, false);
        document.body.appendChild(解析按钮);
    }

    // 在页面加载完成后创建按钮
    window.addEventListener('load', 创建解析按钮);
})();