Загрузка...

Automation Funny Парсер именинников и автоматическое создание темы в оффтопике с их поздравлением

Thread in Extentions created by APT29388 Mar 21, 2025. (bumped Jun 1, 2025) 383 views

  1. APT29388
    APT29388 Topic starter Mar 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();
    });
    })();
     
    1. крипКРИПОЧЕК
      APT29388, для питона есть код?
  2. AkNma
    AkNma Mar 21, 2025 Лучшие ****** здесь - lolz.live/threads/8856953/
    Жёстик, осталось только дописать "установка для самых маленьких" с отдельным гайдом, и было бы заебись
     
    1. APT29388 Topic starter
    2. AkNma
      APT29388, ну это, как установить скрипт в мартышку, как её и где скачать и тд
      Много кто не шарит
    3. APT29388 Topic starter
  3. Foxy
    Спасибо, теперь челов будут тегать в 10 темах одновременно
     
    1. APT29388 Topic starter
      Foxy, ну, ээээ, я тут не причём
    2. Монополист
      Foxy, больше 5 человек не тегается
  4. РАСПИЗДЯЙ
    РАСПИЗДЯЙ Mar 21, 2025 Роман, никогда никому ничего плохого не сделал 7163 Aug 3, 2021
    Ммммм дополнение для массового спама. Теперь оффтопик окончательно отупеет
     
  5. ЗаложникОффтопа
    Я остался без работы
     
  6. llimonix
    llimonix Mar 22, 2025 :peace: Реклама от ллимоникса: lolz.live/threads/9000379 23,969 Jan 20, 2020
    1. View previous comments (2)
    2. APT29388 Topic starter
    3. llimonix
      APT29388, ашалеть, но я ниче не понял
    4. APT29388 Topic starter
  7. unsolyne
    unsolyne Mar 22, 2025 19 Jan 29, 2023
    а вопрос зачем это
     
Loading...
Top