哔咔download

提取 __NUXT_DATA__ 中的直链下载链接,清空页面内容并美观地显示出来,链接边框固定宽度,增加重试机制避免失效。

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         哔咔download
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  提取 __NUXT_DATA__ 中的直链下载链接,清空页面内容并美观地显示出来,链接边框固定宽度,增加重试机制避免失效。
// @author       ghost331188
// @match        https://game.storyend.net/*
// @match        https://www.vikacg.xyz/external/*
// @license      GNU General Public License v3.0
// @grant        none

// @run-at       document-end  // 等到页面资源完全加载后再执行脚本
// ==/UserScript==

(function() {
    'use strict';

    // 查找并解析 __NUXT_DATA__ 的函数
    function findAndParseNuxtData(retryCount = 10) {
        const nuxtDataScript = document.querySelector('script#__NUXT_DATA__');
        if (nuxtDataScript) {
            console.log('找到 __NUXT_DATA__ 标签');

            try {
                const nuxtData = JSON.parse(nuxtDataScript.textContent);
                console.log('成功解析 __NUXT_DATA__:', nuxtData);
                return nuxtData;
            } catch (error) {
                console.error('解析 __NUXT_DATA__ 数据时发生错误:', error);
                return null;
            }
        } else {
            console.log('未找到 __NUXT_DATA__ 脚本标签');
            // 如果还没有找到 __NUXT_DATA__,进行重试
            if (retryCount > 0) {
                console.log(`重试剩余次数: ${retryCount}`);
                setTimeout(() => findAndParseNuxtData(retryCount - 1), 1000);  // 每秒重试一次
            }
            return null;
        }
    }

    window.onload = function() {
        console.log('页面完全加载,脚本开始执行');

        // 解析 __NUXT_DATA__ 并提取链接
        const nuxtData = findAndParseNuxtData();

        if (!nuxtData) return;

        const extractLinks = (obj) => {
            let links = [];
            const regex = /https?:\/\/[^\s"]+\.(zip|7z|rar|apk)/g;

            const searchLinks = (data) => {
                if (typeof data === 'string') {
                    const matchedLinks = data.match(regex);
                    if (matchedLinks) {
                        links.push(...matchedLinks);
                    }
                } else if (typeof data === 'object' && data !== null) {
                    Object.values(data).forEach(value => searchLinks(value));
                }
            };

            searchLinks(obj);
            return links;
        };

        const possibleLinks = extractLinks(nuxtData);
        console.log('找到的直链:', possibleLinks);

        // 清空页面的所有内容
        document.body.innerHTML = '';

        // 设置页面的基础样式
        document.body.style.backgroundColor = '#f4f4f4';
        document.body.style.display = 'flex';
        document.body.style.flexDirection = 'column';
        document.body.style.alignItems = 'center';
        document.body.style.justifyContent = 'center';
        document.body.style.fontFamily = 'Arial, sans-serif';
        document.body.style.padding = '20px';

        // 动态获取并设置页面标题
        const pageTitle = document.title || '下载链接';

        // 创建标题
        const title = document.createElement('h1');
        title.innerText = pageTitle;  // 使用网页的标题
        title.style.color = '#333';
        title.style.marginBottom = '20px';
        title.style.fontSize = '24px';
        title.style.textAlign = 'center';
        document.body.appendChild(title);

        // 检查是否找到了下载链接
        if (possibleLinks.length > 0) {
            possibleLinks.forEach(link => {
                const linkElement = document.createElement('a');
                linkElement.href = link;
                linkElement.innerText = link;
                linkElement.style.display = 'block';
                linkElement.style.margin = '10px 0';
                linkElement.style.padding = '10px 0'; // 内边距高度一致
                linkElement.style.width = '80%'; // 链接容器宽度设为 80%
                linkElement.style.maxWidth = '500px'; // 最大宽度500px,防止太宽
                linkElement.style.wordWrap = 'break-word';
                linkElement.style.color = '#007bff';
                linkElement.style.backgroundColor = '#ffffff';
                linkElement.style.borderRadius = '5px';
                linkElement.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.1)';
                linkElement.style.textAlign = 'center'; // 文字居中
                linkElement.style.textDecoration = 'none';
                linkElement.style.transition = 'background-color 0.3s ease';

                // 添加 hover 效果
                linkElement.addEventListener('mouseover', () => {
                    linkElement.style.backgroundColor = '#e9f5ff';
                });
                linkElement.addEventListener('mouseout', () => {
                    linkElement.style.backgroundColor = '#ffffff';
                });

                document.body.appendChild(linkElement);
            });
        } else {
            const noLinksMessage = document.createElement('p');
            noLinksMessage.innerText = '未找到任何下载链接。';
            noLinksMessage.style.color = '#666';
            noLinksMessage.style.fontSize = '16px';
            noLinksMessage.style.textAlign = 'center';
            document.body.appendChild(noLinksMessage);
        }

        console.log('页面已更新为下载链接');
    };

})();