Nedo Auto Contest Participation Script

Автоматом заходит в тему с розырышем и пролистывает до кнопки участия, после капчи автоматом принимает участие и выходит с темы и заходит в следуюущую.

目前為 2024-10-31 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Nedo Auto Contest Participation Script
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  Автоматом заходит в тему с розырышем и пролистывает до кнопки участия, после капчи автоматом принимает участие и выходит с темы и заходит в следуюущую.
// @author       eretly
// @match        https://lolz.live/threads/*
// @match        https://lolz.live/forums/contests/
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Конфиг
    const CONTEST_LIST_URL = 'https://lolz.live/forums/contests/';
    const CHECK_INTERVAL = 100; // ms
    const PARTICIPATION_WAIT = 3000; // ms, ждем 3 секунды, прежде чем проверять скрытое состояние кнопки (если вы проходите капчу за 1 секунду после захода в тему, то уменьшите)
    const SCROLL_ATTEMPTS = 3; // Количество попыток прокрутки (ненужная хуйня)
    const SCROLL_INTERVAL = 1000; // ms, интервал между попытками прокрутки (тоже ненужная хуйня)
    const SCROLL_OFFSET = 10; // px, Выше (0+) / Ниже (-0) прокручивать страницу
    const DOUBLE_CHECK_DELAY = 500; // ms, задержка перед повторной проверкой скролла (типо если не долистал до конца, чет прогрузилось на странице, через 0.5 сек чекнет и долистает как надо - поставил оптимальное для себя)
    const BEFORE_CLICK_DELAY = 100; // ms, задержка перед нажатием на кнопку
    const AFTER_CLICK_DELAY = 300; // ms, задержка после нажатия на кнопку

    function scrollToElement() {
        const xpath = "/html/body/div[4]/div/div/div/form/ol/li/div[2]/div[3]/article/div";
        let scrollAttempts = 0;

        function attemptScroll() {
            const element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

            if (element) {
                const elementRect = element.getBoundingClientRect();
                const absoluteElementTop = elementRect.top + window.pageYOffset;
                const middleOfElement = absoluteElementTop + elementRect.height / 2;
                const scrollTo = middleOfElement - (window.innerHeight / 2) - SCROLL_OFFSET;

                window.scrollTo({
                    top: scrollTo,
                    behavior: 'smooth'
                });
                console.log('Scrolled to element');

                setTimeout(() => {
                    const newElementRect = element.getBoundingClientRect();
                    if (newElementRect.top > SCROLL_OFFSET) {
                        console.log('Element not at desired position, adjusting...');
                        window.scrollTo({
                            top: window.pageYOffset + newElementRect.top - SCROLL_OFFSET,
                            behavior: 'smooth'
                        });
                    }
                }, DOUBLE_CHECK_DELAY);
            } else {
                console.log('Element not found, retrying...');
                if (scrollAttempts < SCROLL_ATTEMPTS) {
                    scrollAttempts++;
                    setTimeout(attemptScroll, SCROLL_INTERVAL);
                } else {
                    console.log('Failed to find element after multiple attempts');
                }
            }
        }

        attemptScroll();
    }

    function clickFirstContestLink() {
        const selector = ".discussionListItem a.listBlock.main.PreviewTooltip";
        const link = document.querySelector(selector);
        if (link) {
            link.click();
        }
    }

    function waitForParticipateButton() {
        return new Promise((resolve) => {
            const interval = setInterval(() => {
                const participateButton = document.querySelector('a.LztContest--Participate.button:not(.disabled)');
                if (participateButton && participateButton.getAttribute('href').includes('token')) {
                    clearInterval(interval);
                    resolve(participateButton);
                }
            }, CHECK_INTERVAL);
        });
    }

    async function participateInContest() {
        console.log('Waiting for participate button to become available...');
        const participateButton = await waitForParticipateButton();
        console.log('Participate button is available, waiting before clicking...');

        await new Promise(resolve => setTimeout(resolve, BEFORE_CLICK_DELAY));

        participateButton.click();
        console.log('Clicked participate button');

        await new Promise(resolve => setTimeout(resolve, AFTER_CLICK_DELAY));

        console.log('Participation complete, returning to contest list');
        window.location.href = CONTEST_LIST_URL;
    }

    function init() {
        const currentURL = window.location.href;

        if (currentURL.includes('/threads/')) {
            console.log('On contest page, scrolling to element...');
            scrollToElement();

            setTimeout(participateInContest, PARTICIPATION_WAIT);
        } else if (currentURL === CONTEST_LIST_URL) {
            console.log('On contest list page, preparing to click first contest...');
            setTimeout(() => {
                clickFirstContestLink();
            }, 100);
        }
    }

    init();
})();

QingJ © 2025

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