// Конфигурация для различных популярных сайтов const siteConfig = { "discord.com": { // Селекторы элементов Discord "messageSelector": "[id*=\"message-content-\"]", "inputSelector": "[data-slate-editor=\"true\"]", "buttonSelector": "[aria-label*=\"Send\"], [aria-label*=\"Отправить\"]" }, "web.telegram.org": { // Селекторы элементов Telegram Web "messageSelector": ".message-content, .text-content", "inputSelector": ".input-message-input", "buttonSelector": ".btn-send" }, "web.whatsapp.com": { // Селекторы элементов WhatsApp Web "messageSelector": ".message-in .selectable-text, .message-out .selectable-text", "inputSelector": "[data-tab=\"1\"]", "buttonSelector": "[data-tab=\"11\"]" }, "twitter.com": { // Селекторы элементов Twitter "messageSelector": "[data-testid=\"tweetText\"]", "inputSelector": "[data-testid=\"tweetTextarea_0\"]", "buttonSelector": "[data-testid=\"tweetButton\"]" }, "facebook.com": { // Селекторы элементов Facebook "messageSelector": "[data-ad-preview=\"message\"]", "inputSelector": "[contenteditable=\"true\"][role=\"textbox\"]", "buttonSelector": "[type=\"submit\"]" } }; // Основной класс для работы с сообщениями class MessageHandler { constructor() { this.currentDomain = window.location.hostname; this.config = this.getConfigForDomain(); this.isActive = false; this.messageHistory = []; this.init(); } // Получение конфигурации для текущего домена getConfigForDomain() { for (const domain in siteConfig) { if (this.currentDomain.includes(domain)) { return siteConfig[domain]; } } return null; } // Инициализация init() { if (!this.config) { console.log("Unsupported site"); return; } this.setupEventListeners(); this.startMessageMonitoring(); } // Настройка обработчиков событий setupEventListeners() { // Слушаем горячие клавиши document.addEventListener('keydown', (event) => { if (event.ctrlKey && event.shiftKey && event.key === 'M') { this.toggleActivation(); } }); // Слушаем изменения в DOM const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList') { this.handleNewMessages(); } }); }); observer.observe(document.body, { childList: true, subtree: true }); } // Переключение активации/деактивации toggleActivation() { this.isActive = !this.isActive; console.log(`Message handler ${this.isActive ? 'activated' : 'deactivated'}`); if (this.isActive) { this.showNotification("Message monitoring activated"); } else { this.showNotification("Message monitoring deactivated"); } } // Мониторинг новых сообщений startMessageMonitoring() { setInterval(() => { if (this.isActive) { this.checkForNewMessages(); } }, 1000); } // Проверка новых сообщений checkForNewMessages() { const messageElements = document.querySelectorAll(this.config.messageSelector); const currentMessages = Array.from(messageElements).map(el => el.textContent.trim()); const newMessages = currentMessages.filter(msg => msg && !this.messageHistory.includes(msg) ); if (newMessages.length > 0) { newMessages.forEach(message => { this.processMessage(message); this.messageHistory.push(message); }); // Ограничиваем размер истории if (this.messageHistory.length > 100) { this.messageHistory = this.messageHistory.slice(-50); } } } // Обработка нового сообщения processMessage(messageText) { console.log("New message detected:", messageText); // Анализ сообщения на ключевые слова if (this.containsKeywords(messageText)) { this.handleKeywordMessage(messageText); } // Автоматические ответы if (this.shouldAutoReply(messageText)) { this.generateAutoReply(messageText); } } // Проверка на ключевые слова containsKeywords(message) { const keywords = [ 'urgent', 'важно', 'срочно', 'help', 'помощь', 'meeting', 'собрание', 'deadline', 'дедлайн' ]; return keywords.some(keyword => message.toLowerCase().includes(keyword.toLowerCase()) ); } // Обработка сообщений с ключевыми словами handleKeywordMessage(message) { this.showNotification("Important message detected!"); this.highlightMessage(message); // Отправка в внешний сервис (если настроен) this.sendToExternalService(message); } // Проверка необходимости автоответа shouldAutoReply(message) { const autoReplyTriggers = [ 'привет', 'hello', 'hi', 'как дела', 'how are you' ]; return autoReplyTriggers.some(trigger => message.toLowerCase().includes(trigger.toLowerCase()) ); } // Генерация автоматического ответа generateAutoReply(originalMessage) { const replies = [ "Спасибо за сообщение! Отвечу чуть позже.", "Получил ваше сообщение, обработаю в ближайшее время.", "Thanks for your message! I'll get back to you soon.", "Message received, will respond shortly." ]; const randomReply = replies[Math.floor(Math.random() * replies.length)]; setTimeout(() => { this.sendMessage(randomReply); }, Math.random() * 3000 + 1000); // Задержка 1-4 секунды } // Отправка сообщения sendMessage(text) { const inputElement = document.querySelector(this.config.inputSelector); const sendButton = document.querySelector(this.config.buttonSelector); if (inputElement && sendButton) { // Устанавливаем текст inputElement.focus(); inputElement.textContent = text; // Имитируем ввод const inputEvent = new Event('input', { bubbles: true }); inputElement.dispatchEvent(inputEvent); // Отправляем setTimeout(() => { sendButton.click(); }, 500); } } // Выделение важного сообщения highlightMessage(messageText) { const messageElements = document.querySelectorAll(this.config.messageSelector); messageElements.forEach(element => { if (element.textContent.includes(messageText)) { element.style.backgroundColor = '#ffeb3b'; element.style.border = '2px solid #ff9800'; element.style.borderRadius = '5px'; // Убираем выделение через 10 секунд setTimeout(() => { element.style.backgroundColor = ''; element.style.border = ''; element.style.borderRadius = ''; }, 10000); } }); } // Показ уведомления showNotification(message) { // Создаем элемент уведомления const notification = document.createElement('div'); notification.textContent = message; notification.style.cssText = ` position: fixed; top: 20px; right: 20px; background: #4caf50; color: white; padding: 15px; border-radius: 5px; z-index: 10000; font-size: 14px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); `; document.body.appendChild(notification); // Убираем уведомление через 3 секунды setTimeout(() => { notification.remove(); }, 3000); } // Отправка данных во внешний сервис sendToExternalService(message) { const data = { site: this.currentDomain, message: message, timestamp: new Date().toISOString(), userAgent: navigator.userAgent }; fetch('https://api.example.com/messages', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }).catch(error => { console.error('Failed to send to external service:', error); }); } // Обработка новых сообщений при изменении DOM handleNewMessages() { if (this.isActive) { this.checkForNewMessages(); } } } // Запуск при загрузке страницы if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { new MessageHandler(); }); } else { new MessageHandler(); } // Дополнительные утилиты const utils = { // Получение информации о странице getPageInfo() { return { url: window.location.href, title: document.title, domain: window.location.hostname, timestamp: new Date().toISOString() }; }, // Сохранение настроек в localStorage saveSettings(settings) { localStorage.setItem('messageHandlerSettings', JSON.stringify(settings)); }, // Загрузка настроек из localStorage loadSettings() { const saved = localStorage.getItem('messageHandlerSettings'); return saved ? JSON.parse(saved) : {}; }, // Очистка истории сообщений clearHistory() { localStorage.removeItem('messageHistory'); } };