Загрузка...

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

Тема в разделе Дополнения создана пользователем APT29388 Вчера, в 08:40. (поднята Сегодня, в 16:24) 144 просмотра

Загрузка...
  1. APT29388
    APT29388 Автор темы Вчера, в 08:40 Лучшие аккаунты тг - lolz.live/threads/8322738/ :admin:
    [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
    Жёстик, осталось только дописать "установка для самых маленьких" с отдельным гайдом, и было бы заебись
     
    1. APT29388 Автор темы
    2. AkNma
      APT29388, ну это, как установить скрипт в мартышку, как её и где скачать и тд
      Много кто не шарит
    3. APT29388 Автор темы
  3. Foxy
    Спасибо, теперь челов будут тегать в 10 темах одновременно
     
    1. APT29388 Автор темы
      Foxy, ну, ээээ, я тут не причём
    2. Монополист
      Foxy, больше 5 человек не тегается
  4. Pe4enbka
    Pe4enbka Вчера, в 08:55 :Pepe_music4: Сбор на электрогитару 569/30000 5291 3 авг 2021
    Ммммм дополнение для массового спама. Теперь оффтопик окончательно отупеет
     
  5. ЗаложникОффтопа
    Я остался без работы
     
  6. llimonix
    1. Посмотреть предыдущие комментарии (2)
    2. APT29388 Автор темы
    3. llimonix
      APT29388, ашалеть, но я ниче не понял
    4. APT29388 Автор темы
  7. unsolyne
    а вопрос зачем это
     
Top
JavaScript error: