// ==UserScript== // @name 文明聊·抢红包 // @namespace http://tampermonkey.net/ // @version 0.5 // @description 实时检测抢红包 // @author ADVENT // @match *://wmliao.com/ // @match *://w.haven.chat/ // @match *://idns.chat/ // @grant none // @license GNU GPLv3 // @run-at document-end // ==/UserScript== (function() { 'use strict'; // 自定义属性名,用于标记已点击的元素 const CLICKED_FLAG = 'data-has-been-clicked'; // 配置需要检测的目标元素列表 const targetElements = [ { selector: '.inner.norIne.redbagBub', description: '红包气泡' }, { selector: '.btn.btn-sm.btn-block.btn-danger.openBtn', description: '拆红包' } ]; /** * 增强版点击函数:模拟真实用户点击(兼容更多场景) * @param {HTMLElement} element - 要点击的元素 */ function simulateRealClick(element) { // 1. 先判断元素是否可点击 if (!element || element.hidden || !element.offsetParent) { console.warn('元素不可见或不可点击,跳过:', element); return false; } // 2. 创建并触发原生鼠标事件(比直接click()更真实) try { // 模拟点击 const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); element.dispatchEvent(clickEvent); console.log('成功模拟真实点击:', element); return true; } catch (error) { console.error('模拟点击失败:', error); return false; } } /** * 查找并点击所有匹配的元素(每个仅点击一次) * @param {Object} target - 目标元素配置项 */ function findAndClickAllElements(target) { // 调试:打印当前找到的元素数量 const elements = document.querySelectorAll(target.selector); console.log(`检测到${target.description}数量:`, elements.length); if (elements.length > 0) { elements.forEach(element => { // 通过自定义属性判断是否已点击 if (!element.hasAttribute(CLICKED_FLAG)) { // 使用增强版点击函数 const clickSuccess = simulateRealClick(element); if (clickSuccess) { // 标记为已点击 element.setAttribute(CLICKED_FLAG, 'true'); console.log(`已成功点击${target.description}:`, element); } } }); } else { // 调试:没找到元素时打印提示,方便排查选择器问题 console.log(`未找到${target.description},选择器: ${target.selector}`); } } /** * 初始化DOM监听 */ function initObserver() { // 立即检查一次 targetElements.forEach(target => { findAndClickAllElements(target); }); // 创建观察者实例(增加属性监听,确保元素状态变化也能检测) const observer = new MutationObserver((mutations) => { mutations.forEach(() => { targetElements.forEach(target => { findAndClickAllElements(target); }); }); }); // 增强观察配置:监听属性变化(比如元素从隐藏变显示) const observerConfig = { childList: true, subtree: true, attributes: true, // 新增:监听元素属性变化 attributeFilter: ['class', 'style', 'hidden'] // 只监听关键属性 }; // 启动监听 if (document.body) { observer.observe(document.body, observerConfig); } else { document.addEventListener('DOMContentLoaded', () => { observer.observe(document.body, observerConfig); }); } // 额外保障:每2秒主动检查一次(防止MutationObserver漏检) setInterval(() => { targetElements.forEach(target => { findAndClickAllElements(target); }); }, 2000); // 页面卸载时清理 window.addEventListener('beforeunload', () => { observer.disconnect(); }); } // 启动脚本 initObserver(); })();