Greasy Fork

Greasy Fork is available in English.

ASMRONE&Kikoeru相互跳转

检测地址栏中的RJ号,并在指定的div元素中显示跳转按钮,同时根据资源存在情况改变按钮颜色和文本

当前为 2025-03-05 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         ASMRONE&Kikoeru相互跳转
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  检测地址栏中的RJ号,并在指定的div元素中显示跳转按钮,同时根据资源存在情况改变按钮颜色和文本
// @author       你的名字
// @match        *://asmr-300.com/*
// @match        *://asmr-200.com/*
// @match        *://asmr-100.com/*
// @match        *://asmr.one/*
// @match        *://localhost:8889/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function () {
    'use strict';

    // 添加样式定义
    const style = `
        .rdl-button {
            display: inline-block;
            padding: 5px 10px;
            text-decoration: none;
        }
        .rdl-button_green {
            background-color: #67c23a;
            color: white;
        }
        .rdl-button_red {
            background-color: #f56c6c;
            color: white;
        }
        .rdl-button_blue {
            background-color: #409eff;
            color: white;
        }
    `;
    const styleSheet = document.createElement("style");
    styleSheet.type = "text/css";
    styleSheet.innerText = style;
    document.head.appendChild(styleSheet);

    // 检测地址栏中的RJ号并创建按钮
    const checkUrlAndCreateButton = async () => {
        console.log('checkUrlAndCreateButton called');
        const url = window.location.href;
        console.log('Current URL:', url);

        // 判断当前页面是否是 localhost:8889
        if (url.includes('localhost:8889')) {
            createAsmrOneButton(url);
        } else {
            createKikoeruButton(url);
        }
    };

    // 创建跳转到 Kikoeru 的按钮
    const createKikoeruButton = async (url) => {
        const rjRegex = /RJ(\d{6,8})/i;
        const match = url.match(rjRegex);

        if (match) {
            let rjNumber = match[1];
            if (rjNumber.length === 6) {
                rjNumber = rjNumber; // 6位数直接去掉RJ
            } else if (rjNumber.length === 8) {
                rjNumber = rjNumber.slice(1); // 8位数保留后7位
            }

            const jumpUrl = `http://localhost:8889/work/${rjNumber}`;

            const existingButton = document.getElementById('rj-jump-button');
            if (existingButton) {
                existingButton.remove();
            }

            const targetRow = document.querySelector('.row.items-center.q-gutter-xs');
            if (targetRow) {
                console.log('Target row found');
                const button = document.createElement('a');
                button.id = 'rj-jump-button';
                button.textContent = '正在检查...';
                button.style.marginLeft = '10px';
                button.style.textDecoration = 'none';
                button.style.cursor = 'pointer';
                button.target = "_blank"; // 在新标签页中打开

                // 设置默认样式为红色
                button.className = 'rdl-button rdl-button_red';

                // 添加到目标行的最后
                targetRow.appendChild(button);

                // 检查资源是否存在
                await checkResource(rjNumber, button);
            } else {
                console.log('Target row not found');
            }
        } else {
            console.log('No RJ number in URL');
            const existingButton = document.getElementById('rj-jump-button');
            if (existingButton) {
                existingButton.remove();
            }
        }
    };

    // 创建跳转到 ASMRONE 的按钮
    const createAsmrOneButton = (url) => {
        const rjRegex = /work\/(\d{6,7})/i; // 匹配 6 位或 7 位的 RJ 号
        const match = url.match(rjRegex);

        if (match) {
            let rjNumber = match[1];
            if (rjNumber.length === 6) {
                rjNumber = `RJ${rjNumber}`; // 6 位数直接使用
            } else if (rjNumber.length === 7) {
                rjNumber = `RJ0${rjNumber}`; // 7 位数补 0 为 8 位
            }

            const jumpUrl = `https://asmr-200.com/work/${rjNumber}`;

            const existingButton = document.getElementById('asmr-one-jump-button');
            if (existingButton) {
                existingButton.remove();
            }

            const targetRow = document.querySelector('.row.items-center.q-gutter-xs');
            if (targetRow) {
                console.log('Target row found');
                const button = document.createElement('a');
                button.id = 'asmr-one-jump-button'; // 设置按钮的 ID,用于唯一标识该按钮
                button.textContent = 'ASMRONE'; // 设置按钮上显示的文本内容
                button.style.marginLeft = '10px'; // 设置按钮左边距为 10px,使其与左侧元素保持一定距离
                button.style.textDecoration = 'none'; // 移除按钮文本的下划线(通常用于链接)
                button.style.cursor = 'pointer'; // 设置鼠标悬停时的光标样式为指针(表示可点击)
                button.style.backgroundColor = '#31ccec'; // 设置背景颜色为绿色
                button.style.color = 'white'; // 设置文字颜色为白色
                button.style.border = 'none'; // 移除边框
                button.style.padding = '6px 12px'; // 设置内边距
                button.style.borderRadius = '4px'; // 设置圆角
                button.style.fontSize = '13px'; // 设置字体大小
                button.style.width = 'auto'; // 宽度自适应内容
                button.style.height = 'auto'; // 高度自适应内容
                button.target = "_blank"; // 在新标签页中打开
                button.href = jumpUrl; // 设置按钮点击后跳转的链接地址

                // 设置样式为蓝色
                button.className = 'rdl-button rdl-button_blue';

                // 添加到目标行的最后
                targetRow.appendChild(button);
            } else {
                console.log('Target row not found');
            }
        } else {
            console.log('No RJ number in URL');
            const existingButton = document.getElementById('asmr-one-jump-button');
            if (existingButton) {
                existingButton.remove();
            }
        }
    };

    // 检查资源是否存在
    async function checkResource(rj, button) {
        const url = `http://localhost:8889/api/search?keyword=${rj}`;
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (response) {
                try {
                    const works = JSON.parse(response.responseText).works;
                    if (works.length > 0) {
                        button.textContent = '跳转kikoeru';
                        button.href = `http://localhost:8889/work/${rj}`;
                        button.className = "rdl-button rdl-button_green"; // 资源存在,变绿
                    } else {
                        button.textContent = '资源不存在';
                        button.href = '#'; // 禁用链接
                        button.className = "rdl-button rdl-button_red"; // 资源不存在,保持红
                    }
                } catch (error) {
                    button.textContent = '请求失败';
                    button.href = '#'; // 禁用链接
                    button.className = "rdl-button rdl-button_red"; // 请求失败,保持红
                }
            },
            onerror: function () {
                button.textContent = '请求失败';
                button.href = '#'; // 禁用链接
                button.className = "rdl-button rdl-button_red"; // 请求失败,保持红
            }
        });
    }

    // 初始化时检测一次URL
    checkUrlAndCreateButton();
    let lastUrl = window.location.href;

    // 监听 AJAX 请求完成事件,确保在内容加载完成后再执行按钮创建逻辑。
    const originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function () {
        this.addEventListener('load', () => {
            if (this.responseURL.includes('/work/')) {
                checkUrlAndCreateButton();
            }
        });
        originalOpen.apply(this, arguments);
    };
})();