Вучаев скрытый разработчик, специально добавляет на форум что-то, чтобы потом сделать тему со скрытием этого
крипКРИПОЧЕК, Воспользовался моментом, не упустил шанс, показал возможности, расставил приоритеты, задавил авторитетом, убрал конкурентов,чтоб не втыкал, чтоб жизнь малиной не казалась
Сортировка розыгрышей по сумме и времени | Contest Sorter Lolzteam После установки скрипта, скрипт по мере того как вы прогружаете розыгрыши будет сортировать их по удобным образом по меньшему и времени и большей сумме. Чтобы вы всегда успевали принимать участие в крутых розыгрышах Без скрипта: С скриптом: Установка Tampermonkey Chrome: https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo Firefox: https://addons.mozilla.org/ru/firefox/addon/tampermonkey/ Установка скрипта Переходим по ссылке: Contest Sorter Lolzteam (greasyfork.org) и нажимаем "Установить этот скрипт". Другие мои темы: Lolzteam Contest Helper - участвовать станет легче Скрипт для получения общей суммы розыгрышей Lolzteam GPT - получай ответы на интересующие вопросы Создал на быструю руку скрипт через который можно получить интересующий тебя ответ от ChatGPT. В темах на сообщениях и комментариях будет появляться кнопка: Создать запрос ChatGPT При нажатии на кнопку должно вылезти подобное уведомление с созданием запроса После получения ответа вылезет еще одно окно: (но уже с ответом) В выпадающем меню появляется кнопка "Спросить у ChatGPT" Полученный ответ В профиле на сообщениях и комментариях тоже есть кнопка Кнопка в чате Установка Ссылка на установку скрипта: https://greasyfork.org/ru/scripts/466294-lolzteam-gpt/code Установка Tampermonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru В будущем будет возможность вписывать и запоминать кастомные промты, по типу DarkGPT, ЁптаГПТ, возможно будут настройки Так же думаю будет заполнение текста в реальном времени (то есть текст будет воспроизводиться по мере получения ответов с сервера) Расширение сыроватое, могут быть баги. На данный момент работает только в темах, профилях, чате и в выпадающем меню. О всех багах сообщайте в тему или мне в личные сообщения Курс валют прямо на маркете Скрипт добавляет блок с выводом курса криптовалют. На данный момент есть USD, EUR, CNY. Вы можете самостоятельно добавить валюту (которая разумеется есть в парсере), так и попросить меня, я помогу вам с этим. Планируется добавления новых валют, а так же криптовалют (которые популярны на данный момент. Пишите в тему - я их добавлю). Так же скрипт автоматически берет курс валют под вашу. Которая стоит у вас на маркете. Допустим вы выбрали гривны Скрипт автоматически все сделал под валюту маркета Сделал по желанию следующих пользователей: Ссылка на TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru Ссылка на скрипт - https://greasyfork.org/ru/scripts/471607-lztcurrencyapi/ Инструкция по добавлению своей валюты Находим данные строчки Добавляем строчку допустим const btc_url = `${api_url}/BTC/${currency}.json`; то есть в таком формате apiссылка/валютакоторойхотитеузнатькурс/вашавалюта Затем добавляем еще несколько строчек, но уже здесь: Добавляем const btc_value = await getCurrencyValue(btc_url); и еще одну { name: 'BTC', value: btc_value} и не забываем ставить запятые. Должно получиться так: DetectTextStateChange - предупреждение при случайном переходе Как скрипт работает? Скрипт отслеживает элемент с вводом текста на форуме и если текст присутствует у вас появляется алерт с предупреждением при попытке куда-то перейти. Я использовал observer для отслеживания элемента и переменную lastState для того чтобы записывать туда состояние. Далее если состояние lastState === filled при переходе на какую-либо страницу будет появляться предупреждение. Что за предупреждение? Пример И так, если в поле присутствует какой-либо текст, теперь при случайном миссклике будет висеть предупреждение которое я показал выше Видео с работой На каких страницах работает? В профиле В темах В личных сообщения При создании темы Благодарность за дизайн За оформление спасибо - llimonix Автор идеи SEKSI (https://zelenka.guru/threads/5845354/#post-41747304 ) и llimonix Установка Скрипт на GreasyFork - https://greasyfork.org/ru/scripts/475672-detecttextstatechange Расширение TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo Информация о погоде на главной странице форума Для работы скрипта требуется TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru Ссылка на установку - https://greasyfork.org/ru/scripts/471528-lztweatherapi В случае если в скрипте будет не работать API ключ - https://www.weatherapi.com/my/ самому можно получить goldf1nch можешь не благодарить меня Теперь вам не нужно заходить на какие-то сторонние сайты чтобы узнать погоду, можете делать это прямо с форума! Убираем количество ответов в теме и кнопку для сортировки Лично мне она не мешает никак (наоборот считаю, что обновление удобное), но видимо кому-то не понравилось новое обновление. А мне не впадлу сделать пару строк кода Скрипт - https://greasyfork.org/ru/scripts/472010-tpostlistcontrolsremover Было Стало Динамическое обновление времени в розыгрышах Вместо того чтобы посидеть на форуме потратил время на это, для работяг Что делает данный скрипт? Ну очевидно по названию темы - добавляет динамическое время в темах розыгрышей. Сейчас же используется статическое и не изменяется никаким образом. То есть остается в таком состоянии до обновления страницы: После того как время до завершения становится 0 секунд - скрипт будет дожидаться ответа от root и как только root ответит он автоматически сделает информацию такой: А так же закроет поле для ответов: Ссылка на установку скрипта - https://greasyfork.org/ru/scripts/472277-lztdynamictimecontest Ссылка на установку TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru LZT Light Blue - красивый стиль для форума Представляю Вам стиль для форума Lolzteam в светло-голубой расцветке. Стиль был адаптирован под мои вкусы. Никого не заставляю устанавливать или использовать (все по вашему желанию) Шаги установки стиля: 1. Устанавливаем расширение Stylus Chrome https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne?hl=ru Firefox https://addons.mozilla.org/ru/firefox/addon/styl-us/ Opera https://addons.opera.com/ru/extensions/details/install-chrome-extensions/ 2. Переходим по ссылке https://userstyles.world/style/4331/lzt-light-blue 3. Нажимаем на кнопку и кликаем 4. Если вы выполнили все шаги из статьи правильно, то у вас появится такая надпись: 5. Наслаждаемся Список изменений стиля 20220424.2.33 Стиль выложен в открытый доступ 20220424.13.44 Изменен цвет текста в тегах на белый, для более хорошей читабельности 20220424.20.41 Изменено расположение тегов Теги сделаны более квадратными Скрипт для удаления proxy.php Заметил много людей выложили уже похожие скрипты, но у всех происходят клики на кнопку для продолжения. Мой скрипт полностью убирает proxy.php из ссылок и заменяет на обычные. TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru Ссылка на скрипт - https://greasyfork.org/ru/scripts/469178-proxyphpremover SearchFlood - поиск бесполезных сообщений в теме используя GPT-4 Написан быстро, много гавнокода, но работает. Зеленый текст - не нарушает правила форума Красный текст - нарушает правила форума Оранжевый текст - возможно нарушает правила форума Пример 1 Пример 2 Пример 3 Python код для работы Bing GPT 4 from flask import Flask, request, jsonify import asyncio from EdgeGPT.EdgeGPT import Chatbot, ConversationStyle from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route('/', methods=['POST']) def analyze_message(): data = request.get_json() title = data['title'] content = data['content'] message = data['message'] section = data['section'] prompt = f'Заголовок темы: {title}\n\nТвоя задача определять бесполезные сообщения, флуд, спам, не имеющие смысла с заголовком, содержимым, не дающие цельный ответ, никак не связаны с содержимым (или с заголовком), да и в принципе с разделом, то есть полностью бесполезное сообщение например "скачай видеокарту", видеокарту нельзя скачать и это бред:\n\nЕсли в содержимом мало текста и присутствует "в шапке", "в кепке" и похожие варианты - значит вопрос задан в заголовке. Если нарушает что-то из перечисленного "выводи ответ в json формате: "answer: no/yes/possibly" Yes или No или possibly (если не уверен нарушает или нет) в зависимости нарушает или нет," ничего больше\nЕсли не нарушает: No\nНе уверен/возможно - possibly\n"на основе содержимого, заголовка и сообщения твоя задача сделать анализ, проверить, что ответ является верным и не бесполезным и дать ответ точный, если не уверен - возвращай possibly!"\nТолько JSON формат и ничего больше отправлять не надо. Если сообщение содержит только "Скрытый контент для ..." - пропустить сообщение и вернуть skipped\n\nСодержимое темы: {content}\nРаздел темы: {section}\nСообщение для анализа: {message}' loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) result = loop.run_until_complete(run_chatbot(prompt)) loop.close() return jsonify(result) async def run_chatbot(prompt): bot = await Chatbot.create() response = await bot.ask(prompt=prompt, conversation_style=ConversationStyle.precise, simplify_response=True) await bot.close() return response['adaptive_text'] if __name__ == '__main__': app.run(host="0.0.0.0", port=5000) Python from flask import Flask, request, jsonify import asyncio from EdgeGPT.EdgeGPT import Chatbot, ConversationStyle from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route('/', methods=['POST']) def analyze_message(): data = request.get_json() title = data['title'] content = data['content'] message = data['message'] section = data['section'] prompt = f'Заголовок темы: {title}\n\nТвоя задача определять бесполезные сообщения, флуд, спам, не имеющие смысла с заголовком, содержимым, не дающие цельный ответ, никак не связаны с содержимым (или с заголовком), да и в принципе с разделом, то есть полностью бесполезное сообщение например "скачай видеокарту", видеокарту нельзя скачать и это бред:\n\nЕсли в содержимом мало текста и присутствует "в шапке", "в кепке" и похожие варианты - значит вопрос задан в заголовке. Если нарушает что-то из перечисленного "выводи ответ в json формате: "answer: no/yes/possibly" Yes или No или possibly (если не уверен нарушает или нет) в зависимости нарушает или нет," ничего больше\nЕсли не нарушает: No\nНе уверен/возможно - possibly\n"на основе содержимого, заголовка и сообщения твоя задача сделать анализ, проверить, что ответ является верным и не бесполезным и дать ответ точный, если не уверен - возвращай possibly!"\nТолько JSON формат и ничего больше отправлять не надо. Если сообщение содержит только "Скрытый контент для ..." - пропустить сообщение и вернуть skipped\n\nСодержимое темы: {content}\nРаздел темы: {section}\nСообщение для анализа: {message}' loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) result = loop.run_until_complete(run_chatbot(prompt)) loop.close() return jsonify(result) async def run_chatbot(prompt): bot = await Chatbot.create() response = await bot.ask(prompt=prompt, conversation_style=ConversationStyle.precise, simplify_response=True) await bot.close() return response['adaptive_text'] if __name__ == '__main__': app.run(host="0.0.0.0", port=5000) Скачиваем https://github.com/acheong08/EdgeGPT и перекидываем EdgeGPT в папку с скриптом TamperMonkey скрипт для отправки запросов на наш Python скрипт :ok_lol: // ==UserScript== // @name FloodSearch // @namespace [URL]http://tampermonkey.net/[/URL] // @version 0.1 // @description try to take over the world! // @author vuchaev2015 // @match [URL]https://zelenka.guru/*[/URL] // @icon [URL]https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru[/URL] // @grant none // ==/UserScript== async function getContent() { const url = window.location.href; const regex = /https:\/\/zelenka\.guru\/threads\/(\d+)(\/page-\d+)?/; const match = url.match(regex); if (match && match[2]) { const titleUrl = `https://zelenka.guru/threads/${match[1]}/`; const response = await fetch(titleUrl); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, 'text/html'); const firstPostElement = doc.querySelector('[id^="post-"] div.messageInfo > div.messageContent > article > blockquote'); const content = firstPostElement ? firstPostElement.innerText : ''; return content; } else { const firstPostElement = document.querySelector('[id^="post-"] div.messageInfo > div.messageContent > article > blockquote'); const content = firstPostElement ? firstPostElement.innerText : ''; return content; } } async function analyze_message(title, section, message, content, postId) { const url = 'https://456a-191-101-157-238.ngrok-free.app'; const data = { title, content, message, section }; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (response.status === 500) { return analyze_message(title, section, message, content, postId); } const json = await response.text(); const result = json.match(/(no|yes|possibly|skipped)/); if (result) { return result[0]; } else { return analyze_message(title, section, message, content, postId); } } catch (error) { //return analyze_message(title, section, message, content, postId); } } async function processPost(post, title, content, section) { if (post.classList.contains('comment')) return; const postId = post.id.replace('post-', ''); const messageElement = post.querySelector('div.messageInfo > div.messageContent > article > blockquote'); const message = messageElement.innerText; if (message === content) return; const authorElement = post.querySelector('span.item.as--class.author'); if (authorElement) return; const statusElement = document.querySelector(`#post-${postId} > div.messageInfo > div.messageContent > div > div.privateControls > a`); return analyze_message(title, section, message, content, postId) .then(result => { const statusColors = { no: 'green', yes: 'red', possibly: 'orange' }; statusElement.style.color = statusColors[result] || ''; }); } async function observeNewPosts(title, section) { let previousPosts = Array.from(document.querySelectorAll('[id^="post-"]')); const checkForNewPosts = async () => { const currentPosts = Array.from(document.querySelectorAll('[id^="post-"]')); const newPosts = currentPosts.filter( (post) => !previousPosts.some((prevPost) => prevPost.id === post.id) ); if (newPosts.length > 0) { const analyzePromises = newPosts.map((post) => processPost(post, title, getContent(), section) ); await Promise.all(analyzePromises); } previousPosts = currentPosts; setTimeout(checkForNewPosts, 3000); // Check for new posts every 3000 milliseconds (3 seconds) }; checkForNewPosts(); } (async () => { const title = document.querySelector('#content > div > div > div.titleBar > h1').innerText; const section = document.querySelector('#pageDescription > a:nth-child(1)').innerText; const content = await getContent(); const posts = Array.from(document.querySelectorAll('[id^="post-"]')); const analyzePromises = posts.map(post => processPost(post, title, content, section)); await Promise.all(analyzePromises); await observeNewPosts(title, section); })(); JS // ==UserScript== // @name FloodSearch // @namespace [URL]http://tampermonkey.net/[/URL] // @version 0.1 // @description try to take over the world! // @author vuchaev2015 // @match [URL]https://zelenka.guru/*[/URL] // @icon [URL]https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru[/URL] // @grant none // ==/UserScript== async function getContent() { const url = window.location.href; const regex = /https:\/\/zelenka\.guru\/threads\/(\d+)(\/page-\d+)?/; const match = url.match(regex); if (match && match[2]) { const titleUrl = `https://zelenka.guru/threads/${match[1]}/`; const response = await fetch(titleUrl); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, 'text/html'); const firstPostElement = doc.querySelector('[id^="post-"] div.messageInfo > div.messageContent > article > blockquote'); const content = firstPostElement ? firstPostElement.innerText : ''; return content; } else { const firstPostElement = document.querySelector('[id^="post-"] div.messageInfo > div.messageContent > article > blockquote'); const content = firstPostElement ? firstPostElement.innerText : ''; return content; } } async function analyze_message(title, section, message, content, postId) { const url = 'https://456a-191-101-157-238.ngrok-free.app'; const data = { title, content, message, section }; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (response.status === 500) { return analyze_message(title, section, message, content, postId); } const json = await response.text(); const result = json.match(/(no|yes|possibly|skipped)/); if (result) { return result[0]; } else { return analyze_message(title, section, message, content, postId); } } catch (error) { //return analyze_message(title, section, message, content, postId); } } async function processPost(post, title, content, section) { if (post.classList.contains('comment')) return; const postId = post.id.replace('post-', ''); const messageElement = post.querySelector('div.messageInfo > div.messageContent > article > blockquote'); const message = messageElement.innerText; if (message === content) return; const authorElement = post.querySelector('span.item.as--class.author'); if (authorElement) return; const statusElement = document.querySelector(`#post-${postId} > div.messageInfo > div.messageContent > div > div.privateControls > a`); return analyze_message(title, section, message, content, postId) .then(result => { const statusColors = { no: 'green', yes: 'red', possibly: 'orange' }; statusElement.style.color = statusColors[result] || ''; }); } async function observeNewPosts(title, section) { let previousPosts = Array.from(document.querySelectorAll('[id^="post-"]')); const checkForNewPosts = async () => { const currentPosts = Array.from(document.querySelectorAll('[id^="post-"]')); const newPosts = currentPosts.filter( (post) => !previousPosts.some((prevPost) => prevPost.id === post.id) ); if (newPosts.length > 0) { const analyzePromises = newPosts.map((post) => processPost(post, title, getContent(), section) ); await Promise.all(analyzePromises); } previousPosts = currentPosts; setTimeout(checkForNewPosts, 3000); // Check for new posts every 3000 milliseconds (3 seconds) }; checkForNewPosts(); } (async () => { const title = document.querySelector('#content > div > div > div.titleBar > h1').innerText; const section = document.querySelector('#pageDescription > a:nth-child(1)').innerText; const content = await getContent(); const posts = Array.from(document.querySelectorAll('[id^="post-"]')); const analyzePromises = posts.map(post => processPost(post, title, content, section)); await Promise.all(analyzePromises); await observeNewPosts(title, section); })(); С запросами на localhost у меня не получилось и пришлось подымать через ngrok :peka: ngrok https://ngrok.com/ Как скачали ngrok запускаем скрипт Python Открываем cmd где находится скачанный ngrok.exe пишем: ngrok http 5000 и меняем ссылку в скрипте TamperMonkey на свою Все. Скрипт должен работать. В некоторых регионах Bing может быть недоступен и не работать, поэтому либо устанавливаете куки свои, либо *** включаете в регионе в котором Bing работает без авторизации Установить куки в скрипте добавляете строчку cookies = json.loads(open("./cookies.json", encoding="utf-8").read()) # might omit cookies option bot = await Chatbot.create() меняете на bot = await Chatbot.create(cookies=cookies) создаете файл cookies.json в папке со скриптом и с бинг через EditThisCookie экспортируете и загружаете их в файл Готово, скрипт работает используя GPT-4 от Bing, анализирует заголовок, содержимое темы и сообщение пользователя и пытается вывести результат за счет этого. Могут быть ложные срабатывания (а может вообще работать через попу, нейросети не идеальны), не забываем, что скрипт просто пытается облегчить нашу работу, а не полностью отнимает ее. Кидайте репорты с умом Зачем я его написал? Не знаю сам, просто надеюсь, что он сможет помочь новичкам в поиске бесполезных сообщений и все. :peka: Автоматическое обновление списка тем на форуме Для работы скрипта требуется расширение в браузере TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru Ссылка на установку скрипта - https://greasyfork.org/ru/scripts/470912-lolzteamautorefresh Демонстрация работы: Раз в 5 секунд скрипт автоматически обновляет темы в разделе где вы сидите в данный момент. время изменить на данный момент можно только в коде скрипта, указывать в ms (5000ms - 5 секунд) За время использования скрипта (несколько часов) с блокировкой IP не столкнулся. Для экономии ресурсов скрипт работает только тогда, когда открыта вкладка (то есть если вы перейдете на другую вкладку где скрипта не будет - соответственно он работать не будет) Так же автоматически удаляется кнопка для обновления (если скрипт обновляет сам - значит и кнопка не нужна) Обновляются не только темы, но и статус прогруженных тем - последний написавший, время создания, количество симпатий Работает немного не так как надо если прогружены дополнительные темы ниже. Скрываем нововведение на форуме - линию загрузки при переходах Установить можно здесь. Все просто, при переходах теперь не будет отображаться лоадинг бар https://greasyfork.org/ru/scripts/479256-hideloadingbar Было: Стало: Как и просили, собственного говоря. Пару строчек кода Переносим кнопку для сортировки и количество ответов в теме в другое место Для тех кто не хочет удалять полностью данный блок сделал отдельный скрипт - просто перемещение блока. Стало Сейчас кнопка и количество ответов находятся сверху, над первым сообщением автора темы (вроде выглядит лучше, чем изначально ) Скрипт - https://greasyfork.org/ru/scripts/472013-postlistcontrolstransfer Удаление блока с лайками из профилей Меня долго просить не надо https://greasyfork.org/ru/scripts/473695-profilelikesremover Растение Ссылка на TamperMonkey https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru
vuchaev2015 lzt light blue норм. а можешь сделать так же но только с красным цветом? чтобы тёмно красный или кроваво-красный где-то был