Загрузка...

Автоматизация Развлекательное Парсер именинников и автоматическое создание темы в оффтопике с их поздравлением

Тема в разделе Дополнения создана пользователем APT29388 21 мар 2025. (поднята 1 июн 2025) 304 просмотра

Загрузка...
  1. APT29388
    APT29388 Автор темы 21 мар 2025 ГУРУ ИНВАЙТА - lolz.live/threads/8567181 :admin:
    [IMG]
    [IMG]

    JS
    // ==UserScript==
    // @name Birthday Parser
    // @namespace http://tampermonkey.net/
    // @version 1.0
    // @description Парсер именинников
    // @author APT29388
    // @match https://lolz.live/members/?type=birthday
    // @grant none
    // ==/UserScript==

    (function() {
    'use strict';
    function createParseButton() {
    const statsBlock = document.querySelector('#boardStats');
    if (!statsBlock) return;

    const mainContainer = document.createElement('div');
    mainContainer.style.cssText = `
    margin: 20px 0;
    padding: 15px;
    background: #2b2b2b;
    border-radius: 5px;
    width: 100%;
    box-sizing: border-box;
    `;

    const controlsDiv = document.createElement('div');
    controlsDiv.style.cssText = `
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 15px;
    flex-wrap: wrap;
    `;

    const inputContainer = document.createElement('div');
    inputContainer.style.cssText = 'display: flex; align-items: center; gap: 5px;';

    const inputLabel = document.createElement('label');
    inputLabel.textContent = 'Количество пользователей:';
    inputLabel.style.cssText = 'color: white; font-size: 13px;';

    const countInput = document.createElement('input');
    countInput.type = 'number';
    countInput.min = '1';
    countInput.placeholder = 'Кол-во';
    countInput.style.cssText = `
    width: 70px;
    padding: 5px;
    border-radius: 3px;
    border: 1px solid #3b3b3b;
    background: #1b1b1b;
    color: white;
    `;

    inputContainer.appendChild(inputLabel);
    inputContainer.appendChild(countInput);

    const parseButton = document.createElement('button');
    parseButton.textContent = 'Спарсить именинников';
    parseButton.style.cssText = `
    padding: 5px 10px;
    background: #3b3b3b;
    color: white;
    border: none;
    border-radius: 3px;
    cursor: pointer;
    transition: background 0.2s;
    `;

    const copyButton = document.createElement('button');
    copyButton.textContent = 'Скопировать поздравление';
    copyButton.style.cssText = `
    padding: 5px 10px;
    background: #3b3b3b;
    color: white;
    border: none;
    border-radius: 3px;
    cursor: pointer;
    transition: background 0.2s;
    display: none;
    `;

    const congratulateButton = document.createElement('button');
    congratulateButton.textContent = 'Создать поздравление на форуме';
    congratulateButton.style.cssText = `
    padding: 5px 10px;
    background: #3b3b3b;
    color: white;
    border: none;
    border-radius: 3px;
    cursor: pointer;
    transition: background 0.2s;
    display: none;
    `;

    [parseButton, copyButton, congratulateButton].forEach(button => {
    button.addEventListener('mouseenter', () => {
    button.style.background = '#4b4b4b';
    });
    button.addEventListener('mouseleave', () => {
    button.style.background = '#3b3b3b';
    });
    });

    const resultDiv = document.createElement('div');
    resultDiv.style.cssText = `
    padding: 10px;
    background: #1b1b1b;
    border-radius: 3px;
    color: #fff;
    max-height: 200px;
    overflow-y: auto;
    word-wrap: break-word;
    font-size: 13px;
    line-height: 1.4;
    `;

    controlsDiv.appendChild(inputContainer);
    controlsDiv.appendChild(parseButton);
    controlsDiv.appendChild(copyButton);
    controlsDiv.appendChild(congratulateButton);

    mainContainer.appendChild(controlsDiv);
    mainContainer.appendChild(resultDiv);

    statsBlock.parentNode.insertBefore(mainContainer, statsBlock.nextSibling);

    let parsedUsernames = [];

    parseButton.addEventListener('click', async () => {
    parsedUsernames = await parseAllPages(resultDiv);
    copyButton.style.display = 'inline-block';
    congratulateButton.style.display = 'inline-block';
    });

    function createCongratulationText(usernames) {
    return `[CENTER][SIZE=5]${usernames.join(', ')}[/SIZE]


    [B][SIZE=5]Желаем в этот прекрасный день вам всего самого наилучшего, денег, тёлок и прикормку рутика![/SIZE][/B][/CENTER]

    [CENTER]:stitch_love: :stitch_love: :stitch_love: :stitch_love: :stitch_love: :stitch_love: :stitch_love:[/CENTER]`;
    }

    copyButton.addEventListener('click', () => {
    const count = parseInt(countInput.value) || parsedUsernames.length;
    const selectedUsernames = parsedUsernames.slice(0, count);
    const congratsText = createCongratulationText(selectedUsernames);

    navigator.clipboard.writeText(congratsText).then(() => {
    const originalText = copyButton.textContent;
    copyButton.textContent = 'Скопировано!';
    setTimeout(() => {
    copyButton.textContent = originalText;
    }, 2000);
    });
    });

    congratulateButton.addEventListener('click', () => {
    const count = parseInt(countInput.value) || parsedUsernames.length;
    const selectedUsernames = parsedUsernames.slice(0, count);
    const congratsText = createCongratulationText(selectedUsernames);

    const createThreadWindow = window.open('https://lolz.live/forums/8/create-thread', '_blank');


    createThreadWindow.addEventListener('load', () => {
    const titleInput = createThreadWindow.document.querySelector('#ctrl_title_thread_create');
    if (titleInput) {
    titleInput.value = 'Поздравляем именинников';
    }

    const editorDiv = createThreadWindow.document.querySelector('.fr-element.fr-view');
    if (editorDiv) {
    editorDiv.innerHTML = congratsText.split('\n').map(line => `<p>${line}</p>`).join('');
    }
    });
    });
    }

    async function getTotalPages() {
    const pageNav = document.querySelector('.PageNav');
    if (pageNav) {
    return parseInt(pageNav.getAttribute('data-last')) || 1;
    }
    return 1;
    }

    async function loadPage(page) {
    const response = await fetch(`https://lolz.live/members/?type=birthday&page=${page}`);
    const text = await response.text();
    const parser = new DOMParser();
    return parser.parseFromString(text, 'text/html');
    }

    function addNumbersToUserBlocks() {
    const memberItems = document.querySelectorAll('.primaryContent.memberListItem');
    memberItems.forEach((item, index) => {
    const numberDiv = document.createElement('div');
    numberDiv.style.cssText = `
    position: absolute;
    top: 5px;
    left: 5px;
    background: #2b2b2b;
    color: #fff;
    padding: 2px 6px;
    border-radius: 3px;
    font-size: 12px;
    font-weight: bold;
    z-index: 1;
    `;
    numberDiv.textContent = (index + 1).toString();

    item.style.position = 'relative';

    item.insertBefore(numberDiv, item.firstChild);
    });
    }

    async function parseAllPages(resultDiv) {
    resultDiv.textContent = 'Парсинг...';
    const usernames = [];
    const totalPages = await getTotalPages();

    for (let page = 1; page <= totalPages; page++) {
    resultDiv.textContent = `Парсинг страницы ${page} из ${totalPages}...`;

    if (page === 1) {
    addNumbersToUserBlocks();
    }

    let doc = page === 1 ? document : await loadPage(page);
    const memberItems = doc.querySelectorAll('.primaryContent.memberListItem');

    memberItems.forEach(item => {
    const usernameElement = item.querySelector('.username a.username span[class*="style"], .username a.username span[style*="color"]');
    if (usernameElement) {
    const username = usernameElement.textContent.trim();
    if (!usernames.includes('@' + username)) {
    usernames.push('@' + username);
    }
    }
    });
    }

    const count = parseInt(document.querySelector('input[type="number"]').value) || usernames.length;
    const selectedUsernames = usernames.slice(0, count);

    resultDiv.innerHTML = `
    <div style="margin-bottom: 10px;">Найдено пользователей: ${usernames.length}, показано: ${selectedUsernames.length}</div>
    <div style="display: flex; flex-direction: column;">
    ${selectedUsernames.map((username, index) =>
    `<div style="margin-bottom: 5px;">
    <span style="color: #666; margin-right: 5px;">${index + 1}.</span>
    <span>${username}</span>
    </div>`
    ).join('')}
    </div>
    `;

    return usernames;
    }

    window.addEventListener('load', () => {
    createParseButton();
    addNumbersToUserBlocks();
    });
    })();
     
    21 мар 2025 Изменено
  2. AkNma
    Жёстик, осталось только дописать "установка для самых маленьких" с отдельным гайдом, и было бы заебись
     
    1. AkNma
      APT29388, ну это, как установить скрипт в мартышку, как её и где скачать и тд
      Много кто не шарит
    2. APT29388 Автор темы
  3. Foxy
    Foxy 21 мар 2025 Лучшие, антиабуз домены - lolz.live/threads/111111
    Спасибо, теперь челов будут тегать в 10 темах одновременно
     
    1. APT29388 Автор темы
      Foxy, ну, ээээ, я тут не причём
    2. Монополист
      Foxy, больше 5 человек не тегается
  4. Pe4enbka
    Pe4enbka 21 мар 2025 :Pepe_music4: Сбор на электрогитару 1142/30000 6433 3 авг 2021
    Ммммм дополнение для массового спама. Теперь оффтопик окончательно отупеет
     
  5. ЗаложникОффтопа
    Я остался без работы
     
  6. llimonix
    1. Посмотреть предыдущие комментарии (2)
    2. APT29388 Автор темы
  7. unsolyne
    unsolyne 22 мар 2025 19 29 янв 2023
    а вопрос зачем это
     
Top