OlegBrawler, я сам против такого, но возможно кому-то и правда proxy.php добавляет лишние действия и мешает, а так мы освобождаем пользователя от лишних действий, пожертвовав безопасностью от мисскликов по неизвестным сайтам
Написан быстро, много гавнокода, но работает. Зеленый текст - не нарушает правила форума Красный текст - нарушает правила форума Оранжевый текст - возможно нарушает правила форума Пример 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 http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author vuchaev2015 // @match https://zelenka.guru/* // @icon https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru // @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 http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author vuchaev2015 // @match https://zelenka.guru/* // @icon https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru // @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:
Предлагаю такую мини-обнову запилить. Если будет находить мошенников, то "мошенник" будет выделяться красным и начертание будет чуть жирней.
YARCHEE, если находиться мошенник, то вместо сейчас на сайте (на вкладке) будешь писаться обнаружен мошенник
мог бы дать requirements anyio==3.7.1 BingImageCreator==0.4.4 blinker==1.6.2 certifi==2023.5.7 charset-normalizer==3.2.0 click==8.1.4 colorama==0.4.6 exceptiongroup==1.1.2 Flask==2.3.2 Flask-Cors==4.0.0 h11==0.14.0 httpcore==0.17.3 httpx==0.24.1 idna==3.4 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.3 regex==2023.6.3 requests==2.31.0 sniffio==1.3.0 urllib3==2.0.3 websockets==11.0.3 Werkzeug==2.3.6 Code anyio==3.7.1 BingImageCreator==0.4.4 blinker==1.6.2 certifi==2023.5.7 charset-normalizer==3.2.0 click==8.1.4 colorama==0.4.6 exceptiongroup==1.1.2 Flask==2.3.2 Flask-Cors==4.0.0 h11==0.14.0 httpcore==0.17.3 httpx==0.24.1 idna==3.4 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.3 regex==2023.6.3 requests==2.31.0 sniffio==1.3.0 urllib3==2.0.3 websockets==11.0.3 Werkzeug==2.3.6
значит пришел я написать претензию, ты написал вредительский скрипт, забираем у тебя трофей респектабельного пользователя
Для работы скрипта требуется расширение в браузере TamperMonkey - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ru Ссылка на установку скрипта - https://greasyfork.org/ru/scripts/470912-lolzteamautorefresh Демонстрация работы: Раз в 5 секунд скрипт автоматически обновляет темы в разделе где вы сидите в данный момент. время изменить на данный момент можно только в коде скрипта, указывать в ms (5000ms - 5 секунд) За время использования скрипта (несколько часов) с блокировкой IP не столкнулся. Для экономии ресурсов скрипт работает только тогда, когда открыта вкладка (то есть если вы перейдете на другую вкладку где скрипта не будет - соответственно он работать не будет) Так же автоматически удаляется кнопка для обновления (если скрипт обновляет сам - значит и кнопка не нужна) Обновляются не только темы, но и статус прогруженных тем - последний написавший, время создания, количество симпатий Работает немного не так как надо если прогружены дополнительные темы ниже.
FFyP, малварь возможно, но я чуть улучшил скрипт. У него появляются полоски тем при обновлении (что значительно мешает), я эти полоски удалил. пару строчек, но ощущение от этого совсем другое