timer

for q11e

// ==UserScript==
// @name         timer
// @namespace    http://sugarblack.top
// @version      1.2.1
// @description  for q11e
// @author       zemelee
// @match        http://sugarblack.top/*
// ==/UserScript==

// 看!这!里!
//1. 转到 TamperMonkey 插件,创建新脚本,删除新脚本里的所有内容
//2. 然后请将所有文本(包括上面的部分)复制到脚本中并保存。刷新 http://sugarblack.top 就可以生效
//3. 如果未生效请打开浏览器的开发者模式 
// . Edge浏览器可以在 edge://extensions 打开, Chrome浏览器可以在 chrome://extensions 打开

// . 设置参数后点击start(不是提交按钮,是start按钮),网页就会自己刷问卷,同时不影响你用电脑做其他任务,只要不影响刷问卷网页即可
// . 单次start前,网页会自动等待 (最小间隔~最大间隔) 之间的随机秒数,然后自动提交预设的份数
// . 单次提交数量 * 循环次数 = 总提交份数
//   ================ 举个🌰 ================
// . 设 单次提交份数设置=4,最小间隔=10,最大间隔=30,循环次数=3,点击start
// . 网页会自动等到10~30s,然后自动提交4份,这4份的提交时间是挨着的,并不会相隔10~30s
// . 10~30s后,网页会再自动提交4份;时间相邻的是上次的4份和这次的4份,而不是一次提交的4份中互相间隔了10~30s
// . 再等10~30s后,网页会再自动提交4份。循环结束,总共提交3*4=12份,累计耗时 10*3~30*3 秒,也就是30~90s
//  =========================================
// 若需要终止循环,刷新或关闭网页即可~~~



async function oneTime(count) {
    let homeBtn = document.querySelector("#home-btn");
    homeBtn.click()
    await new Promise((resolve) => { setTimeout(resolve, 1000); });
    let inputEl = document.querySelector("#submit-number")
    inputEl.value = count
    const inputEvent = new Event('input', { bubbles: true });
    inputEl.dispatchEvent(inputEvent);
    await new Promise((resolve) => { setTimeout(resolve, 500); });
    let submitBtn = document.querySelector("#submit-btn");
    submitBtn.click()
    await new Promise((resolve) => { setTimeout(resolve, 1000); });
    // const buttons = document.querySelectorAll('button');
    // const confirmBtn = Array.from(buttons).filter(button => button.innerText.trim() === '确认');
    // confirmBtn[0].click()
    let confirmBtn = document.querySelectorAll(".el-message-box>.el-message-box__btns>button")
    confirmBtn[0].click()
}

function showMessage(text, delay) {
    let messageBox = document.createElement('div');
    messageBox.textContent = text;
    messageBox.style.cssText = `
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translateX(-50%);
        background-color: rgba(0, 0, 0, 0.8);
        color: white;
        padding: 10px 20px;
        border-radius: 5px;
        z-index: 9999;
    `;
    document.body.appendChild(messageBox);
    setTimeout(() => {
        document.body.removeChild(messageBox);
        messageBox = null;
    }, delay); // 4 seconds
}

function validate(inputs) {
    let inputNum = inputs[0]
    let minInterval = inputs[1]
    let maxInterval = inputs[2]
    let inputFor = inputs[3]

    if (!inputNum.value || !minInterval.value || !maxInterval.value || !inputFor.value) {
        showMessage("minInterval maxInterval inputNum cycles need to be filled in completely", 3500)
        return false
    }
    if (Number(inputNum.value) >= 10 || Number(inputNum.value) < 1) {
        showMessage("输入数量必须大于1、小于10", 3500)
        return false
    }
    if (Number(minInterval.value) >= Number(maxInterval.value)) {
        showMessage("最小间隔必须小于最大间隔时长!", 3500)
        return false
    }
    if (Number(minInterval.value) < 10) {
        showMessage("最小间隔必须大于10s!", 3500)
        return false
    } 

    if (Number(inputFor.value) > 150 || Number(inputFor.value) < 1) {
        showMessage("循环次数介于[1, 150]之间!", 3500)
        return false
    }
    return true
}

