// ==UserScript== // @name 猫耳迎宾机器人 // @version 1.6 // @description 一个简单的迎宾机器人 // @author 洋子 // @match https://fm.missevan.com/live/* // @icon https://static.maoercdn.com/avatars/202408/25/2bf1715cfc845d8b4da511d8f5345fec210801.jpg?x-oss-process=style/avatar // @grant none // @namespace https://greasyfork.org/users/1357490 // @require https://cdn.jsdelivr.net/npm/pinyin-pro@3.18.2/dist/index.js // @downloadURL none // ==/UserScript== (function() { 'use strict'; let roomId = "457623614"; let welcomedUsers = []; let isWelcomingEnabled = true; // 创建可隐藏的控制面板和按钮的容器 function createControlPanelContainer() { const container = document.createElement('div'); container.style.position = 'fixed'; container.style.top = '10px'; container.style.right = '10px'; container.style.zIndex = '10000'; container.style.cursor = 'move'; // 使容器可以拖动 const panel = document.createElement('div'); panel.style.backgroundColor = '#f0f0f0'; panel.style.border = '1px solid #ccc'; panel.style.padding = '10px'; panel.style.display = 'none'; // 默认隐藏 panel.style.position = 'relative'; // 使面板在容器内定位 panel.innerHTML = `
`; // 创建控制面板按钮 const toggleButton = document.createElement('button'); toggleButton.style.background = `url('https://static.maoercdn.com/avatars/202408/25/2bf1715cfc845d8b4da511d8f5345fec210801.jpg?x-oss-process=style/avatar') no-repeat center center`; toggleButton.style.backgroundSize = 'cover'; toggleButton.style.border = 'none'; toggleButton.style.width = '50px'; toggleButton.style.height = '50px'; toggleButton.style.cursor = 'pointer'; toggleButton.textContent = ''; // 默认显示文字,便于访问性 container.appendChild(toggleButton); container.appendChild(panel); document.body.appendChild(container); // 保存设置按钮点击事件 document.getElementById('saveSettingsBtn').addEventListener('click', () => { roomId = document.getElementById('roomIdInput').value; isWelcomingEnabled = document.getElementById('welcomeToggle').checked; alert("设置已保存!"); }); // 切换控制面板显示 toggleButton.addEventListener('click', () => { if (panel.style.display === 'none') { panel.style.display = 'block'; toggleButton.textContent = ''; } else { panel.style.display = 'none'; toggleButton.textContent = ''; } }); // 添加拖动功能 makeDraggable(container); return container; } // 使容器可以拖动 function makeDraggable(element) { let isDragging = false; let offsetX, offsetY; element.addEventListener('mousedown', (e) => { isDragging = true; offsetX = e.clientX - parseInt(window.getComputedStyle(element).left, 10); offsetY = e.clientY - parseInt(window.getComputedStyle(element).top, 10); element.style.cursor = 'move'; }); window.addEventListener('mousemove', (e) => { if (isDragging) { element.style.left = `${e.clientX - offsetX}px`; element.style.top = `${e.clientY - offsetY}px`; } }); window.addEventListener('mouseup', () => { isDragging = false; element.style.cursor = 'default'; }); } // 创建并添加控制面板容器到页面 createControlPanelContainer(); // 过滤消息中的屏蔽词 function filterMessage(message, filterWords) { filterWords.forEach(word => { let regex = new RegExp(word, 'g'); message = message.replace(regex, '***'); }); return message; } // 屏蔽词数组示例 let filterWords = ["不良词1", "不良词2"]; // 生成UUID v4 function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } // 封装的发送消息函数 async function sendMessage(message) { let filteredMessage = filterMessage(message, filterWords); const url = 'https://fm.missevan.com/api/chatroom/message/send'; const data = { room_id: roomId, message: filteredMessage, uuid: generateUUID() }; const options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'user-agent': navigator.userAgent, 'cookie': document.cookie, 'origin': 'missevan.com', 'referer': `https://fm.missevan.com/live/${roomId}` }, body: JSON.stringify(data) }; try { const response = await fetch(url, options); const responseData = await response.json(); if (responseData.code === 0) { console.log('消息发送成功:', responseData); } else { console.error('发送失败:', responseData); } } catch (error) { console.error('请求错误:', error); } } // 每秒检测新用户加入 setInterval(() => { if (!isWelcomingEnabled) return; const appElement = document.querySelector('app'); if (appElement) { const appContent = appElement.innerHTML; const parser = new DOMParser(); const doc = parser.parseFromString(appContent, 'text/html'); const chatboxDiv = doc.querySelector('div#ChatBox'); if (chatboxDiv) { const joinDivs = chatboxDiv.querySelectorAll('div.join-queue-effect.show.clickable'); if (joinDivs.length > 0) { joinDivs.forEach((userDiv) => { let usernameDiv = userDiv.querySelector('.username'); let username = usernameDiv ? usernameDiv.textContent.trim() : ''; if (username && !welcomedUsers.includes(username)) { welcomedUsers.push(username); let date = new Date().toISOString().slice(0, 19).replace('T', ' '); let pinyinUsername = pinyinPro.pinyin(username, { style: pinyinPro.STYLE_NORMAL }); let welcomeMessage = `| 欢迎${username}\n| 拼音: ${pinyinUsername}\n| 日期: ${date}`; sendMessage(welcomeMessage); console.log(`用户 ${username} (${pinyinUsername}) 已加入并发送欢迎消息`); } }); } } else { console.log('未找到 id 为 ChatBox 的 div'); } } else { console.log('未找到 标签'); } }, 1000); // 每秒检测一次 })();