您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动在Klok上循环创建新聊天并随机选择提示,仅在 klokapp.ai 运行
当前为
- // ==UserScript==
- // @name Klok Automation
- // @namespace http://tampermonkey.net/
- // @version 1.2
- // @description 自动在Klok上循环创建新聊天并随机选择提示,仅在 klokapp.ai 运行
- // @author You
- // @match https://klokapp.ai/*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- // 验证当前域名是否为 klokapp.ai
- if (window.location.hostname !== 'klokapp.ai') {
- console.log('此脚本仅适用于 klokapp.ai 域名,当前域名:' + window.location.hostname);
- return;
- }
- // 带超时的等待元素出现的函数
- function waitForElement(selector, timeout = 10000) { // 默认10秒超时
- return Promise.race([
- new Promise((resolve) => {
- const interval = setInterval(() => {
- const element = document.querySelector(selector);
- if (element) {
- clearInterval(interval);
- resolve(element);
- }
- }, 500);
- }),
- new Promise((_, reject) => {
- setTimeout(() => reject(new Error(`等待元素 ${selector} 超时`)), timeout);
- })
- ]);
- }
- // 使用 XPath 等待元素出现的函数
- function waitForXPath(xpath, timeout = 10000) {
- return Promise.race([
- new Promise((resolve) => {
- const interval = setInterval(() => {
- const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
- const element = result.singleNodeValue;
- if (element) {
- clearInterval(interval);
- resolve(element);
- }
- }, 500);
- }),
- new Promise((_, reject) => {
- setTimeout(() => reject(new Error(`等待 XPath ${xpath} 超时`)), timeout);
- })
- ]);
- }
- // 带超时的等待四个按钮的容器出现的函数
- function waitForButtons(timeout = 10000) {
- return waitForElement('.flex.flex-col.lg\\:flex-row.justify-around.items-center.gap-1.w-full.xs\\:mb-40.md\\:mb-0', timeout);
- }
- // 带超时的等待加载指示器消失的函数
- function waitForLoadingToFinish(timeout = 10000) {
- return new Promise((resolve, reject) => {
- const startTime = Date.now();
- const checkLoading = () => {
- const loadingDots = document.querySelector('.style_loadingDots__6shQU');
- console.log('检查加载状态:', loadingDots ? '存在' : '不存在');
- if (!loadingDots || loadingDots.offsetParent === null) {
- clearInterval(interval);
- resolve();
- } else if (Date.now() - startTime > timeout) {
- clearInterval(interval);
- reject(new Error('等待加载指示器消失超时'));
- }
- };
- const interval = setInterval(checkLoading, 500);
- checkLoading(); // 立即检查一次
- });
- }
- // 模拟点击事件
- function simulateClick(element) {
- element.dispatchEvent(new MouseEvent('click', {
- bubbles: true,
- cancelable: true,
- view: window
- }));
- }
- // 单独的跳转检查函数
- function checkAndRedirect() {
- return new Promise(async (resolve) => {
- try {
- const counterElement = await waitForXPath('/html/body/div[1]/div[2]/div[2]/div[1]/div/div[1]/div[1]/div[2]/div[1]', 5000);
- const counterText = counterElement ? counterElement.textContent.trim() : '';
- const counter = parseInt(counterText) || 0;
- console.log('当前计数器值:', counterText, '解析为:', counter);
- if (counter === 10) {
- const nextPageUrl = 'https://earn.taker.xyz'; // 请替换为实际的下一页URL
- window.location.href = nextPageUrl;
- console.log('计数器为10,跳转到:', nextPageUrl);
- await new Promise(resolve => setTimeout(resolve, 2000)); // 等待2秒确认跳转
- resolve(); // 跳转后退出
- } else {
- console.log('计数器不为10,无需跳转');
- resolve();
- }
- } catch (error) {
- console.error('跳转检查出错:', error);
- resolve();
- }
- });
- }
- // 一次完整流程的执行
- async function runChatCycle() {
- try {
- console.log('开始新聊天周期');
- // 第一步:点击“New Chat”按钮
- const newChatButton = await waitForElement('a[href="/app"]', 5000);
- console.log('找到 New Chat 按钮,准备点击');
- simulateClick(newChatButton);
- await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒让页面响应
- // 第二步:等待四个按钮出现并随机点击一个
- const buttonsContainer = await waitForButtons();
- console.log('找到按钮容器,准备随机点击');
- const buttons = buttonsContainer.querySelectorAll('button');
- if (buttons.length > 0) {
- const randomIndex = Math.floor(Math.random() * buttons.length);
- simulateClick(buttons[randomIndex]);
- console.log('随机点击第', randomIndex + 1, '个按钮');
- await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒让页面响应
- } else {
- console.log('未找到按钮');
- return false;
- }
- // 等待加载指示器消失
- console.log('等待加载完成...');
- await waitForLoadingToFinish();
- console.log('加载完成');
- // 检查跳转
- await checkAndRedirect();
- return true; // 表示周期成功完成
- } catch (error) {
- console.error('聊天周期出错:', error);
- return false; // 表示周期失败
- }
- }
- // 主逻辑 - 循环执行
- (async () => {
- let maxCycles = 10; // 最大循环次数,可调整
- let cycleCount = 0;
- while (cycleCount < maxCycles) {
- console.log(`开始第 ${cycleCount + 1} 次循环`);
- const success = await runChatCycle();
- if (!success) {
- console.log('本周期失败,暂停10秒后重试');
- await new Promise(resolve => setTimeout(resolve, 10000)); // 失败后暂停10秒
- } else {
- cycleCount++;
- console.log(`本周期成功,完成 ${cycleCount} 次循环`);
- await new Promise(resolve => setTimeout(resolve, 2000)); // 成功后暂停2秒
- }
- // 单独检查计数器并跳转
- try {
- const counterElement = await waitForXPath('/html/body/div[1]/div[2]/div[2]/div[1]/div/div[1]/div[1]/div[2]/div[1]', 5000);
- const counterText = counterElement ? counterElement.textContent.trim() : '';
- const counter = parseInt(counterText) || 0;
- if (counter === 10) {
- console.log('检测到计数器为10,准备跳转');
- await checkAndRedirect(); // 调用跳转函数
- break; // 跳转后退出循环
- }
- } catch (error) {
- console.error('计数器检查超时:', error);
- }
- }
- console.log('脚本执行结束,总计完成', cycleCount, '次循环');
- })();
- // 提供手动触发跳转的接口
- window.checkAndRedirect = checkAndRedirect;
- })();