您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Оптимизированное автокопирование вопросов и ответов с изображениями
// ==UserScript== // @name Naurok Auto Copy & Notify (Enhanced Version) // @namespace http://tampermonkey.net/ // @version 2.4 // @description Оптимизированное автокопирование вопросов и ответов с изображениями // @author ENDERVANO // @license MIT // @match *://naurok.com.ua/test/testing/* // @grant GM_setClipboard // ==/UserScript== (function () { 'use strict'; let currentQuestionId = null; let darkMode = false; function getCurrentQuestionId() { const questionElem = document.querySelector('.test-content-text-inner'); if (!questionElem) return null; const imageUrl = document.querySelector('.test-content-image img')?.src || ''; return questionElem.innerText.trim() + imageUrl; } function formatQuestion() { let questionElem = document.querySelector('.test-content-text-inner'); let question = questionElem ? questionElem.innerText.trim() : "Вопрос не найден"; // Улучшенная проверка наличия изображения let imageElem = document.querySelector('.test-content-image img'); let imageText = ""; if (imageElem && imageElem.src && !imageElem.src.endsWith('/')) { imageText = `\n[Изображение вопроса: ${imageElem.src}]`; } let answerElems = document.querySelectorAll('.question-option-inner'); let answers = []; let correctAnswers = []; answerElems.forEach((el, index) => { let textElem = el.querySelector('.question-option-inner-content'); let imageElem = el.querySelector('.question-option-image'); let text = textElem ? textElem.innerText.trim() : ""; // Улучшенная проверка наличия изображения в ответе let answerImage = ""; if (imageElem && imageElem.style.backgroundImage && imageElem.style.backgroundImage !== 'none' && !imageElem.style.backgroundImage.includes('url("")')) { answerImage = ` [Изображение ответа: ${imageElem.style.backgroundImage.replace(/url\(["']?(.*?)["']?\)/, '$1')}]`; } let answerText = `${index + 1}) ${text}${answerImage}`; if (text.trim()) { answers.push(answerText); if (el.classList.contains('correct')) { correctAnswers.push(answerText); } } }); return { question: question, imageText: imageText, answers: answers, correctAnswers: correctAnswers }; } function addCopyButton() { const newQuestionId = getCurrentQuestionId(); if (!newQuestionId) return; if (newQuestionId === currentQuestionId && document.querySelector("#copyQuestionButton")) return; currentQuestionId = newQuestionId; let questionContainer = document.querySelector('.test-content-text') || document.querySelector('.test-content') || document.querySelector('.question-container'); if (!questionContainer) return; let oldButton = document.querySelector("#copyQuestionButton"); if (oldButton) oldButton.remove(); let oldControls = document.querySelector("#questionControls"); if (oldControls) oldControls.remove(); const formattedContent = formatQuestion(); if (!formattedContent.question || formattedContent.answers.length === 0) return; let copyText = `❓ Вопрос: ${formattedContent.question}${formattedContent.imageText}\n\n` + `🔹 Варианты ответов:\n${formattedContent.answers.join("\n")}`; if (formattedContent.correctAnswers.length > 0) { copyText += `\n\n✅ Правильные ответы:\n${formattedContent.correctAnswers.join("\n")}`; } // Create controls container let controls = document.createElement("div"); controls.id = "questionControls"; controls.style.cssText = ` display: flex; gap: 10px; margin-top: 15px; width: 100%; `; // Create copy button let copyButton = document.createElement("button"); copyButton.id = "copyQuestionButton"; copyButton.innerHTML = "📋 Скопировать вопрос"; copyButton.style.cssText = ` flex: 1; padding: 12px 20px; background: ${darkMode ? '#2c3e50' : '#007BFF'}; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 16px; font-weight: bold; text-align: center; transition: all 0.3s ease-in-out; box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); `; // Create theme toggle button let themeButton = document.createElement("button"); themeButton.innerHTML = darkMode ? "☀️" : "🌙"; themeButton.style.cssText = ` padding: 12px 20px; background: ${darkMode ? '#2c3e50' : '#007BFF'}; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 16px; font-weight: bold; transition: all 0.3s ease-in-out; box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); `; copyButton.onmouseover = () => copyButton.style.background = darkMode ? '#34495e' : '#0056b3'; copyButton.onmouseout = () => copyButton.style.background = darkMode ? '#2c3e50' : '#007BFF'; copyButton.onclick = function () { GM_setClipboard(copyText, "text"); showNotification("Скопировано!", formattedContent.imageText ? document.querySelector('.test-content-image img')?.src : null); }; themeButton.onclick = function () { darkMode = !darkMode; themeButton.innerHTML = darkMode ? "☀️" : "🌙"; copyButton.style.background = darkMode ? '#2c3e50' : '#007BFF'; themeButton.style.background = darkMode ? '#2c3e50' : '#007BFF'; }; controls.appendChild(copyButton); controls.appendChild(themeButton); questionContainer.appendChild(controls); } function showNotification(message, imageUrl) { let existingNotification = document.querySelector("#copyNotification"); if (existingNotification) existingNotification.remove(); let notification = document.createElement("div"); notification.id = "copyNotification"; notification.style.cssText = ` position: fixed; top: 20px; right: 20px; background: ${darkMode ? '#2c3e50' : 'white'}; color: ${darkMode ? 'white' : 'black'}; padding: 15px 20px; border-radius: 10px; box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); display: flex; align-items: center; font-size: 16px; font-weight: bold; z-index: 9999; opacity: 0; transform: translateX(50px); transition: opacity 0.3s ease, transform 0.3s ease; `; let icon = document.createElement("img"); icon.src = "https://cdn-icons-png.flaticon.com/512/190/190411.png"; icon.style.cssText = "width: 30px; height: 30px; margin-right: 10px;"; let text = document.createElement("span"); text.innerText = message; notification.appendChild(icon); notification.appendChild(text); if (imageUrl && !imageUrl.endsWith('/')) { let image = document.createElement("img"); image.src = imageUrl; image.style.cssText = "width: 40px; height: 40px; margin-left: 10px; border-radius: 5px;"; notification.appendChild(image); } document.body.appendChild(notification); setTimeout(() => { notification.style.opacity = "1"; notification.style.transform = "translateX(0)"; }, 50); setTimeout(() => { notification.style.opacity = "0"; notification.style.transform = "translateX(50px)"; setTimeout(() => notification.remove(), 300); }, 2000); } function observeChanges() { const observer = new MutationObserver((mutations) => { for (let mutation of mutations) { if (mutation.type === 'childList' || (mutation.type === 'attributes' && mutation.attributeName === 'class')) { addCopyButton(); break; } } }); const container = document.querySelector('.question-container') || document.body; observer.observe(container, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] }); } function init() { addCopyButton(); observeChanges(); setTimeout(addCopyButton, 1000); setTimeout(addCopyButton, 2000); setTimeout(addCopyButton, 3000); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();