Yandex Wikipedia Info

Добавляет дополнительную информацию из Wikipedia в боковую панель поиска Yandex.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Yandex Wikipedia Info
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Добавляет дополнительную информацию из Wikipedia в боковую панель поиска Yandex.
// @author       zzakhar
// @match        *://yandex.ru/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addElement
// @connect      ru.wikipedia.org
// @license      CC BY-NC-ND
// ==/UserScript==

(function() {
    'use strict';

    let lastQuery = '';

    function sendWikipediaApiRequest(query, callback) {
        const apiUrl = `https://ru.wikipedia.org/w/api.php?action=opensearch&format=json&formatversion=2&search=${encodeURIComponent(query)}&namespace=0&limit=1&origin=*`;
        console.log('Отправляю запрос через API Wikipedia:', apiUrl);

        GM_xmlhttpRequest({
            method: "GET",
            url: apiUrl,
            onload: function(response) {
                if (response.status === 200) {
                    const data = JSON.parse(response.responseText);
                    if (data[1].length > 0) {
                        const articleUrl = data[3][0]; // Берем первую ссылку
                        callback(null, articleUrl);
                    } else {
                        callback('Ничего не найдено');
                    }
                } else {
                    callback('Ошибка при запросе');
                }
            },
            onerror: function() {
                callback('Ошибка при запросе к Wikipedia API');
            }
        });
    }

    function processWikipediaResponse(articleUrl) {
        const searchResultAside = document.querySelector('#search-result-aside');
        const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;

        // Проверяем, существует ли уже контейнер
        if (document.querySelector("#search-result-aside > div.serp-list.serp-list_right_yes.serp-list_complementary_yes > div")) {
            console.log('Контейнер уже существует, создание нового отменено.');
            return;
        }

        GM_xmlhttpRequest({
            method: "GET",
            url: articleUrl,
            onload: function(response) {
                const doc = new DOMParser().parseFromString(response.responseText, 'text/html');

                // Создаем контейнер для результата
                const infoDiv = GM_addElement(searchResultAside, 'div', {
                    role: 'complementary',
                    'aria-label': 'Дополнительная информация по запросу',
                    className: 'serp-list serp-list_right_yes serp-list_complementary_yes',
                    style: `
                        padding: 15px;
                        border-radius: 10px;
                        margin-top: 10px;
                        display: block;
                        max-width: 90%;
                        background-color: ${isDarkMode ? '#0e1011' : '#f9f9f9'};
                        border: 2px solid ${isDarkMode ? '#970e05' : '#007BFF'};
                        color: ${isDarkMode ? 'white' : 'black'};
                    `
                });

                // Заголовок статьи
                GM_addElement(infoDiv, 'h2', {
                    textContent: doc.querySelector('h1').textContent,
                    style: `
                        margin: 0 0 20px;
                        font-size: 18px;
                        font-weight: bold;
                        color: ${isDarkMode ? '#ffcccc' : '#007BFF'};
                    `
                });

                // Логотип инфобокса, если он есть
                const logo = doc.querySelector('.infobox img');
                if (logo) {
                    GM_addElement(infoDiv, 'img', {
                        src: logo.src,
                        alt: doc.querySelector('h1').textContent,
                        style: `
                            max-width: 100px;
                            border-radius: 10px;
                            float: right;
                            margin-left: 10px;
                        `
                    });
                }

                // Основной контент
                const contentElements = doc.querySelectorAll('#mw-content-text p');
                contentElements.forEach((element, index) => {
                    if (index < 3) {
                        GM_addElement(infoDiv, 'p', {
                            textContent: element.textContent,
                            style: `
                                margin-top: 10px;
                                color: ${isDarkMode ? '#e5e5e5' : '#333'};
                            `
                        });
                    }
                });

                // Источник
                GM_addElement(infoDiv, 'p', {
                    textContent: "Источник: Wikipedia",
                    style: `
                        margin-top: 10px;
                        font-size: 12px;
                        text-align: right;
                        color: ${isDarkMode ? '#e5e5e5' : '#333'};
                    `
                });
            },
            onerror: function() {
                console.log('Ошибка при запросе страницы Wikipedia.');
            }
        });
    }

    function handleNoResults(queryText) {
        console.log('Ничего не найдено для:', queryText);

        const words = queryText.split(' ');

        // Проверка одного слова
        if (words.length === 1) {
            sendWikipediaApiRequest(queryText, function(error, articleUrl) {
                if (!error) {
                    processWikipediaResponse(articleUrl);
                }
            });
            return;
        }

        // Проверка запроса без пробелов
        const queryWithoutSpaces = queryText.replace(/\s+/g, '');
        sendWikipediaApiRequest(queryWithoutSpaces, function(error, articleUrl) {
            if (!error) {
                console.log('Нашелся результат:', queryWithoutSpaces);
                processWikipediaResponse(articleUrl);
            } else {
                // Проверка каждого слова отдельно
                for (let i = words.length - 1; i >= 0; i--) {
                    sendWikipediaApiRequest(words[i], function(error, articleUrl) {
                        if (!error) {
                            console.log('Нашелся результат для:', words[i]);
                            processWikipediaResponse(articleUrl);
                            return;
                        }
                        console.log(`Ничего не найдено для: ${words[i]}`);
                    });
                }
            }
        });
    }

    function CreateRightBox() {
        const searchResultAside = document.querySelector('#search-result-aside');
        const queryText = new URLSearchParams(window.location.search).get('text');

        if (queryText && queryText.length < 30 && queryText !== lastQuery) {
            lastQuery = queryText;

            sendWikipediaApiRequest(queryText, function(error, articleUrl) {
                if (!error) {
                    processWikipediaResponse(articleUrl);
                } else {
                    handleNoResults(queryText); // Если ничего не найдено
                }
            });
        }
    }

    function checkAndRun() {
        CreateRightBox();
    }

    function observeUrlChanges() {
        let oldHref = document.location.href;

        const body = document.querySelector("body");
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function() {
                if (oldHref !== document.location.href) {
                    oldHref = document.location.href;
                    console.log("URL изменен:", oldHref);
                    setTimeout(checkAndRun, 500);
                }
            });
        });

        observer.observe(body, { childList: true, subtree: true });
    }

    window.addEventListener('load', () => {
        checkAndRun();
        observeUrlChanges();
    });

})();