Greasy Fork

来自缓存

Greasy Fork is available in English.

视频 VIP 解析工具

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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', 创建解析按钮);
})();