async function executeRepeatedly(minDelay, maxDelay, forTime, singleCnt) {
    let count = 0;
    async function execute() {
        if (count < forTime) {
            const delay = Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay;
            showMessage(`Current cycle: ${count + 1}, Delay: ${delay}s`, 5000);
            await oneTime(singleCnt);
            count++;
            setTimeout(execute, delay * 1000);
        }
    }

    await execute();
    window.location.replace("http://sugarblack.top/#/home/params");
}


(async function () {
    'use strict';
    
    let singleCnt = localStorage.getItem("singleCnt") || 1;
    let minInterval = localStorage.getItem("minInterval") || 10;
    let maxInterval = localStorage.getItem("maxInterval") || 30;
    let forTime = localStorage.getItem("forTime") || 5;
    await new Promise((resolve) => { setTimeout(resolve, 1000); });
    
    const container = document.querySelector("#app > div > div > div > div > div.main-content");
    const targetDiv = document.querySelector("#app > div > div > div > div > div.main-content > div.url-section");
    
    if (!container || !targetDiv) {
        return;
    }
    
    // 创建包装容器
    let controlContainer = document.createElement("div");
    controlContainer.className = "timer-controls";
    controlContainer.style.cssText = `
        padding: 5px 0 0 5px;
        background: #f5f5f5;
        border-radius: 8px;
    `;

    const label1 = document.createElement('label');
    const label2 = document.createElement('label');
    const label3 = document.createElement('label');
    const label4 = document.createElement('label');

    label1.textContent = "单次提交数量(建议1)";
    label2.textContent = "最小间隔(s)";
    label3.textContent = "最大间隔(s)";
    label4.textContent = "循环次数";

    let inputNum = document.createElement("input")
    let inputMinInterval = document.createElement("input")
    let inputMaxInterval = document.createElement("input")
    let inputFor = document.createElement("input")

    inputNum.placeholder = "inputNum";
    inputMinInterval.placeholder = "Min Interval (s)";
    inputMaxInterval.placeholder = "Max Interval (s)";
    inputFor.placeholder = "Number of cycles";

    if (singleCnt && minInterval && maxInterval && forTime) {
        inputNum.value = singleCnt;
        inputMinInterval.value = minInterval;
        inputMaxInterval.value = maxInterval;
        inputFor.value = forTime;
    }

    let inputs = [inputNum, inputMinInterval, inputMaxInterval, inputFor];
    let labels = [label1, label2, label3, label4];

    // 创建输入组容器
    inputs.forEach((item, index) => {
        let inputGroup = document.createElement('div');
        inputGroup.style.cssText = `
            display: inline-block;
            margin-right: 20px;
            margin-bottom: 10px;
        `;
        
        item.style.cssText = `
            width: 60px;
            padding: 5px;
            margin-left: 6px;
            border: 1px solid #ddd;
            border-radius: 4px;
        `;
        item.type = "number";
        
        inputGroup.appendChild(labels[index]);
        inputGroup.appendChild(item);
        controlContainer.appendChild(inputGroup);
    })

    let startBtn = document.createElement("button")
    startBtn.textContent = "开始任务"
    startBtn.style.cssText = `
        background: #409eff;
        color: white;
        border: none;
        padding: 8px 16px;
        border-radius: 4px;
        cursor: pointer;
        margin-left: 10px;
    `;
    startBtn.addEventListener("click", function () {
        if (!validate(inputs)) return

        singleCnt = inputNum.value;
        const newMinInterval = inputMinInterval.value;
        const newMaxInterval = inputMaxInterval.value;
        forTime = inputFor.value;

        localStorage.setItem("singleCnt", singleCnt)
        localStorage.setItem("minInterval", newMinInterval)
        localStorage.setItem("maxInterval", newMaxInterval)
        localStorage.setItem("forTime", forTime)

        executeRepeatedly(+newMinInterval, +newMaxInterval, +forTime, +singleCnt)
    })
    
    controlContainer.appendChild(startBtn);
    
    // 在指定位置插入新元素
    container.insertBefore(controlContainer, targetDiv);
 
})();