Listen2ashui

我们只是从AI吸取知识的朝圣者,别无他意。

// ==UserScript==
// @name         Listen2ashui
// @namespace    http://tampermonkey.net/
// @version      2024-12-11
// @description  我们只是从AI吸取知识的朝圣者,别无他意。
// @author       AlexShui
// @match        https://ai.rcouyi.com/*
// @match        *ashui*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=rcouyi.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    // 'use strict';
    css_chatbox = "div.overflow-hidden.text-sm.items-start";
    css_textbox = "div.mt-2.flex.flex-col";
    css_loadingButton = "button.__button-dark-f4psvt-dlsmd.n-button.n-button--default-type.n-button--small-type.n-button:not(.n-button--disabled)"//
    var previous_chatboxes = [];

    function get_previous_chatboxes() {
        previous_chatboxes = document.querySelectorAll(css_chatbox);
    }
    async function listenLongestChatboxText() {
        var chatboxTextArray = [];
        let current_chatbox;

        await  new Promise((resolve) => {
            const chatboxLoadingInterval = setInterval(() => {
                const chatboxes = document.querySelectorAll(css_chatbox);
                if (chatboxes.length !== 0) {
                    current_chatbox = chatboxes[chatboxes.length - 1];
                    if (!previous_chatboxes){
                        clearInterval(chatboxLoadingInterval);
                        resolve();}
                    else {
                        if (current_chatbox !== previous_chatboxes[previous_chatboxes.length - 1])
                            {clearInterval(chatboxLoadingInterval);
                            resolve();}
                        }

                }
            },100)
        })

        let elapsedTime = 0;
        const checkInterval = 100;
        const maxWaitTime = 180000;

        // 使用一个 Promise 来处理 setInterval 的结束
        await new Promise((resolve) => {
            const intervalId = setInterval(() => {
                const chatbox_text = current_chatbox.querySelector(css_textbox).textContent.trim();
                chatboxTextArray.push(chatbox_text);

                const loaded_element = document.querySelector(css_loadingButton);
                // console.log("加载按钮状态:", loaded_element);
                if (loaded_element) {
                    clearInterval(intervalId); // 停止定时器
                    resolve(); // 结束 Promise
                } else {
                    elapsedTime += checkInterval;
                    if (elapsedTime >= maxWaitTime) {
                        clearInterval(intervalId); // 停止定时器
                        // console.log("停止等待加载");
                        resolve(); // 结束 Promise
                    }
                }
            }, checkInterval);
        });

        // 计算最长的聊天文本
        const Longest_chatbox_text = chatboxTextArray.reduce((a, b) => a.length >= b.length ? a : b, "").replace("ErrorAI0001", "");
        console.log(`监听到的回复文本为:\n${Longest_chatbox_text}`);

        if (Longest_chatbox_text !== chatboxTextArray[chatboxTextArray.length - 1]) {
            navigator.clipboard.writeText(Longest_chatbox_text).then(() => {
                window.alert("监听到回复文本被撤回,已将最长回复文本复制到剪贴板");
            });
        }
    }
        function addEarButton() {
        const existingButton = document.querySelector('button.__button-dark-f4psvt-dlsmd');

        // 检查是否已经存在具有特定标识的新按钮
        const isButtonAdded = document.querySelector('.custom-ear-button');
        if (isButtonAdded){
            return isButtonAdded;
        }
        else if (!isButtonAdded) {
            // 创建一个新的按钮
            const newButton = document.createElement('button');

            // 获取旧元素的计算样式
            const computedStyle = window.getComputedStyle(existingButton);

            // 为新按钮设置与旧元素相同的样式
            for (let property of computedStyle) {
                newButton.style[property] = computedStyle.getPropertyValue(property);
            }

            // 添加新的唯一类名
            newButton.className = 'custom-ear-button';

            // 设置其他属性
            newButton.setAttribute('tabindex', '0');
            newButton.setAttribute('type', 'button');

            // 创建按钮内容
            const buttonContent = document.createElement('span');
            buttonContent.className = 'n-button__content';
            buttonContent.textContent = '👂'; // 使用耳朵图标
            newButton.appendChild(buttonContent);

            // 复制其他可能的子元素结构
            const baseWave = document.createElement('div');
            baseWave.setAttribute('aria-hidden', 'true');
            baseWave.className = 'n-base-wave';
            newButton.appendChild(baseWave);

            const border = document.createElement('div');
            border.setAttribute('aria-hidden', 'true');
            border.className = 'n-button__border';
            newButton.appendChild(border);

            const stateBorder = document.createElement('div');
            stateBorder.setAttribute('aria-hidden', 'true');
            stateBorder.className = 'n-button__state-border';
            newButton.appendChild(stateBorder);

            // 将新按钮插入到现有按钮的右侧
            existingButton.insertAdjacentElement('afterend', newButton);
            return newButton;
        }
        else {
            return "";
        }
    }

    function waitForElements() {
        const checkInterval = setInterval(() => {
            const existingButton = document.querySelector('button.__button-dark-f4psvt-dlsmd');
            // console.log("检测一次");
            if (existingButton) {
                // console.log("检测到目标按钮");
                clearInterval(checkInterval);
                newButton = addEarButton();
                newButton.addEventListener("click",function(event){
                    existingButton.click();
                    listenLongestChatboxText()});
                newButton.addEventListener("mouseover",function(event){
                    get_previous_chatboxes()
                })
            }
        }, 100); // 每100毫秒检查一次
    }

    function checkAndRun() {
        // const regex = /\/chat\/\d+/;
        // if (regex.test(window.location.pathname)) {
        waitForElements();
        // }
    }

    // 监听URL变化
    let lastUrl = location.href;
    new MutationObserver(() => {
        const url = location.href;
        if (url !== lastUrl) {
            lastUrl = url;
            checkAndRun();
        }
    }).observe(document, {subtree: true, childList: true});

    // 页面加载完成后运行
    document.addEventListener('DOMContentLoaded', () => {
        checkAndRun();
    });
})();