Greasy Fork

Greasy Fork is available in English.

Chatgpt 角色扮演助手/Chatgpt Role Play Helper

在屏幕中央弹出一个可拖动位置的悬浮窗,悬浮窗内有三个文本框并且可以编辑,以及一个按钮,点击按钮后将这三个文本框的内容合并,并将合并后的文本输入到页面中符合特定CSS类别的文本框中,最后触发符合特定CSS类别的提交按钮以提交表单。

当前为 2023-03-24 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Chatgpt 角色扮演助手/Chatgpt Role Play Helper
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  在屏幕中央弹出一个可拖动位置的悬浮窗,悬浮窗内有三个文本框并且可以编辑,以及一个按钮,点击按钮后将这三个文本框的内容合并,并将合并后的文本输入到页面中符合特定CSS类别的文本框中,最后触发符合特定CSS类别的提交按钮以提交表单。
// @author       Chatgpt (most)and 环白
// @match        https://chat.openai.com/*
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';
    // 设置字体为黑色
    const elements = document.getElementsByTagName('*');
    for (let i = 0; i < elements.length; i++) {
        const element = elements[i];
        const styles = getComputedStyle(element);
        const bgColor = styles.backgroundColor;
        if (bgColor === 'transparent' || bgColor === 'rgba(0, 0, 0, 0)') {
            element.style.color = 'black';
        }
    }
    // 创建悬浮按钮
    const floatingButton = document.createElement('button');
    floatingButton.id = 'floating-button';
    floatingButton.innerText = '展开/Unfold';
    floatingButton.title = '角色扮演助手/Role Play Helper';
    floatingButton.style.position = 'fixed';
    floatingButton.style.right = '50px';
    floatingButton.style.bottom = '50px';
    floatingButton.style.backgroundColor = 'lightblue';
    floatingButton.style.padding = '10px';
    floatingButton.style.borderRadius = '5px';
    floatingButton.style.border = 'none';
    floatingButton.style.cursor = 'pointer';
    floatingButton.style.fontWeight = 'bold';
    document.body.appendChild(floatingButton);

    // 创建悬浮窗和文本框
    const floatingDiv = document.createElement('div');
    floatingDiv.id = 'floating-div';
    floatingDiv.style.position = 'fixed';
    floatingDiv.style.top = 'calc(40% + 50px)';
    floatingDiv.style.height = '600px';
    floatingDiv.style.left = 'calc(100% - 350px)';
    floatingDiv.style.transform = 'translate(-50%, -50%)';
    floatingDiv.style.zIndex = '9999';
    floatingDiv.style.backgroundColor = 'white';
    floatingDiv.style.border = '1px solid black';
    floatingDiv.style.padding = '10px';
    floatingDiv.style.borderRadius = '5px';
    floatingDiv.style.display = 'none';
    floatingDiv.style.width = '400px';
    document.body.appendChild(floatingDiv);
    const input1 = document.createElement('textarea');
    input1.id = 'input1';
    input1.style.width = '100%';
    input1.style.height = '100px';
    input1.style.marginBottom = '0px';
    floatingDiv.appendChild(input1);
    const spaceDiv = document.createElement('div');
    spaceDiv.style.height = '60px'; // 设置空白div的高度
    floatingDiv.insertBefore(spaceDiv, input1); // 将空白div插入到input1前面
    const input2 = document.createElement('textarea');
    input2.id = 'input2';
    input2.style.width = '100%';
    input2.style.height = '100px';
    input2.style.marginBottom = '0px';
    floatingDiv.appendChild(input2);

    const input3 = document.createElement('textarea');
    input3.id = 'input3';
    input3.style.width = '100%';
    input3.style.height = '100px';
    input3.style.marginBottom = '0px';
    floatingDiv.appendChild(input3);
    // 创建注释标签
    const label1 = document.createElement('label');
    label1.innerHTML = '以下内容包括辅助文本会被合并输入:';
    floatingDiv.insertBefore(label1, input1);
    label1.style.fontFamily = '楷体';
    label1.style.fontSize = '14px';
    label1.style.fontWeight = 'bold';

    const label2 = document.createElement('label');
    label2.innerHTML = '回顾区(回顾区存放着ChatGPT你上一次交互过程中的响应){ ';
    floatingDiv.insertBefore(label2, input2);
    label2.style.fontFamily = '楷体';
    label2.style.fontSize = '14px';
    label2.style.fontWeight = 'bold';

    const label3 = document.createElement('label');
    label3.innerHTML = '}<br>交互区(我所扮演的角色的行为、对话和心理,格式【{角色名:(行为、心理)对话】){';
    floatingDiv.insertBefore(label3, input3);
    label3.style.fontFamily = '楷体';
    label3.style.fontSize = '14px';
    label3.style.fontWeight = 'bold';
    const label4 = document.createElement('div');
    label4.innerHTML = '<p>}</p>';
    floatingDiv.insertBefore(label4, input3.nextSibling);
    label4.style.fontFamily = '楷体';
    label4.style.fontSize = '14px';
    label4.style.fontWeight = 'bold';
    label1.classList.add('label');
    label2.classList.add('label');
    label3.classList.add('label');
    label4.classList.add('label');
    // 创建按钮
    const toggleButton = document.createElement('button');
    toggleButton.innerHTML = '<div class="circle"></div>';
    toggleButton.title = '开启/关闭辅助文本(关闭则不合并辅助文本)';
    floatingDiv.appendChild(toggleButton);

    // 添加点击事件
    toggleButton.addEventListener('click', function() {
        const labels = document.querySelectorAll('.label');
        labels.forEach((label, index) => {
            if (index === 0) {
                label.style.display = 'block'; // 让第一个label(即label1)始终显示
            } else if (label.style.display === 'none') {
                label.style.display = 'block';
            } else {
                label.style.display = 'none';
            }
        });
    });

    // 添加样式
    const style = document.createElement('style');
    style.innerHTML = `
  .circle {
    width: 20px;
    height: 20px;
    border: 2px solid #000;
    border-radius: 50%;
    margin: auto;
    position: relative;
  }
  .circle::before,
  .circle::after {
    content: '';
    display: block;
    position: absolute;
    background-color: #000;
  }
  .circle::before {
    width: 10px;
    height: 2px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  .circle::after {
    width: 2px;
    height: 10px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
`;
    document.head.appendChild(style);



    // 创建加载存档按钮和保存存档按钮
    const archiveButtonLeft = document.createElement('button');
    archiveButtonLeft.id = 'archive-button-left';
    archiveButtonLeft.innerText = '加载/Load';
    archiveButtonLeft.title = '点击选择想要加载的存档';
    archiveButtonLeft.style.padding = '10px';
    archiveButtonLeft.style.borderRadius = '5px';
    archiveButtonLeft.style.backgroundColor = 'lightblue';
    archiveButtonLeft.style.border = '1px solid black';
    archiveButtonLeft.style.cursor = 'pointer';
    archiveButtonLeft.style.float = 'left';
    floatingDiv.insertBefore(archiveButtonLeft, spaceDiv);

    const archiveButtonRight = document.createElement('button');
    archiveButtonRight.id = 'archive-button-right';
    archiveButtonRight.innerText = '保存/Save';
    archiveButtonRight.title = '点击选择想要保存的存档';
    archiveButtonRight.style.padding = '10px';
    archiveButtonRight.style.borderRadius = '5px';
    archiveButtonRight.style.backgroundColor = 'lightblue';
    archiveButtonRight.style.border = '1px solid black';
    archiveButtonRight.style.cursor = 'pointer';
    archiveButtonRight.style.float = 'right';
    floatingDiv.insertBefore(archiveButtonRight, spaceDiv);
    // 修改加载存档按钮样式
    archiveButtonLeft.style.border = 'none';
    archiveButtonLeft.style.fontFamily = 'cursive';
    archiveButtonLeft.style.fontWeight = 'bold';
    archiveButtonLeft.style.color = 'black';

    // 修改保存按钮样式
    archiveButtonRight.style.border = 'none';
    archiveButtonRight.style.fontFamily = 'cursive';
    archiveButtonRight.style.fontWeight = 'bold';
    archiveButtonRight.style.color = 'black';


    // 创建加载存档弹窗
    const archivePopup = document.createElement('div');
    archivePopup.id = 'archive-popup-left';
    archivePopup.style.position = 'fixed';
    archivePopup.style.top = '50%';
    archivePopup.style.left = '50%';
    archivePopup.style.transform = 'translate(-50%, -50%)';
    archivePopup.style.zIndex = '9999';
    archivePopup.style.backgroundColor = 'white';
    archivePopup.style.border = '1px solid black';
    archivePopup.style.padding = '10px';
    archivePopup.style.borderRadius = '5px';
    archivePopup.style.display = 'none';
    archivePopup.style.width = '200px';
    document.body.appendChild(archivePopup);


    // 创建加载存档弹窗的关闭按钮
    const closeArchiveButton = document.createElement('button');
    closeArchiveButton.id = 'close-archive-button';
    closeArchiveButton.innerHTML = '&#10060;';
    closeArchiveButton.title = '关闭';
    closeArchiveButton.style.padding = '10px';
    closeArchiveButton.style.borderRadius = '5px';
    closeArchiveButton.style.backgroundColor = 'lightgray';
    closeArchiveButton.style.border = '1px solid black';
    closeArchiveButton.style.cursor = 'pointer';
    closeArchiveButton.style.float = 'right';
    closeArchiveButton.style.border = 'none';
    closeArchiveButton.style.backgroundColor = 'transparent';
    archivePopup.appendChild(closeArchiveButton);

    // 点击加载存档弹窗的关闭按钮关闭弹窗
    closeArchiveButton.addEventListener('click', function() {
        archivePopup.style.display = 'none';
    });
    // 添加存档1、存档2、存档3按钮到加载存档弹窗
    const archiveButton1 = document.createElement('button');
    archiveButton1.id = 'archive-1';
    archiveButton1.innerText = '存档1';
    archiveButton1.title = '存档1';
    archiveButton1.style.padding = '10px';
    archiveButton1.style.borderRadius = '5px';
    archiveButton1.style.backgroundColor = 'lightblue';
    archiveButton1.style.border = 'none';
    archiveButton1.style.cursor = 'pointer';
    archiveButton1.style.marginBottom = '10px';
    archiveButton1.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton1);

    const archiveButton2 = document.createElement('button');
    archiveButton2.id = 'archive-2';
    archiveButton2.innerText = '存档2';
    archiveButton2.title = '存档2';
    archiveButton2.style.padding = '10px';
    archiveButton2.style.borderRadius = '5px';
    archiveButton2.style.backgroundColor = 'lightblue';
    archiveButton2.style.border = 'none';
    archiveButton2.style.cursor = 'pointer';
    archiveButton2.style.marginBottom = '10px';
    archiveButton2.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton2);

    const archiveButton3 = document.createElement('button');
    archiveButton3.id = 'archive-3';
    archiveButton3.innerText = '存档3';
    archiveButton3.title = '存档3';
    archiveButton3.style.padding = '10px';
    archiveButton3.style.borderRadius = '5px';
    archiveButton3.style.backgroundColor = 'lightblue';
    archiveButton3.style.border = 'none';
    archiveButton3.style.cursor = 'pointer';
    archiveButton3.style.marginBottom = '10px';
    archiveButton3.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton3);

    // 创建保存弹窗
    const savePopup = document.createElement('div');
    savePopup.id = 'save-popup';
    savePopup.style.position = 'fixed';
    savePopup.style.top = '50%';
    savePopup.style.left = '50%';
    savePopup.style.transform = 'translate(-50%, -50%)';
    savePopup.style.zIndex = '9999';
    savePopup.style.backgroundColor = 'white';
    savePopup.style.border = '1px solid black';
    savePopup.style.padding = '10px';
    savePopup.style.borderRadius = '5px';
    savePopup.style.display = 'none';
    savePopup.style.width = '300px';
    document.body.appendChild(savePopup);
    // 创建保存弹窗的关闭按钮
    const closeSaveButton = document.createElement('button');
    closeSaveButton.id = 'close-save-button';
    closeSaveButton.innerHTML = '&#10060;';
    closeArchiveButton.title = '关闭';
    closeSaveButton.style.padding = '10px';
    closeSaveButton.style.borderRadius = '5px';
    closeSaveButton.style.backgroundColor = 'transparent';
    closeSaveButton.style.border = 'none';
    closeSaveButton.style.cursor = 'pointer';
    closeSaveButton.style.float = 'right';
    savePopup.appendChild(closeSaveButton);


    // 点击保存弹窗的关闭按钮关闭弹窗
    closeSaveButton.addEventListener('click', function() {
        savePopup.style.display = 'none';
    });

    // 添加导入存档按钮到保存弹窗
    const importButton1 = document.createElement('button');
    importButton1.id = 'import-button1';
    importButton1.innerText = '存入存档1';
    importButton1.title = '存入存档1';
    importButton1.style.padding = '10px';
    importButton1.style.borderRadius = '5px';
    importButton1.style.backgroundColor = 'lightblue';
    importButton1.style.border = 'none';
    importButton1.style.cursor = 'pointer';
    importButton1.style.fontWeight = 'bold';
    importButton1.style.float = 'left';
    savePopup.appendChild(importButton1);

    const importButton2 = document.createElement('button');
    importButton2.id = 'import-button2';
    importButton2.innerText = '存入存档2';
    importButton2.title = '存入存档2';
    importButton2.style.padding = '10px';
    importButton2.style.borderRadius = '5px';
    importButton2.style.backgroundColor = 'lightblue';
    importButton2.style.border = 'none';
    importButton2.style.cursor = 'pointer';
    importButton2.style.fontWeight = 'bold';
    importButton2.style.float = 'left';
    savePopup.appendChild(importButton2);

    const importButton3 = document.createElement('button');
    importButton3.id = 'import-button3';
    importButton3.innerText = '存入存档3';
    importButton3.title = '存入存档3';
    importButton3.style.padding = '10px';
    importButton3.style.borderRadius = '5px';
    importButton3.style.backgroundColor = 'lightblue';
    importButton3.style.border = 'none';
    importButton3.style.cursor = 'pointer';
    importButton3.style.fontWeight = 'bold';
    importButton3.style.float = 'left';
    savePopup.appendChild(importButton3);
    const MAX_CHUNK_COUNT = 100;

    // 存储存档数据的对象
    const archiveData = {
        archive1: {
            text1: '',
            text2: '',
            text3: ''
        },
        archive2: {
            text1: '',
            text2: '',
            text3: ''
        },
        archive3: {
            text1: '',
            text2: '',
            text3: ''
        }
    };

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档1”按钮中
    importButton1.addEventListener('click', function() {
        archiveData.archive1.text1 = input1.value;
        archiveData.archive1.text2 = input2.value;
        archiveData.archive1.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档2”按钮中
    importButton2.addEventListener('click', function() {
        archiveData.archive2.text1 = input1.value;
        archiveData.archive2.text2 = input2.value;
        archiveData.archive2.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档3”按钮中
    importButton3.addEventListener('click', function() {
        archiveData.archive3.text1 = input1.value;
        archiveData.archive3.text2 = input2.value;
        archiveData.archive3.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存档1按钮将“存档1”中的文本替换到悬浮窗的三个文本框内
    archiveButton1.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive1.text1,
            archiveData.archive1.text2,
            archiveData.archive1.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });

    // 点击存档2按钮将“存档2”中的文本替换到悬浮窗的三个文本框内
    archiveButton2.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive2.text1,
            archiveData.archive2.text2,
            archiveData.archive2.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });

    // 点击存档3按钮将“存档3”中的文本替换到悬浮窗的三个文本框内
    archiveButton3.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive3.text1,
            archiveData.archive3.text2,
            archiveData.archive3.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });


    let archivePopupVisible = false;
    archiveButtonLeft.addEventListener('click', function() {
        // 隐藏弹窗并清除之前的位置信息
        archivePopup.style.display = 'none';
        archivePopup.style.left = '';
        archivePopup.style.top = '';
        archivePopupVisible = false;

        if (!archivePopupVisible) {
            // 获取加载存档按钮的位置和尺寸
            const buttonRect = archiveButtonLeft.getBoundingClientRect();
            const buttonWidth = buttonRect.width;
            const buttonHeight = buttonRect.height;

            // 计算弹窗的位置
            const popupLeft = buttonRect.left + buttonWidth + savePopup.offsetWidth;
            const popupTop = buttonRect.top - buttonHeight/2 - archivePopup.offsetHeight/2;

            // 设置弹窗的位置
            archivePopup.style.left = popupLeft + 'px';
            archivePopup.style.top = popupTop + 'px';

            // 显示弹窗
            archivePopup.style.display = 'block';
            archivePopupVisible = true;
        }
    });
    // 点击加载存档按钮弹出加载存档弹窗
    archiveButtonLeft.addEventListener('click', function() {
        // 获取加载存档按钮的位置和尺寸
        const buttonRect = archiveButtonLeft.getBoundingClientRect();
        const buttonWidth = buttonRect.width;
        const buttonHeight = buttonRect.height;

        // 计算弹窗的位置
        const popupLeft = buttonRect.left + buttonWidth - archivePopup.offsetWidth / 3;
        const popupTop = buttonRect.top + archivePopup.offsetHeight/2.4;

        // 设置弹窗的位置
        archivePopup.style.left = popupLeft + 'px';
        archivePopup.style.top = popupTop + 'px';

        // 显示弹窗
        archivePopup.style.display = 'block';
    });

    // 点击加载存档弹窗的关闭按钮或其他地方关闭弹窗
    closeArchiveButton.addEventListener('click', function() {
        archivePopup.style.display = 'none';
        archivePopupVisible = false;
    });

    archivePopup.addEventListener('click', function(event) {
        if (event.target === archivePopup) {
            archivePopup.style.display = 'none';
            archivePopupVisible = false;
        }
    });

    // 点击保存按钮弹出保存弹窗
    let savePopupVisible = false;
    archiveButtonRight.addEventListener('click', function() {
        // 获取保存按钮的位置和尺寸
        const savebuttonRect = archiveButtonRight.getBoundingClientRect();
        const savebuttonWidth = savebuttonRect.width;
        const savebuttonHeight = savebuttonRect.height;

        // 计算弹窗的位置
        const savepopupLeft = savebuttonRect.left + savebuttonWidth + savePopup.offsetWidth;
        const savepopupTop = savebuttonRect.top + savebuttonHeight + savePopup.offsetHeight;

        // 计算弹窗的最大左边距和上边距,防止弹窗超出浏览器窗口
        const maxLeft = window.innerWidth - savePopup.offsetWidth;
        const maxTop = window.innerHeight - savePopup.offsetHeight;

        // 设置弹窗的位置
        savePopup.style.left = Math.min(savepopupLeft, maxLeft) - savePopup.offsetWidth + 'px';
        savePopup.style.top = Math.min(savepopupTop, maxTop) - savePopup.offsetHeight + 'px';

        // 显示弹窗
        savePopup.style.display = 'block';
    });


    // 点击保存弹窗的关闭按钮或其他地方关闭弹窗
    closeSaveButton.addEventListener('click', function() {
        savePopup.style.display = 'none';
        savePopupVisible = false;
    });

    savePopup.addEventListener('click', function(event) {
        if (event.target === savePopup) {
            savePopup.style.display = 'none';
            savePopupVisible = false;
        }
    });


    // 创建发送按钮
    const button = document.createElement('button');
    button.id = 'merge-button';
    button.innerText = '发送/Send';
    button.title = '合并以上文本进行发送';
    button.style.padding = '10px';
    button.style.borderRadius = '5px';
    button.style.backgroundColor = 'lightblue';
    button.style.border = '1px solid black';
    button.style.cursor = 'pointer';
    button.style.float = 'right';
    // 修改发送按钮样式
    button.style.border = 'none';
    button.style.fontFamily = 'cursive';
    button.style.fontWeight = 'bold';
    button.style.color = 'black';
    floatingDiv.appendChild(button);
    // 在悬浮窗左下角添加文本
    const helperText = document.createElement('div');
    helperText.innerText = 'Role Play Helper';
    helperText.title = '这是一个帮助文本,它提供了一些有用的信息来帮助您使用本脚本。\n帮助:将你的鼠标放在每一个你能看到的图标上,仔细查看这些图标的注解。'
    helperText.style.position = 'absolute';
    helperText.style.bottom = '10px';
    helperText.style.left = '10px';
    helperText.style.fontFamily = 'cursive';
    helperText.style.fontWeight = 'bold';
    helperText.style.fontStyle = 'italic';
    helperText.style.fontSize = '16px';
    floatingDiv.appendChild(helperText);
    // 设置悬浮窗可拖动
    let isDragging = false;
    let offsetX = 0;
    let offsetY = 0;

    const textInputs = [input1, input2, input3];

    floatingDiv.addEventListener('mousedown', function(event) {
        // 检查事件目标是否是文本框
        if (textInputs.includes(event.target)) {
            return;
        }
        isDragging = true;
        offsetX = event.clientX - floatingDiv.offsetLeft;
        offsetY = event.clientY - floatingDiv.offsetTop;
    });

    document.addEventListener('mousemove', function(event) {
        if (isDragging) {
            floatingDiv.style.left = (event.clientX - offsetX) + 'px';
            floatingDiv.style.top = (event.clientY - offsetY) + 'px';
        }
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;
    });

    function generateOutputArray(selector, num = 0) {
        const matchedDivs = document.querySelectorAll(selector);
        const results = [];
        let startIdx = 0;
        if (num > 0) {
            startIdx = Math.max(matchedDivs.length - num, 0);
        }
        matchedDivs.forEach((div, idx) => {
            if (idx >= startIdx) {
                const hasFlexBetweenChild = div.querySelector('div.flex.justify-between') !== null;
                const flexBetweenDiv = div.querySelector('div.flex.justify-between');
                const hasChild = flexBetweenDiv && flexBetweenDiv.children.length > 0;
                const text = div.textContent.trim();
                let role = hasChild ? "assistant" : "user";
                results.push({ role, content: text });
            }
        });
        return results;
    }

    //生成指定限制数量和字数长度的会话数组
    function generateOutputArrayWithMaxLength(selector, num = 0, maxLength = Infinity) {
        const outputArray = generateOutputArray(selector, num);
        let totalLength = 0;
        let resultArray = [];
        for (let i = outputArray.length - 1; i >= 0; i--) {
            const { role, content } = outputArray[i];
            totalLength += content.length;
            if (totalLength > maxLength || resultArray.length >= num) {
                break;
            }
            resultArray.unshift({ role, content });
        }
        return resultArray;
    }

    //格式化会话数组为导出文本
    function formatOutputArray(outputArray) {
        return outputArray
            .map(({ role, content }) => `${role}: ${content}`)
            .join('\r\n\r\n----------------\r\n\r\n');
    }

    //创建一个下载文本
    function downloadTextFile(text, filename) {
        const blob = new Blob([text], { type: "text/plain;charset=utf-8" });
        const a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = `${filename}.txt`;
        a.textContent = `Download ${filename}`;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }

    //获取最新的助手消息
    function getLatestAssistantMessage(selector) {
        const matchedDivs = document.querySelectorAll(selector);
        for (let i = matchedDivs.length - 1; i >= 0; i--) {
            const div = matchedDivs[i];
            const flexBetweenDiv = div.querySelector('div.flex.justify-between');
            if (flexBetweenDiv && flexBetweenDiv.children.length > 0) {
                const text = div.textContent.trim();
                return text;
            }
        }
        return null;
    }

    // 创建按钮元素
    const button2 = document.createElement('button');
    button2.innerHTML = '<svg width="24" height="24" viewBox="0 0 24 24"><path fill="#ff69b4" d="M12,21.4c-0.4,0-0.7-0.1-1-0.4C5.5,16.8,2,12.2,2,8.5C2,5.4,4.4,3,7.5,3c2,0,3.8,1.2,4.5,2.9C12.7,4.2,14.5,3,16.5,3C19.6,3,22,5.4,22,8.5c0,3.7-3.5,8.3-9,12.5C12.7,21.2,12.4,21.4,12,21.4z"/></svg>';
    button2.title = '复制GPT最新回复到回顾区';
    floatingDiv.appendChild(button2);

    // 修改按钮样式
    button2.style.position = 'absolute';
    button2.style.top = '90%';
    button2.style.left = '50%';
    button2.style.transform = 'translate(-50%, 10px)';
    button2.style.border = 'none';
    button2.style.background = 'transparent';
    button2.style.cursor = 'pointer';

    ;


  // 给按钮添加点击事件监听器
