Greasy Fork

来自缓存

Greasy Fork is available in English.

ASMRONE跳转Kikoeru

检测页面中的RJ号,并在每个RJ号旁边显示跳转按钮,同时根据资源存在情况改变按钮颜色和文本。在 127.0.0.1:8889 页面中创建跳转到 ASMRONE 的按钮。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         ASMRONE跳转Kikoeru
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  检测页面中的RJ号,并在每个RJ号旁边显示跳转按钮,同时根据资源存在情况改变按钮颜色和文本。在 127.0.0.1:8889 页面中创建跳转到 ASMRONE 的按钮。
// @author       你的名字
// @match        *://asmr-300.com/*
// @match        *://asmr-200.com/*
// @match        *://asmr-100.com/*
// @match        *://asmr.one/*
// @match        *://127.0.0.1:8889/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

// 使用严格模式,避免代码中的潜在问题
(function () {
    'use strict';

    // 判断当前页面是否为 127.0.0.1:8889
    const isLocalhost8889 = window.location.hostname === '127.0.0.1' && window.location.port === '8889';

    // 如果不是 127.0.0.1:8889,执行原代码
    if (!isLocalhost8889) {
        // 定义按钮的样式
        const style = `
            .rdl-button {
                display: inline-block; /* 按钮显示为行内块元素 */
                padding: 1px 1px; /* 按钮内边距 */
                text-decoration: none; /* 去掉文字装饰(如下划线) */
                margin-left: 10px; /* 按钮左边距 */
                cursor: pointer; /* 鼠标悬停时显示为手型 */
                border: none; /* 去掉边框 */
                border-radius: 4px; /* 圆角边框 */
                font-size: 13px; /* 字体大小 */
                color: white; /* 文字颜色为白色 */
            }
            .rdl-button_green {
                background-color: #67c23a; /* 绿色背景 */
            }
            .rdl-button_red {
                background-color: #f56c6c; /* 红色背景 */
            }
            .rdl-button_blue {
                background-color: #409eff; /* 蓝色背景 */
            }
        `;

        // 创建一个 <style> 元素,用于将样式添加到页面中
        const styleSheet = document.createElement("style");
        styleSheet.type = "text/css"; // 设置样式表类型
        styleSheet.innerText = style; // 将样式内容添加到 <style> 元素
        document.head.appendChild(styleSheet); // 将 <style> 元素添加到页面的 <head> 中

        // 检测页面中的RJ号并创建按钮
        const checkPageAndCreateButtons = async () => {
            console.log('checkPageAndCreateButtons called'); // 打印日志,表示函数被调用

            // 查找所有包含RJ号的元素
            const rjElements = document.querySelectorAll('.q-chip__content.col.row.no-wrap.items-center.q-anchor--skip');
            rjElements.forEach(element => {
                // 检查是否已经处理过这个元素
                if (element.dataset.processed) {
                    return; // 如果已经处理过,跳过
                }

                const text = element.innerText; // 获取元素的文本内容
                const rjRegex = /RJ(\d{6,8})/i; // 正则表达式,匹配RJ号
                const match = text.match(rjRegex); // 在文本中查找RJ号

                if (match) {
                    let rjNumber = match[1]; // 提取RJ号的数字部分
                    if (rjNumber.length === 6) {
                        rjNumber = rjNumber; // 如果RJ号是6位数,直接使用
                    } else if (rjNumber.length === 8) {
                        rjNumber = rjNumber.slice(1); // 如果RJ号是8位数,去掉第一位
                    }

                    // 检查是否已经存在按钮
                    const existingButton = element.parentElement.querySelector('.kikoeru-jump-button');
                    if (existingButton) {
                        return; // 如果按钮已经存在,跳过
                    }

                    // 创建按钮
                    const button = document.createElement('a'); // 创建一个 <a> 元素
                    button.className = 'rdl-button rdl-button_red kikoeru-jump-button'; // 设置按钮的类名
                    button.textContent = '正在检查...'; // 设置按钮的文本
                    button.target = "_blank"; // 设置按钮点击后在新标签页中打开

                    // 将按钮添加到元素的右边
                    element.parentElement.appendChild(button);

                    // 标记这个元素已经处理过
                    element.dataset.processed = 'true';

                    // 检查资源是否存在
                    checkResource(rjNumber, button);
                }
            });
        };

        // 检查资源是否存在
        async function checkResource(rj, button) {
            const url = `http://127.0.0.1:8889/api/search?keyword=${rj}`; // 构造请求URL
            GM_xmlhttpRequest({
                method: 'GET', // 使用GET方法发送请求
                url: url, // 请求的URL
                onload: function (response) { // 请求成功时的回调函数
                    try {
                        const works = JSON.parse(response.responseText).works; // 解析响应数据
                        if (works.length > 0) { // 如果资源存在
                            button.textContent = '跳转kikoeru'; // 设置按钮文本
                            button.href = `http://127.0.0.1:8889/work/${rj}`; // 设置按钮跳转链接
                            button.className = "rdl-button rdl-button_green"; // 设置按钮为绿色

                            // 添加点击事件监听器,确保跳转行为
                            button.addEventListener('click', (event) => {
                                event.preventDefault(); // 阻止默认行为
                                window.open(button.href, '_blank'); // 在新标签页中打开链接
                            });
                        } 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"; // 设置按钮为红色
                }
            });
        }

        // 初始化时检测一次页面
        checkPageAndCreateButtons();

        // 使用 MutationObserver 动态监测 DOM 变化
        const observer = new MutationObserver(checkPageAndCreateButtons);
        observer.observe(document.body, { childList: true, subtree: true }); // 监听 body 元素的变化
    }

    // 如果是 127.0.0.1:8889 页面,执行新增的代码
    if (isLocalhost8889) {
        // 创建跳转到 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();
                }
            }
        };

        // 初始化时执行一次创建 ASMRONE 按钮的逻辑
        createAsmrOneButton(window.location.href);

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