// ==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); // 每秒检测一次
})();