Sleazy Fork is available in English.

나히다 라이브 자동 다운로드

nahida.live 사이트에서 dropdown, menuitem 클릭 후 여러 비밀번호 입력 및 다운로드 버튼 클릭 반복 처리

// ==UserScript==
// @name         나히다 라이브 자동 다운로드
// @namespace    http://tampermonkey.net/
// @version      1.9
// @description  nahida.live 사이트에서 dropdown, menuitem 클릭 후 여러 비밀번호 입력 및 다운로드 버튼 클릭 반복 처리
// @author       Your Name
// @match        *://*nahida.live/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const passwordsToEnter = ["gayshin", "GAYSHIN", "ㅎ묘노ㅑㅜ", "Eidwh","EIDWH","gayshin"+today(), "GAYSHIN"+today(),"gayshin눈치"]; // 여러 비밀번호를 여기에 배열로 설정
    let currentPasswordIndex = 0; // 현재 처리 중인 비밀번호 인덱스

    function clickSecondMenuItem() {
        const menuItems = document.querySelectorAll('div[role="menuitem"]');

        if (menuItems.length >= 2) {
            const secondMenuItem = menuItems[0]; // 첫 번째 항목 = 일반 다운로드
            console.log("두 번째 menuitem을 찾았습니다. 클릭 중...");
            secondMenuItem.click();
        } else {
            console.log("두 번째 menuitem을 찾을 수 없습니다.");
        }
    }

    function today() {
        const date = new Date();
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, '0'); // 월은 0부터 시작하므로 +1
        const day = String(date.getDate()).padStart(2, '0');
        return `${month}${day}`;
    }

    function enterPasswordsAndDownload() {
        const passwordFields = document.querySelectorAll('input[placeholder="Password"]');

        if (passwordFields.length > 0 && currentPasswordIndex < passwordsToEnter.length) {
            const passwordField = passwordFields[0]; // 항상 첫 번째 Password 필드 처리
            const password = passwordsToEnter[currentPasswordIndex];

            console.log(`Password 필드에 비밀번호 '${password}'를 입력합니다.`);
            passwordField.value = password;

            // 추가 이벤트 트리거
            passwordField.dispatchEvent(new Event('input', { bubbles: true }));
            passwordField.dispatchEvent(new Event('change', { bubbles: true }));

            // 다운로드 버튼 클릭
            const downloadButton = document.querySelector('button.px-4.py-2.rounded-lg.shadow');
            if (downloadButton) {
                console.log(`다운로드 버튼을 클릭합니다.`);
                downloadButton.click();

                // 클릭 후 다음 비밀번호 처리
                setTimeout(() => {
                    passwordField.value = ""; // 비밀번호 필드 초기화
                    currentPasswordIndex++; // 다음 비밀번호로 이동
                    enterPasswordsAndDownload(); // 재귀 호출로 다음 비밀번호 처리
                }, 1000); // 버튼 클릭 후 대기 시간 (1초)
            } else {
                console.log("다운로드 버튼을 찾을 수 없습니다.");
            }
        } else if (currentPasswordIndex >= passwordsToEnter.length) {
            console.log("모든 비밀번호 처리가 완료되었습니다.");
        } else {
            console.log("Password 필드를 찾을 수 없습니다.");
        }
    }

    function observeDropdownButtons() {
        const observer = new MutationObserver(() => {
            const dropdownButtons = document.querySelectorAll('button[type="button"]');
            console.log(dropdownButtons);
            if (dropdownButtons.length >= 1) {
                observer.disconnect(); // 대상 요소를 찾으면 감시 중단
                console.log("드롭다운 버튼 감지 완료. 작업을 시작합니다.");

                const secondButton = dropdownButtons[2]; // 두 번째 버튼
                console.log("두 번째 dropdown 버튼을 찾았습니다. 클릭 중...");
                secondButton.click();

                setTimeout(() => {
                    clickSecondMenuItem();
                    setTimeout(() => {
                        enterPasswordsAndDownload();
                    }, 500);
                }, 500);
            }
        });

        // 감시 대상 설정
        observer.observe(document.body, {
            childList: true,
            subtree: true,
        });
    }

    // 페이지 로드 후 MutationObserver 시작

    observeDropdownButtons();

})();