nicexi 发表于 前天 22:34

gcp44自动重试脚本

不知道为啥我一直44,在想道是不是卡的问题,我用的infini ,号也是是五六年的老号,经常用,等夜晚试试换bybit看看
隔壁论坛的大佬说是玄学,有的人infini成功了的。gcp分为aistudio和vertexai,其中aistudio是大部分人使用的

看样子是共用300美金,总共是1000赠金的vertexai和300的初始送的,我是看别的佬友帖子图片显示的

// ==UserScript==
// @name         Google Cloud 注册流程自动化
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description自动点击"同意並繼續",然后"免費試用",如果出现"確定"则刷新重试。
// @author       Your Name
// @match      https://console.cloud.google.com/freetrial/signup/*
// @grant      GM_setValue
// @grant      GM_getValue
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    // --- 配置 ---
    const XPATH_BUTTON_AGREE = "//button[.//span]"; // 第一个按钮
    const XPATH_BUTTON_FREE_TRIAL = "//button[.//span]"; // 第二个按钮
    const XPATH_BUTTON_CONFIRM = "//button[.//span]";    // 第三个按钮 (检查用)

    const WAIT_TIMEOUT_MS = 30000;      // 等待按钮出现的最大时间 (毫秒, 30秒)
    const POST_CLICK_DELAY_MIN_MS = 1000; // 点击后等待的最小时间 (毫秒)
    const POST_CLICK_DELAY_MAX_MS = 2000; // 点击后等待的最大时间 (毫秒)
    const CONFIRM_CHECK_TIMEOUT_MS = 5000; // 点击免费试用后,检查确定按钮出现的时间窗口 (毫秒, 5秒)

    // 使用 GM_* 函数来持久化运行状态,以便刷新后能自动重启
    const STORAGE_KEY_RUNNING = 'googleCloudAutoClickerRunning';

    let isRunning = false;      // 当前脚本是否激活运行
    let controlButton = null;   // 控制按钮的引用

    // --- 帮助函数 ---

    function log(message) {
      console.log(` ${message}`);
    }
    function logWarn(message) {
      console.warn(` ${message}`);
    }
    function logError(message) {
      console.error(` ${message}`);
    }

    // 等待函数
    function wait(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 获取随机延迟
    function getRandomDelay(min = POST_CLICK_DELAY_MIN_MS, max = POST_CLICK_DELAY_MAX_MS) {
      return Math.random() * (max - min) + min;
    }

    // 查找元素,带超时和可见性检查
    async function findElement(xpath, timeout = WAIT_TIMEOUT_MS) {
      log(`查找元素 (超时 ${timeout / 1000}s): ${xpath}`);
      const startTime = Date.now();
      while (Date.now() - startTime < timeout) {
            if (!isRunning) return null; // 如果中途停止了,返回 null

            try {
                const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
                const element = result.singleNodeValue;
                // 检查元素是否存在且可见 (offsetParent !== null 是一个常用但不完美的检查)
                if (element && element.offsetParent !== null) {
                  log(`元素找到: ${xpath}`);
                  return element;
                }
            } catch (error) {
                logError(`查找元素时 XPath 出错: ${xpath} - ${error}`);
                return null; // XPath 错误,停止查找
            }
            await wait(250); // 每 250ms 检查一次
      }
      logWarn(`查找元素超时 (${timeout / 1000}s): ${xpath}`);
      return null; // 超时未找到
    }

   // 仅检查元素是否存在,不长时间等待
    function checkElementExists(xpath) {
      try {
            const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
            return result.singleNodeValue !== null;
      } catch (error) {
            logError(`检查元素存在性时 XPath 出错: ${xpath} - ${error}`);
            return false;
      }
    }

    // 安全点击元素 (包括尝试 JS 点击)
    function clickElement(element, elementName) {
      try {
            log(`尝试点击 '${elementName}'...`);
            element.click();
            log(`'${elementName}' 点击成功。`);
            return true;
      } catch (e) {
             logError(`点击 '${elementName}' 时出错: ${e}`);
             logWarn(`尝试使用 JS 点击 '${elementName}'...`);
             try {
               element.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
               log(`'${elementName}' JS 点击成功。`);
               return true;
             } catch (jsE) {
               logError(`JS 点击 '${elementName}' 也失败: ${jsE}`);
               return false;
             }
      }
    }

    // 刷新页面
    function refreshPage() {
      log("准备刷新页面...");
      if (isRunning) { // 只有在脚本激活状态下才执行刷新
            log("正在刷新...");
            // 在刷新前确保状态已保存为 true (如果 stopLoop 没有被意外调用)
            GM_setValue(STORAGE_KEY_RUNNING, true);
            setTimeout(() => window.location.reload(), 500); // 短暂延迟后刷新
      } else {
            logWarn("脚本已停止,取消刷新。");
      }
    }

    // --- 主要工作流程 ---
    async function mainWorkflow() {
      if (!isRunning) return;
      log("=== 开始新流程 ===");

      // --- 步骤 1: 点击 "同意並繼續" ---
      const buttonAgree = await findElement(XPATH_BUTTON_AGREE);
      if (!buttonAgree) {
            logError("找不到 '同意並繼續' 按钮。可能是页面结构变化或未加载。停止流程。");
            stopLoop(); // 停止,不刷新,让用户检查
            alert("自动点击器:找不到 '同意並繼續' 按钮,脚本已停止。");
            return;
      }
      if (!clickElement(buttonAgree, "同意並繼續")) {
            logError("点击 '同意並繼續' 失败。停止流程。");
            stopLoop();
            alert("自动点击器:点击 '同意並繼續' 失败,脚本已停止。");
            return;
      }

      // --- 步骤 2: 等待并点击 "免費試用" ---
      const buttonFreeTrial = await findElement(XPATH_BUTTON_FREE_TRIAL);
      if (!buttonFreeTrial) {
            logError(`'免費試用' 按钮未在 ${WAIT_TIMEOUT_MS / 1000} 秒内出现。刷新页面重试...`);
            refreshPage(); // 未找到则刷新重试
            return;
      }
      if (!clickElement(buttonFreeTrial, "免費試用")) {
            logError("点击 '免費試用' 失败。刷新页面重试...");
            refreshPage(); // 点击失败也刷新重试
            return;
      }

      // --- 步骤 3: 点击后等待 1-2 秒 ---
      const delay = getRandomDelay();
      log(`等待 ${delay.toFixed(0)} 毫秒...`);
      await wait(delay);
      if (!isRunning) return; // 检查是否在等待期间被停止

      // --- 步骤 4: 检查 "確定" 按钮是否在短时间内出现 ---
      log(`检查 '確定' 按钮是否在 ${CONFIRM_CHECK_TIMEOUT_MS / 1000} 秒内出现...`);
      let confirmButtonFound = false;
      const checkStartTime = Date.now();
      while (Date.now() - checkStartTime < CONFIRM_CHECK_TIMEOUT_MS) {
             if (!isRunning) return; // 检查是否在等待期间被停止
             if (checkElementExists(XPATH_BUTTON_CONFIRM)) {
               log("'確定' 按钮已找到!符合预期,准备刷新页面重新开始。");
               confirmButtonFound = true;
               break;
             }
             await wait(200); // 短暂等待再次检查
      }

      // --- 步骤 5: 根据是否找到 "確定" 按钮决定操作 ---
      if (confirmButtonFound) {
            // 如果找到了 "確定",说明流程按预期进行到了需要刷新的步骤
            refreshPage();
      } else {
            // 如果在检查时间内 *没有* 找到 "確定" 按钮
            logWarn(`在 ${CONFIRM_CHECK_TIMEOUT_MS / 1000} 秒内未检测到 '確定' 按钮。这可能意味着流程卡住或有变化。将刷新页面重试。`);
            // 即使没找到,也按你的要求刷新重试
            refreshPage();
      }
    }

    // --- 控制逻辑 ---
    function startLoop() {
      if (isRunning) {
            log("流程已经在运行中。");
            return;
      }
      log("=== 启动自动流程 ===");
      isRunning = true;
      GM_setValue(STORAGE_KEY_RUNNING, true); // 保存状态
      if (controlButton) {
            controlButton.textContent = '停止流程 (运行中)';
            controlButton.style.backgroundColor = '#dc3545';
      }
      mainWorkflow(); // 启动流程
    }

    function stopLoop() {
      if (!isRunning && GM_getValue(STORAGE_KEY_RUNNING, false) === false) {
             log("流程并未运行。");
             return; // 如果已经是停止状态,则不执行任何操作
      }
      log("=== 停止自动流程 ===");
      isRunning = false;
      GM_setValue(STORAGE_KEY_RUNNING, false); // 保存状态
      if (controlButton) {
            controlButton.textContent = '开始自动流程';
            controlButton.style.backgroundColor = '#28a745';
      }
      // 不需要清除延时,因为 async 函数中的 await 会在 isRunning 变为 false 时自然退出循环
    }

    // --- 创建控制按钮 ---
    function createControlButton() {
      if (document.getElementById('autoClickerControlButton')) return; // 防止重复创建

      controlButton = document.createElement('button');
      controlButton.id = 'autoClickerControlButton';
      controlButton.style.position = 'fixed';
      controlButton.style.bottom = '20px';
      controlButton.style.right = '20px';
      controlButton.style.zIndex = '9999';
      controlButton.style.padding = '10px 15px';
      controlButton.style.color = 'white';
      controlButton.style.border = 'none';
      controlButton.style.borderRadius = '5px';
      controlButton.style.cursor = 'pointer';
      controlButton.style.fontSize = '14px';
      controlButton.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';

      // 初始化按钮状态
      if (GM_getValue(STORAGE_KEY_RUNNING, false)) {
            controlButton.textContent = '停止流程 (运行中)';
            controlButton.style.backgroundColor = '#dc3545';
      } else {
            controlButton.textContent = '开始自动流程';
            controlButton.style.backgroundColor = '#28a745';
      }

      controlButton.addEventListener('click', () => {
            // 读取当前存储的状态,以防万一 isRunning 变量状态不一致
            if (GM_getValue(STORAGE_KEY_RUNNING, false)) {
                stopLoop();
            } else {
                startLoop();
            }
      });

      document.body.appendChild(controlButton);
      log("控制按钮已创建。");
    }

    // --- 脚本入口 ---
    log("脚本加载。");
    createControlButton(); // 创建按钮

    // 检查是否应该在页面加载后自动启动
    if (GM_getValue(STORAGE_KEY_RUNNING, false)) {
      log("检测到上次运行时脚本处于激活状态,自动启动流程。");
      startLoop();
    } else {
      log("脚本当前处于停止状态。请点击按钮启动。");
    }

})();
页: [1]
查看完整版本: gcp44自动重试脚本