Загрузка...

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

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

  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 Изменено
    1. крипКРИПОЧЕК
      APT29388, для питона есть код?
  2. AkNma
    AkNma 21 мар 2025 Лучшие ****** здесь - lolz.live/threads/8856953/
    Жёстик, осталось только дописать "установка для самых маленьких" с отдельным гайдом, и было бы заебись
     
    1. APT29388 Автор темы
    2. AkNma
      APT29388, ну это, как установить скрипт в мартышку, как её и где скачать и тд
      Много кто не шарит
    3. APT29388 Автор темы
  3. Foxy
    Спасибо, теперь челов будут тегать в 10 темах одновременно
     
    1. APT29388 Автор темы
      Foxy, ну, ээээ, я тут не причём
    2. Монополист
      Foxy, больше 5 человек не тегается
  4. РАСПИЗДЯЙ
    РАСПИЗДЯЙ 21 мар 2025 Роман, никогда никому ничего плохого не сделал 7162 3 авг 2021
    Ммммм дополнение для массового спама. Теперь оффтопик окончательно отупеет
     
  5. ЗаложникОффтопа
    Я остался без работы
     
  6. llimonix
    llimonix 22 мар 2025 :peace: make testers great again! 23 968 20 янв 2020
    1. APT29388 Автор темы
    2. llimonix
    3. APT29388 Автор темы
    4. Посмотреть следующие комментарии (2)
  7. unsolyne
    unsolyne 22 мар 2025 19 29 янв 2023
    а вопрос зачем это
     
Загрузка...
Top