Greasy Fork is available in English.
Скрипт добавляет плавающую кнопку на страницы, которая при нажатии открывает YandexGPT (300.ya.ru) и передает текущий URL для создания обобщенного текста видео или статьи.
// ==UserScript== // @name YandexGPT Summarize // @namespace YandexGPT // @author NK // @version 1.0 // @description Скрипт добавляет плавающую кнопку на страницы, которая при нажатии открывает YandexGPT (300.ya.ru) и передает текущий URL для создания обобщенного текста видео или статьи. // @match *://*/* // @match *://300.ya.ru/* // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @license MIT // @homepage https://github.com/NikitaKrulov/TampermonkeyYaGPT // @icon https://300.ya.ru/favicon.ico // ==/UserScript== (function() { 'use strict'; // Check if we're on the Yandex GPT site if (window.location.hostname === '300.ya.ru') { // Get the URL parameter if it exists const urlParams = new URLSearchParams(window.location.search); const sourceUrl = urlParams.get('url'); if (sourceUrl) { // Function to find and interact with elements on the Yandex GPT page function fillAndSubmitForm() { // Use the exact selector for the textarea from the HTML const inputField = document.querySelector('textarea.textarea'); // Use the exact selector for the submit button from the HTML const submitButton = document.querySelector('button.button.submit'); if (inputField) { console.log('Found input field, filling with URL:', sourceUrl); // Focus the textarea first inputField.focus(); // Set the value and trigger events inputField.value = sourceUrl; inputField.dispatchEvent(new Event('input', { bubbles: true })); inputField.dispatchEvent(new Event('change', { bubbles: true })); // Add a brief delay to ensure the input is processed setTimeout(() => { // If we found a submit button, enable and click it if (submitButton) { console.log('Found submit button, enabling and clicking it'); // Remove disabled attribute submitButton.removeAttribute('disabled'); // Remove the disabled class submitButton.classList.remove('disabled'); // Wait a brief moment and then click setTimeout(() => { submitButton.click(); }, 300); } else { console.log('Submit button not found yet, retrying...'); setTimeout(fillAndSubmitForm, 500); } }, 300); } else { console.log('Input field not found yet, retrying...'); setTimeout(fillAndSubmitForm, 500); } } // Wait for the page to load and then attempt to fill the form // Try immediately and then retry a few more times if needed setTimeout(fillAndSubmitForm, 500); setTimeout(fillAndSubmitForm, 1000); setTimeout(fillAndSubmitForm, 2000); } return; } var floatingButton = document.createElement('div'); floatingButton.style.position = 'fixed'; floatingButton.style.bottom = '20px'; floatingButton.style.right = '20px'; floatingButton.style.width = '40px'; floatingButton.style.height = '40px'; floatingButton.style.cursor = 'pointer'; floatingButton.style.zIndex = '9999'; var svgIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svgIcon.setAttribute('class', 'alice__icon'); svgIcon.setAttribute('width', '40'); svgIcon.setAttribute('height', '40'); svgIcon.setAttribute('viewBox', '0 0 40 40'); svgIcon.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); var path1 = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path1.setAttribute('fill-rule', 'evenodd'); path1.setAttribute('clip-rule', 'evenodd'); path1.setAttribute('d', 'M19.973 12.22c-.525 0-1.032.19-1.488.455-.46.269-.914.64-1.345 1.069-.864.857-1.702 2.005-2.396 3.21-.694 1.206-1.266 2.505-1.575 3.68-.155.588-.249 1.166-.251 1.697-.002.525.086 1.058.347 1.51.261.453.679.795 1.135 1.055.461.264 1.008.47 1.594.63 1.172.32 2.583.475 3.973.476 1.39.002 2.802-.149 3.974-.466.586-.159 1.134-.364 1.595-.627.457-.26.874-.602 1.136-1.055.261-.453.349-.985.347-1.511-.002-.532-.096-1.11-.25-1.698-.308-1.176-.878-2.478-1.571-3.685-.694-1.207-1.53-2.356-2.393-3.214-.432-.43-.885-.801-1.345-1.07-.456-.266-.963-.456-1.488-.456zm-5.41 10.871c-.08-.14-.147-.38-.145-.754.001-.367.068-.813.202-1.321.267-1.015.777-2.191 1.424-3.313.646-1.122 1.407-2.154 2.152-2.895.373-.37.727-.651 1.045-.837.322-.188.565-.251.732-.251.165 0 .408.063.73.252.318.185.671.467 1.044.837.744.742 1.504 1.775 2.15 2.898.645 1.124 1.155 2.301 1.421 3.318.133.508.2.956.201 1.323.002.374-.065.614-.146.756-.081.14-.256.317-.58.502-.318.18-.738.345-1.244.482-1.012.274-2.285.416-3.58.414-1.294-.001-2.567-.147-3.58-.423-.506-.138-.926-.303-1.245-.485-.324-.185-.499-.362-.58-.503z'); path1.setAttribute('fill', 'currentColor'); var path2 = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path2.setAttribute('fill-rule', 'evenodd'); path2.setAttribute('clip-rule', 'evenodd'); path2.setAttribute('d', 'M32 20c0 6.627-5.373 12-12 12S8 26.627 8 20 13.373 8 20 8s12 5.373 12 12zm-1.5 0c0 5.799-4.701 10.5-10.5 10.5S9.5 25.799 9.5 20 14.201 9.5 20 9.5 30.5 14.201 30.5 20z'); path2.setAttribute('fill', 'currentColor'); svgIcon.appendChild(path1); svgIcon.appendChild(path2); floatingButton.appendChild(svgIcon); document.body.appendChild(floatingButton); // Create an error message element var errorContainer = document.createElement('div'); errorContainer.id = 'error-message'; errorContainer.style.position = 'fixed'; errorContainer.style.bottom = '70px'; errorContainer.style.right = '20px'; errorContainer.style.padding = '10px'; errorContainer.style.backgroundColor = 'rgba(136, 16, 16, 0.9)'; errorContainer.style.border = '1px solid red'; errorContainer.style.borderRadius = '5px'; errorContainer.style.zIndex = '9999'; errorContainer.style.maxWidth = '300px'; errorContainer.style.display = 'none'; document.body.appendChild(errorContainer); // Make the button draggable var isDragging = false; var startOffsetX = 0; var startOffsetY = 0; // Restore saved position if available var savedPositionX = GM_getValue('floatingButtonX'); var savedPositionY = GM_getValue('floatingButtonY'); if (savedPositionX !== undefined && savedPositionY !== undefined) { floatingButton.style.left = savedPositionX + 'px'; floatingButton.style.top = savedPositionY + 'px'; // Remove default bottom/right positioning floatingButton.style.bottom = 'auto'; floatingButton.style.right = 'auto'; } // Mouse events for dragging floatingButton.addEventListener('mousedown', startDrag); document.addEventListener('mousemove', drag); document.addEventListener('mouseup', endDrag); // Touch events for mobile devices floatingButton.addEventListener('touchstart', function(event) { var touch = event.touches[0]; startDrag(touch); event.preventDefault(); // Prevent scrolling while dragging }); document.addEventListener('touchmove', function(event) { var touch = event.touches[0]; drag(touch); event.preventDefault(); // Prevent scrolling while dragging }); document.addEventListener('touchend', endDrag); function startDrag(event) { isDragging = true; startOffsetX = (event.clientX || event.pageX) - floatingButton.offsetLeft; startOffsetY = (event.clientY || event.pageY) - floatingButton.offsetTop; } function drag(event) { if (isDragging) { var clientX = event.clientX || event.pageX; var clientY = event.clientY || event.pageY; // Calculate new position var newX = clientX - startOffsetX; var newY = clientY - startOffsetY; // Apply boundary checking var maxX = window.innerWidth - floatingButton.offsetWidth; var maxY = window.innerHeight - floatingButton.offsetHeight; newX = Math.max(0, Math.min(newX, maxX)); newY = Math.max(0, Math.min(newY, maxY)); // Update button position floatingButton.style.left = newX + 'px'; floatingButton.style.top = newY + 'px'; floatingButton.style.bottom = 'auto'; floatingButton.style.right = 'auto'; } } function endDrag() { if (isDragging) { isDragging = false; // Save position for persistence GM_setValue('floatingButtonX', parseInt(floatingButton.style.left)); GM_setValue('floatingButtonY', parseInt(floatingButton.style.top)); } } // Function to show error message function showError(message) { var errorElement = document.getElementById('error-message'); errorElement.textContent = message; errorElement.style.display = 'block'; // Hide after 5 seconds setTimeout(function() { errorElement.style.display = 'none'; }, 5000); } // Add click event to the floating button floatingButton.addEventListener('click', function() { // Store the current URL to be used on the Yandex GPT site GM_setValue('sourceArticleUrl', window.location.href); // Open YandexGPT with the current URL window.open('https://300.ya.ru/?url=' + encodeURIComponent(window.location.href), '_blank'); }); })();