TikTok UI Enabler

Скрывает капчу/модальные окна и обеспечивает интерактивность основного интерфейса TikTok.

// ==UserScript==
// @name         TikTok UI Enabler
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Скрывает капчу/модальные окна и обеспечивает интерактивность основного интерфейса TikTok.
// @author       Gemini
// @match        *://*.tiktok.com/*
// @grant        GM_addStyle
// @run-at       document-start
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 1. Скрываем капчу, оверлеи и модальные окна с помощью CSS.
    //    Также гарантируем, что основной контейнер всегда будет принимать клики.
    GM_addStyle(`
        /* Контейнеры капчи и модальных окон */
        #tiktok-verify-ele,
        .captcha-verify-container,
        div[data-floating-ui-portal] {
            display: none !important;
            visibility: hidden !important;
            pointer-events: none !important;
        }

        /* Оверлеи (полупрозрачный фон) */
        .TUXModal-overlay,
        .css-1o4zb36-DivModalMask {
            display: none !important;
            visibility: hidden !important;
        }

        /* Гарантируем, что основной контейнер приложения всегда интерактивен */
        #app, #main-content-video_detail {
            pointer-events: auto !important;
            filter: none !important; /* Убирает размытие, если оно применяется */
        }
    `);

    // 2. Используем MutationObserver для отслеживания и отмены блокирующих действий.
    const observer = new MutationObserver((mutationsList) => {
        for (const mutation of mutationsList) {
            // Цель: главный контейнер <div id="app">
            const appElement = document.getElementById('app');
            if (appElement && appElement.hasAttribute('inert')) {
                appElement.removeAttribute('inert');
                console.log('UserScript: Атрибут "inert" удален, UI разблокирован.');
            }

            // Цель: элемент <body>
            const bodyElement = document.body;
            if (bodyElement) {
                // Если JS пытается заблокировать прокрутку через стиль
                if (bodyElement.style.overflow === 'hidden') {
                    bodyElement.style.overflow = 'auto'; // или 'scroll'
                    console.log('UserScript: Прокрутка для <body> принудительно включена.');
                }
                // Если JS пытается заблокировать прокрутку через класс
                if (bodyElement.classList.contains('disable-scroll')) {
                    bodyElement.classList.remove('disable-scroll');
                    console.log('UserScript: Класс "disable-scroll" удален, UI разблокирован.');
                }
            }
        }
    });

    // Начинаем отслеживание изменений в <body> и его дочерних элементах
    // как только DOM будет доступен.
    window.addEventListener('DOMContentLoaded', () => {
        const targetNode = document.body;
        if (targetNode) {
            observer.observe(targetNode, {
                attributes: true, // отслеживать изменения атрибутов (style, class)
                childList: true, // отслеживать добавление/удаление дочерних элементов
                subtree: true,   // отслеживать изменения во всех вложенных элементах
            });
            console.log('UserScript: Отслеживание блокировки UI активно.');
        }
    });
})();