Listen2ashui

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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();
    });
})();