You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在检测Coin Drop的循环中仅点击页面元素一次?

解决方案

核心问题修复

你的问题根源在于每次检测到可领取的Coin Drop时,循环会遍历所有符合条件的元素并重复点击弹窗,导致弹窗被频繁关闭/打开,打断后续的领取按钮点击。我们需要修改逻辑,找到第一个可领取项后仅打开一次弹窗,然后专注重复点击领取按钮,直到领取完成。

修改后的代码如下:

// 全局状态:区分当前是检测阶段还是领取阶段
let isClaiming = false;

function checkForCoinDrop() {
    if (isClaiming) return; // 如果正在领取,跳过检测
    
    const coinDropElements = document.getElementsByClassName("coindrop-status");
    // 从后往前找第一个可领取的元素
    for (let i = coinDropElements.length - 1; i >= 0; i--) {
        const element = coinDropElements[i];
        if (element.innerText.trim() === "Grab") {
            isClaiming = true; // 标记进入领取状态
            element.click(); // 仅点击一次打开弹窗
            
            // 启动领取循环
            startClaimingLoop();
            return; // 找到第一个后立即退出循环,避免重复点击
        }
    }
}

function startClaimingLoop() {
    // 点击领取按钮(保留你原来的坐标点击,建议后续替换为元素选择器)
    function clickClaimButton() {
        try {
            document.elementFromPoint(1250, 840).click();
        } catch (e) {
            // 如果点击失败(比如弹窗已关闭),退出领取状态,回到检测
            isClaiming = false;
            return;
        }
        
        // 检查是否还在领取状态,继续重复点击
        if (isClaiming) {
            setTimeout(clickClaimButton, 500); // 缩短间隔,提高领取成功率
        }
    }
    
    // 等待弹窗加载完成后开始点击
    setTimeout(clickClaimButton, 1000);
}

// 启动检测轮询
setInterval(checkForCoinDrop, 800);

关键改进点

  • 状态锁isClaiming:防止检测和领取流程同时执行,避免重复打开弹窗
  • 找到目标后立即退出循环:确保只打开一次弹窗
  • 分离检测与领取逻辑:代码更清晰,便于维护
  • 错误捕获:如果领取按钮点击失败(比如弹窗消失),自动回到检测状态

额外优化建议

  1. 替换坐标点击为元素选择器
    坐标点击依赖窗口尺寸,很不稳定。建议用弹窗内领取按钮的类名/ID来定位,比如:

    // 示例:假设领取按钮类名为"coin-claim-btn"
    const claimBtn = document.querySelector(".coin-claim-btn");
    if (claimBtn) claimBtn.click();
    
  2. 用MutationObserver代替轮询
    轮询会持续占用资源,用MutationObserver监听页面元素变化,只有当coindrop-status元素变化时才触发检测,更高效:

    const observer = new MutationObserver(() => {
        checkForCoinDrop();
    });
    // 监听body下的元素变化(可根据实际情况缩小监听范围)
    observer.observe(document.body, { childList: true, subtree: true });
    
  3. 避免全局变量
    可以用IIFE(立即执行函数表达式)封装代码,避免污染全局作用域:

    (function() {
        let isClaiming = false;
        // 这里放checkForCoinDrop和startClaimingLoop函数
        setInterval(checkForCoinDrop, 800);
    })();
    
  4. 添加日志便于调试
    因为Coin Drop出现频率低,添加日志可以帮助你确认脚本执行状态:

    console.log("检测到可领取的Coin Drop,打开弹窗");
    console.log("正在重复点击领取按钮...");
    console.log("领取完成,回到检测状态");
    

内容的提问来源于stack exchange,提问作者AuspiciousSilver34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:35:26