- // ==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');
- });
- })();