button2.addEventListener('click', function() {
    const latestAssistantMessage = getLatestAssistantMessage('div[class*="w-[calc(100%"]');
    if (latestAssistantMessage) {
        input2.value = latestAssistantMessage;
    }
});
button.addEventListener('click', function() {
    const inputText1 = input1.value.trim();
    const inputText2 = input2.value.trim();
    const inputText3 = input3.value.trim();
let mergedTextoutput = '';

if (inputText1 !== '') {
    mergedTextoutput += inputText1 + '\n';
}

if (label2.style.display !== 'none' && inputText2 !== '') {
    mergedTextoutput += label2.textContent.trim() + '\n';
}

if (inputText2 !== '') {
    mergedTextoutput += inputText2 + '\n';
}

if (label3.style.display !== 'none' && inputText3 !== '') {
    mergedTextoutput += label3.textContent.trim() + '\n';
}

if (inputText3 !== '') {
    mergedTextoutput += inputText3 + '\n';
}

if (label4.style.display !== 'none') {
    mergedTextoutput += label4.textContent.trim() + '\n';
}



        console.log(mergedTextoutput);
        // 将合并后的文本输入到页面中符合特定CSS类别的文本框中,并触发提交按钮
        const textareas = document.querySelectorAll('[class*="m-"][class*="w-full"][class*="resize-none"][class*="border-0"][class*="bg-transparent"][class*="p-"][class*="pl-"][class*="pr-"][class*="focus:ring-0"][class*="focus-visible:ring-0"][class*="dark:bg-transparent"][class*="md:pl-"]');
        if (textareas.length > 0) {
            textareas[0].value = mergedTextoutput;

            // 触发提交按钮
            const button = document.querySelector('[class*="absolute"][class*="rounded-md"][class*="bottom-"][class*="right-"][class*="disabled"]');
            if (button) {
                button.click();
            }
        }
    });

    // 点击悬浮按钮展开悬浮窗
    floatingButton.addEventListener('click', function() {
        if (floatingDiv.style.display === 'none') {
            floatingDiv.style.display = 'block';
            floatingButton.innerText = '收起/Fold';
        } else {
            floatingDiv.style.display = 'none';
            floatingButton.innerText = '展开/Unfold';

        }
    });})();