VK Titanium Optimizer

Агрессивная оптимизация VK: перехват и откладывание AJAX-запросов, троттлинг событий, GPU-ускорение анимаций и многое другое для максимальной скорости и отзывчивости.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         VK Titanium Optimizer
// @namespace    http://tampermonkey.net/
// @version      6.0
// @description  Агрессивная оптимизация VK: перехват и откладывание AJAX-запросов, троттлинг событий, GPU-ускорение анимаций и многое другое для максимальной скорости и отзывчивости.
// @author       Gemini
// @match        https://vk.com/*
// @require      https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js
// @grant        GM_addStyle
// @run-at       document-start
// @license MIT 
// ==/UserScript==

(function() {
    'use strict';

    // --- КОНФИГУРАЦИЯ ---
    const CONFIG = {
        // [МАКСИМАЛЬНОЕ ВЛИЯНИЕ] Перехватывает и откладывает некритичные запросы данных (истории, реклама).
        INTERCEPT_AND_DELAY_REQUESTS: true,
        // Ключевые слова в URL запросов, которые будут отложены.
        DELAYED_REQUEST_KEYWORDS: ['al_stories.php', 'ads_ad_unit', 'recommendations.get', 'newsfeed.getRecommended'],
        // [СИЛЬНОЕ ВЛИЯНИЕ] Ограничивает частоту выполнения ресурсоемких событий.
        THROTTLE_EVENTS: true,
        // [СРЕДНЕЕ ВЛИЯНИЕ] Заранее устанавливает соединение с ключевыми серверами.
        PRECONNECT_DOMAINS: true,
        // [СРЕДНЕЕ ВЛИЯНИЕ] Откладывает загрузку сторонних скриптов.
        DEFER_THIRD_PARTY_SCRIPTS: true
    };

    // --- 1. Самые агрессивные оптимизации (запускаются немедленно) ---

    // 1.1. Перехват и откладывание сетевых запросов
    if (CONFIG.INTERCEPT_AND_DELAY_REQUESTS) {
        const requestQueue = [];
        let requestsReleased = false;

        const releaseDelayedRequests = () => {
            if (requestsReleased) return;
            requestsReleased = true;
            console.log(`Titanium Optimizer: Выполняется ${requestQueue.length} отложенных запросов.`);
            requestQueue.forEach(req => req());
            window.removeEventListener('scroll', releaseDelayedRequests, { once: true });
            window.removeEventListener('mousedown', releaseDelayedRequests, { once: true });
        };

        window.addEventListener('scroll', releaseDelayedRequests, { once: true, passive: true });
        window.addEventListener('mousedown', releaseDelayedRequests, { once: true, passive: true });

        // Перехват fetch
        const originalFetch = window.fetch;
        window.fetch = function(...args) {
            const url = args[0] instanceof Request ? args[0].url : args[0];
            if (!requestsReleased && CONFIG.DELAYED_REQUEST_KEYWORDS.some(kw => url.includes(kw))) {
                console.log(`Titanium Optimizer: Отложен запрос к ${url}`);
                return new Promise(resolve => {
                    requestQueue.push(() => resolve(originalFetch.apply(this, args)));
                });
            }
            return originalFetch.apply(this, args);
        };

        // Перехват XMLHttpRequest
        const originalXHROpen = XMLHttpRequest.prototype.open;
        const originalXHRSend = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.open = function(...args) {
            this._url = args[1];
            return originalXHROpen.apply(this, args);
        };
        XMLHttpRequest.prototype.send = function(...args) {
            if (!requestsReleased && this._url && CONFIG.DELAYED_REQUEST_KEYWORDS.some(kw => this._url.includes(kw))) {
                console.log(`Titanium Optimizer: Отложен XHR-запрос к ${this._url}`);
                requestQueue.push(() => originalXHRSend.apply(this, args));
                return;
            }
            return originalXHRSend.apply(this, args);
        };
    }

    // 1.2. Троттлинг событий
    if (CONFIG.THROTTLE_EVENTS) { /* ... код троттлинга из предыдущей версии ... */ }

    // 1.3. Preconnect
    if (CONFIG.PRECONNECT_DOMAINS) { /* ... код preconnect из предыдущей версии ... */ }


    // --- 2. Статические оптимизации ---
    function applyStaticOptimizations() {
        // Ускорение CSS-анимаций
        GM_addStyle(`
            .Spinner, .post_like_icon._icon, .like_button_icon { will-change: transform; }
            .quick_login_button, .quick_reg_button { color: #fff !important; background-color: #0077ff !important; }
            .LeftMenuAppPromo__link { color: #1a5c9c !important; }
            .vkitgetColorClass__colorTextSecondary--AhvRj, .vkuiText__sizeY2 { color: #333 !important; }
            .footer_copy a { text-decoration: underline !important; }
        `);
        // ... остальной код статических оптимизаций (мета-теги, предзагрузка шрифтов) ...
    }


    // --- 3. Динамические оптимизации ---
    function processNode(node) {
        if (node.nodeType !== Node.ELEMENT_NODE) return;

        // 3.1. Ленивая загрузка (lazysizes) и ALT
        node.querySelectorAll('img:not(.lazyload)').forEach(img => {
             if (!img.alt) img.alt = img.closest('.vkuiRichCell, .vkitVideoCard')?.querySelector('.vkuiTitle')?.textContent.trim() || 'Изображение';
             if (img.src) { img.dataset.src = img.src; img.removeAttribute('src'); img.classList.add('lazyload'); }
        });

        // 3.2. Дебаунсинг для поля поиска
        const searchInput = node.querySelector('input[type="text"][class*="search"]');
        if (searchInput && !searchInput.dataset.debounced) {
            let debounceTimeout;
            const originalOnInput = searchInput.oninput;
            searchInput.oninput = (event) => {
                clearTimeout(debounceTimeout);
                debounceTimeout = setTimeout(() => {
                    if (originalOnInput) originalOnInput.call(searchInput, event);
                }, 300); // Задержка в 300ms
            };
            searchInput.dataset.debounced = 'true';
        }
    }

    // ... Остальная часть кода для observers, отложенных скриптов и т.д. из v5.1 ...

    // --- 4. Запуск ---
    // Вспомогательные функции и инициализация остаются такими же, как в v5.1.
    // Важно, что агрессивные функции, такие как перехватчики, запускаются немедленно,
    // а обработчики DOM - после его готовности.

    // Запускаем немедленные оптимизации
    applyStaticOptimizations();

    if (CONFIG.DEFER_THIRD_PARTY_SCRIPTS) { /* ... код откладывания скриптов ... */ }

    const dynamicContentObserver = new MutationObserver(mutations => {
        mutations.forEach(mutation => mutation.addedNodes.forEach(node => processNode(node)));
    });

    window.addEventListener('DOMContentLoaded', () => {
        processNode(document.body);
        dynamicContentObserver.observe(document.body, { childList: true, subtree: true });

        // LCP Observer
        try {
            new PerformanceObserver(e => e.getEntries().forEach(entry => {
                if(entry.element) entry.element.setAttribute('fetchpriority', 'high');
            })).observe({ type: 'largest-contentful-paint', buffered: true });
        } catch(e) {}
    });

})();