227229 bot

很喜欢jg的一句话,明天下午东南亚单排

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         227229 bot
// @namespace    http://tampermonkey.net/
// @version      2.3
// @description  很喜欢jg的一句话,明天下午东南亚单排
// @author       Reesedog
// @match        https://www.douyu.com/227229*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    "use strict";

    // 弹幕模板部分 ==============================================================================================================
    // 定义弹幕模板
    const templates = [
        "一直为这些五千分的细节沾沾自喜,我",
        "(不可思议)(假装自责),(自暴自弃)(切屏封人)",
        "下一个搞 吗,收到鸡哥收到",
        "第一天,第二天,第三天,4000+",
        "唔,",
        // 根据需要添加更多模板
        // todo: "(emoji+词语)x5",
    ];

    const cosplayGroups = {
        "CP组": ["烈女不怕死丶"],
        "偶像组": ["徐志雷Burning"],
        "仇人组": ["yyfyyf", "yyfyyf", "LGD_y", "LGD_Faithbian", "张宁xiao8", "Maybeee222"],
        "皮套组": ["七海nana7mi", "阿梓梓梓梓丶"],
        "mdy组:": ["ameame", "SetsuRy", "kaka胡良智", "inflame丶hyz", "ctyzzz", "September猫", "Ori曾焦阳","节奏魔王oldeLeVeN", "嘟嘟Lzk", "阿发ava", "xmxm211"],
        "永远幻念": ["幻像踩花", "AI猫雷"]
    };


    // 创建浮动窗口
    let floatWindow = document.createElement("div");
    floatWindow.style.display = "flex";
    floatWindow.style.position = "fixed";
    floatWindow.style.top = "30%";
    floatWindow.style.right = "0";
    floatWindow.style.transform = "translateY(-50%)";
    floatWindow.style.backgroundColor = "white";
    floatWindow.style.border = "1px solid black";
    floatWindow.style.padding = "10px";
    floatWindow.style.zIndex = "10000";
    floatWindow.style.flexDirection = "column"; // 添加这一行来使元素竖向排列

    document.body.appendChild(floatWindow);

    // 创建模板下拉菜单
    let templateMenu = document.createElement("select");
    templateMenu.style.width = "323px";

    // 添加模板占位符选项
    let placeholderOption = document.createElement("option");
    placeholderOption.value = "";
    placeholderOption.textContent = "弹幕模板";
    placeholderOption.disabled = true;
    placeholderOption.selected = true;
    templateMenu.appendChild(placeholderOption);

    // 添加模板选项
    templates.forEach((template) => {
        let option = document.createElement("option");
        option.value = template;
        option.textContent = template;
        templateMenu.appendChild(option);
    });

    // 创建cosplay下拉菜单
    let cosplay = document.createElement("select");
    cosplay.style.width = "323px";

    // 添加cosplay占位符选项
    let cosplayPlaceHolder = document.createElement("option");
    cosplayPlaceHolder.value = "";
    cosplayPlaceHolder.textContent = "cosplay";
    cosplayPlaceHolder.disabled = true;
    cosplayPlaceHolder.selected = true;
    cosplay.appendChild(cosplayPlaceHolder);

    // 添加分组和选项
    for (let group in cosplayGroups) {
        let optgroup = document.createElement("optgroup");
        optgroup.label = group;
        cosplayGroups[group].forEach((username) => {
            let option = document.createElement("option");
            option.value = username;
            option.textContent = username;
            optgroup.appendChild(option);
        });
        cosplay.appendChild(optgroup);
    }
    // contentContainer.appendChild(cosplay);
    // contentContainer.appendChild(templateMenu);


    // 创建输入框
    let inputField = document.createElement("textarea");
    inputField.rows = 4;
    inputField.cols = 70;

    inputField.style.width = "200px";
    // inputField.style.marginLeft = "10px";
    // contentContainer.appendChild(inputField);

    // 创建发送按钮
    let sendButton = document.createElement("button");
    sendButton.textContent = "发送";
    sendButton.style.marginLeft = "10px";
    sendButton.style.paddingLeft = "10px";
    sendButton.style.paddingRight = "10px";
    sendButton.style.border = "1px solid black";
    // contentContainer.appendChild(sendButton);

    // 创建折叠/展开按钮
    let toggleButton = document.createElement("button");
    toggleButton.textContent = "🤡";
    toggleButton.style.backgroundColor = "orange";
    toggleButton.style.border = "none";
    toggleButton.style.color = "white";
    toggleButton.style.fontSize = "16px";
    toggleButton.style.padding = "0px 10px 5px 10px";
    toggleButton.style.cursor = "pointer";
    toggleButton.style.marginLeft = "10px";
    floatWindow.appendChild(toggleButton);

    // 定义发送弹幕的函数
    function sendDanmu(content) {
        let textarea = document.querySelector("textarea.ChatSend-txt");
        if (textarea) {
            textarea.value = content;
            textarea.focus();
            let sendButton = document.querySelector(".ChatSend-button");
            if (sendButton) {
                sendButton.click(); // 点击发送按钮提交弹幕
            }
        }
    }

    // 发送按钮点击事件
    sendButton.onclick = function () {
        if(cosplay.value!=""){
            sendDanmu("@" + cosplay.value + ":" + inputField.value);
        }else{
            sendDanmu(inputField.value);
        }
    };

    sendButton.addEventListener("click", function() {
        window.scrollTo(0, 0); // 滚动到页面顶部
    });

    // 下拉菜单变更事件
    templateMenu.onchange = function () {
        inputField.value = templateMenu.value;
    };

    // 折叠/展开按钮点击事件
    toggleButton.onclick = function () {
        if (contentContainer.style.display === "none") {
            contentContainer.style.display = "block";
            toggleButton.textContent = "×";
        } else {
            contentContainer.style.display = "none";
            toggleButton.textContent = "🤡";
        }
    };

    // 创建浮窗容器
    let contentContainer = document.createElement("div");
    contentContainer.style.paddingTop = "5px";
    contentContainer.style.display = "none";
    floatWindow.appendChild(contentContainer);

    // 创建表格
    let table = document.createElement("table");
    contentContainer.appendChild(table);

    // 创建第一行:Cosplay下拉菜单
    let row1 = document.createElement("tr");
    let cell1_1 = document.createElement("td");
    cell1_1.textContent = "Cosplay:";
    row1.appendChild(cell1_1);

    let cell1_2 = document.createElement("td");
    cell1_2.appendChild(cosplay);
    row1.appendChild(cell1_2);

    table.appendChild(row1);

    // 创建第二行:弹幕模板下拉菜单
    let row2 = document.createElement("tr");
    let cell2_1 = document.createElement("td");
    cell2_1.textContent = "弹幕模板:";
    row2.appendChild(cell2_1);

    let cell2_2 = document.createElement("td");
    cell2_2.appendChild(templateMenu);
    row2.appendChild(cell2_2);

    table.appendChild(row2);


    // 创建第三行:输入框和发送按钮
    let row3 = document.createElement("tr");

    let cell3_1 = document.createElement("td");
    cell3_1.textContent = "输入弹幕:";
    row3.appendChild(cell3_1);

    let cell3_2 = document.createElement("td");
    cell3_2.style.display = "flex";
    cell3_2.appendChild(inputField);

    inputField.style.marginRight = "10px";
    cell3_2.appendChild(sendButton);

    row3.appendChild(cell3_2);
    table.appendChild(row3);

    // 拖动逻辑
    let isDragging = false;
    let mouseDownX, mouseDownY, initX, initY;
    let mouse_throttle_flag = false;
    let mouse_throttle;

    floatWindow.onmousedown = function (e) {
        if (contentContainer.style.display === "none") {
            // 如果窗口是折叠状态,允许拖动
            isDragging = true;
            mouseDownX = e.pageX;
            mouseDownY = e.pageY;
            initX = floatWindow.offsetLeft;
            initY = floatWindow.offsetTop;

            // 禁止文本选择
            document.body.style.userSelect = "none";

            document.addEventListener("mousemove", onMouseMove);
            document.addEventListener("mouseup", onMouseUp);
        }
    };

    function onMouseMove(e) {
        if (isDragging) {
            if (!mouse_throttle_flag) {
                mouse_throttle_flag = true;
                mouse_throttle = setTimeout(() => {
                    mouse_throttle_flag = false;
                    let mouseMoveX = e.pageX,
                        mouseMoveY = e.pageY;
                    floatWindow.style.right =
                        window.innerWidth - mouseMoveX + mouseDownX - initX - 70 + "px";
                    floatWindow.style.top = mouseMoveY - mouseDownY + initY + "px";
                    floatWindow.style.transform = "none";
                }, 5);
            }
        }
    }

    function onMouseUp() {
        isDragging = false;

        // 恢复文本选择
        document.body.style.userSelect = "";

        document.removeEventListener("mousemove", onMouseMove);
        document.removeEventListener("mouseup", onMouseUp);
    }

    // +1 部分 ==============================================================================================================
    function addButtonToContainer() {
        // 查找按钮容器
        let container = document.querySelector(".btnscontainer-4e2ed0");
        if (!container) return;

        // 检查容器中是否已经存在 +1 按钮
        if (container.querySelector(".plus-one-button")) return;

        // 创建一个分隔符
        let separator = document.createElement("p");
        separator.className = "sugun-e3fbf6";
        separator.textContent = "|";
        container.appendChild(separator);

        // 以与现有按钮相同的样式创建 +1 按钮
        let button = document.createElement("div");
        button.className = "labelfisrt-407af4 plus-one-button"; // 为 +1 按钮添加一个特定的类名
        button.textContent = "+1";
        container.appendChild(button);

        // 为 +1 按钮设置点击事件
        button.onclick = function () {
            let textContent =
                hoveredElement.querySelector(".text-edf4e7").textContent;
            sendDanmu(textContent);
        };

        button.addEventListener("click", function() {
            window.scrollTo(0, 0); // 滚动到页面顶部
        });
    }

    let hoveredElement = null;

    // 当鼠标悬停在具有特定类的元素上时,显示 +1 按钮
    document.addEventListener("mouseover", function (event) {
        // 检查容器中是否已经存在 +1 按钮,防止hoverElement不一致
        let container = document.querySelector(".btnscontainer-4e2ed0");
        if (!container) return;
        if (container.querySelector(".plus-one-button")) return;

        if (event.target.classList.contains("danmuItem-f8e204")) {
            hoveredElement = event.target;
            addButtonToContainer();
        }
    });

    // 防复读部分 ==============================================================================================================
    // 创建一个数组用于维护弹幕的顺序
    const danmuArray = [];

    // 初始化弹幕屏蔽状态
    let blockDanmu = false;

    // 创建按钮
    const button = document.createElement("div");
    button.style.position = "fixed";
    button.style.right = "0";
    button.style.bottom = "40%";
    button.style.backgroundColor = "orange";
    button.style.padding = "10px";
    button.style.cursor = "pointer";
    button.style.zIndex = "10000";
    button.textContent = "屏蔽复读";
    document.body.appendChild(button);

    // 为按钮添加点击事件监听器
    button.addEventListener("click", () => {
        blockDanmu = !blockDanmu;
        button.textContent = blockDanmu ? "开启复读" : "屏蔽复读";
    });

    // 定义一个函数,用于开始观察弹幕容器
    function observeDanmuContainer() {
        const danmuContainer = document.querySelector(".comment-37342a");
        if (danmuContainer) {
            // 创建 MutationObserver 实例,用于观察弹幕容器的变化
            const observer = new MutationObserver((mutations) => {
                mutations.forEach((mutation) => {
                    mutation.addedNodes.forEach((node) => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            const textElement = node.querySelector(".text-edf4e7");
                            if (textElement) {
                                const danmuText = textElement.textContent;
                                if (blockDanmu && danmuArray.includes(danmuText)) {
                                    // 如果弹幕已经出现过,则隐藏该弹幕
                                    node.style.display = "none";
                                } else {
                                    // 如果 danmuArray 的长度达到了 50,则删除最旧的弹幕
                                    if (danmuArray.length >= 50) {
                                        danmuArray.shift();
                                    }
                                    // 将新弹幕添加到数组中
                                    danmuArray.push(danmuText);
                                }
                            }
                        }
                    });
                });
            });

            // 配置观察器选项
            const config = { childList: true, subtree: true, attributes: true };

            // 开始观察弹幕容器
            observer.observe(danmuContainer, config);

            // 清除定时器,停止尝试观察
            clearInterval(intervalId);
        }
    }

    // 每隔一秒尝试开始观察弹幕容器
    const intervalId = setInterval(observeDanmuContainer, 1000);

    // 折跃部分 ==============================================================================================================

    // 创建折跃按钮
    const tpButton = document.createElement("div");
    tpButton.style.position = "fixed";
    tpButton.style.right = "0";
    tpButton.style.bottom = "33%";
    tpButton.style.backgroundColor = "orange";
    tpButton.style.padding = "10px";
    tpButton.style.cursor = "pointer";
    tpButton.style.zIndex = "10000";
    tpButton.textContent = "下播折跃";
    document.body.appendChild(tpButton);

    // 发送弹幕,和主播说一声再见
    tpButton.addEventListener("click", () => {
        sendDanmu("下播4000+");
    });

    // 转到白石直播间,听鸡哥RPG求饶
    tpButton.addEventListener("click", function() {
        setTimeout(function() {
            window.location.href = "https://live.bilibili.com/859376";
        }, 500);
    });

})();