【FSU扩展插件】自动点击领取奖励按钮

【EAFCFUT模式】SBC任务便捷操作增强器辅助,自动在0.5秒后点击"领取奖励"按钮

// ==UserScript==
// @name         【FSU扩展插件】自动点击领取奖励按钮
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  【EAFCFUT模式】SBC任务便捷操作增强器辅助,自动在0.5秒后点击"领取奖励"按钮
// @author       Thadike
// @match        https://www.ea.com/ea-sports-fc/ultimate-team/web-app/*
// @match        https://www.easports.com/*/ea-sports-fc/ultimate-team/web-app/*
// @match        https://www.ea.com/*/ea-sports-fc/ultimate-team/web-app/*
// @grant        none
// @license MIT
// ==/UserScript==
(function() {
    'use strict';

    // 存储定时器ID,避免重复点击
    let clickTimer = null;
    let activeButton = null;
    let processedButtons = new Set(); // 记录已处理的按钮

    // 创建一个新的MutationObserver实例
    const observer = new MutationObserver(mutationsList => {
        for (const mutation of mutationsList) {
            // 检查添加的节点
            if (mutation.type === 'childList') {
                for (const node of mutation.addedNodes) {
                    // 如果添加的节点是元素节点
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        // 递归检查新添加的节点及其子节点
                        checkForButton(node);
                    }
                }
            }
            // 检查属性变化
            else if (mutation.type === 'attributes' &&
                     mutation.target.classList.contains('btn-standard') &&
                     mutation.target.classList.contains('call-to-action')) {
                checkForButton(mutation.target);
            }
        }
    });

    // 检查节点是否是目标按钮或包含目标按钮
    function checkForButton(element) {
        // 直接查找目标按钮
        const buttons = element.querySelectorAll('button.btn-standard.call-to-action');
        buttons.forEach(button => {
            if (button.textContent.trim() === '领取奖励' && !processedButtons.has(button)) {
                handleButtonFound(button);
            }
        });

        // 如果当前元素是符合条件的按钮
        if (element.tagName === 'BUTTON' &&
            element.classList.contains('btn-standard') &&
            element.classList.contains('call-to-action') &&
            element.textContent.trim() === '领取奖励' &&
            !processedButtons.has(element)) {
            handleButtonFound(element);
        }
    }

    // 获取奖励描述信息
    function getRewardInfo(button) {
        try {
            // 向上查找包含奖励信息的父元素
            let parent = button.closest('.game-rewards-view');
            if (!parent) {
                // 尝试另一种查找方式
                parent = button.closest('div');
                while (parent && !parent.querySelector('.description') && !parent.querySelector('h1')) {
                    parent = parent.parentElement;
                }
            }

            if (parent) {
                // 获取奖励标题
                const titleElement = parent.querySelector('h1');
                const title = titleElement ? titleElement.textContent.trim() : '奖励';

                // 获取奖励描述
                const descriptionElement = parent.querySelector('.description');
                const description = descriptionElement ? descriptionElement.textContent.trim() : '未知奖励';

                return { title, description };
            }
        } catch (error) {
            console.error('获取奖励信息失败:', error);
        }
        return { title: '奖励', description: '未知奖励' };
    }

    // 显示通知
    function showNotification(message, duration = 5000) {
        // 防止重复通知
        if (document.querySelector('.custom-notification')?.textContent === message) {
            return;
        }

        // 创建通知元素
        const notification = document.createElement('div');
        notification.className = 'custom-notification';
        notification.textContent = message;

        // 设置样式
        notification.style.cssText = `
            position: fixed;
            top: 20px;
            right: 20px;
            background-color: #4CAF50;
            color: white;
            padding: 12px 20px;
            border-radius: 4px;
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
            z-index: 9999;
            opacity: 0;
            transform: translateY(-20px);
            transition: opacity 0.3s, transform 0.3s;
            max-width: 300px;
            word-wrap: break-word;
        `;

        // 添加到页面
        document.body.appendChild(notification);

        // 触发动画
        setTimeout(() => {
            notification.style.opacity = '1';
            notification.style.transform = 'translateY(0)';
        }, 10);

        // 添加关闭按钮
        const closeBtn = document.createElement('span');
        closeBtn.innerHTML = '×';
        closeBtn.style.cssText = `
            position: absolute;
            top: 5px;
            right: 10px;
            cursor: pointer;
            font-size: 16px;
        `;
        closeBtn.onclick = () => {
            notification.style.opacity = '0';
            notification.style.transform = 'translateY(-20px)';
            setTimeout(() => {
                document.body.removeChild(notification);
            }, 300);
        };
        notification.appendChild(closeBtn);

        // 自动关闭
        setTimeout(() => {
            notification.style.opacity = '0';
            notification.style.transform = 'translateY(-20px)';
            setTimeout(() => {
                document.body.removeChild(notification);
            }, 300);
        }, duration);
    }

    // 处理找到按钮的情况
    function handleButtonFound(button) {
        // 如果有正在处理的按钮,检查是否是同一个
        if (activeButton === button) return;

        // 如果有其他按钮正在等待点击,取消它
        if (clickTimer) {
            clearTimeout(clickTimer);
            if (activeButton) {
                activeButton.style.backgroundColor = ''; // 重置之前按钮的样式
            }
        }

        // 设置新的活跃按钮
        activeButton = button;
        processedButtons.add(button); // 标记为已处理

        // 设置新的定时器,在0.5秒后点击按钮
        clickTimer = setTimeout(() => {
            try {
                // 添加点击前的视觉反馈
                button.style.backgroundColor = 'red';

                // 创建更完整的点击事件
                const clickEvent = new MouseEvent('click', {
                    view: window,
                    bubbles: true,
                    cancelable: true,
                    clientX: button.getBoundingClientRect().left + button.offsetWidth / 2,
                    clientY: button.getBoundingClientRect().top + button.offsetHeight / 2
                });

                // 触发更真实的点击事件序列
                const mouseOverEvent = new MouseEvent('mouseover', {
                    view: window,
                    bubbles: true,
                    cancelable: true
                });

                const mouseDownEvent = new MouseEvent('mousedown', {
                    view: window,
                    bubbles: true,
                    cancelable: true
                });

                const mouseUpEvent = new MouseEvent('mouseup', {
                    view: window,
                    bubbles: true,
                    cancelable: true
                });

                // 触发完整的点击序列
                button.dispatchEvent(mouseOverEvent);
                setTimeout(() => {
                    button.dispatchEvent(mouseDownEvent);
                    setTimeout(() => {
                        button.dispatchEvent(mouseUpEvent);
                        button.dispatchEvent(clickEvent);

                        // 点击后的视觉反馈
                        button.style.backgroundColor = 'green';

                        // 获取奖励信息并显示通知
                        const { title, description } = getRewardInfo(button);
                        const notificationMsg = `【已自动成功获取${title}】:${description}`;
                        showNotification(notificationMsg);

                        console.log(`已自动点击"领取奖励"按钮:${title} - ${description}`);

                        // 点击后检查按钮是否还在DOM中,如果不在则从集合中移除
                        setTimeout(() => {
                            if (!document.contains(button)) {
                                processedButtons.delete(button);
                            }
                        }, 1000);

                    }, 50); // 模拟鼠标按下和释放之间的延迟
                }, 50);

            } catch (error) {
                console.error('点击按钮时出错:', error);
                showNotification(`领取奖励失败:${error.message}`, 8000);
            } finally {
                // 重置状态
                activeButton = null;
                clickTimer = null;
            }
        }, 500);
    }

    // 开始观察DOM变化
    observer.observe(document.documentElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['class', 'textContent']
    });

    // 页面加载完成后也检查一次
    window.addEventListener('load', () => {
        checkForButton(document);
    });

    // 添加页面卸载时的清理
    window.addEventListener('unload', () => {
        if (observer) observer.disconnect();
        if (clickTimer) clearTimeout(clickTimer);
        if (activeButton) activeButton.style.backgroundColor = '';
        processedButtons.clear();
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址