TikTok Video Downloader - Ultimate

Download TikTok Videos Without A Watermark - The Best, Ultimate TikTok Script

目前為 2024-08-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name         TikTok Video Downloader - Ultimate
// @namespace    none
// @version      1.76
// @description  Download TikTok Videos Without A Watermark - The Best, Ultimate TikTok Script
// @author       altaireh
// @match        *://*.tiktok.com/*
// @icon         https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRA-YRvXcW4n9Uv8FvTYubFk4uLqV2A4J___55paaZmd3y1TT8q
// @grant        none
// ==/UserScript==

(() => {
    'use strict';

    const ICON_URL = 'https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRA-YRvXcW4n9Uv8FvTYubFk4uLqV2A4J___55paaZmd3y1TT8q';

    const createButton = (video) => {
        const button = document.createElement('img');
        button.src = ICON_URL;
        button.className = 'download-btn';
        button.style.cssText = `
            position: absolute; left: 10px; top: 50%; transform: translateY(-50%);
            z-index: 1000; width: 50px; height: 50px; cursor: pointer;
            border-radius: 50%; object-fit: cover; border: 2px solid rgba(255, 255, 255, 0.8);
        `;
        button.onclick = (e) => {
            e.stopPropagation();
            const videoUrl = video.src || video.querySelector('source')?.src;
            if (videoUrl) {
                const iframe = document.createElement('iframe');
                iframe.style.display = 'none';
                iframe.src = videoUrl;
                document.body.appendChild(iframe);
                setTimeout(() => document.body.removeChild(iframe), 500);
            } else {
                console.error('Video URL Not Found');
            }
        };
        return button;
    };

    const handleMouseOver = (event) => {
        const video = event.target;
        video.style.position = 'relative'; // Ensure Video Container Can Position The Button

        // Create And Add Button
        const button = createButton(video);
        video.parentNode.appendChild(button);

        // Handle Mouse Out To Remove Button When Mouse Leaves Both Video And Button
        const handleMouseOut = () => {
            if (!video.matches(':hover') && !button.matches(':hover')) {
                button.remove();
                video.classList.remove('handled'); // Remove Handled Class To Allow Re-Adding
                video.removeEventListener('mouseout', handleMouseOut);
                button.removeEventListener('mouseout', handleButtonMouseOut);
            }
        };

        // Handle Mouse Out To Reattach Removal Listener When Cursor Leaves Button
        const handleButtonMouseOut = () => {
            video.addEventListener('mouseout', handleMouseOut);
        };

        button.addEventListener('mouseout', handleButtonMouseOut);
        video.addEventListener('mouseout', handleMouseOut);
    };

    const initialize = () => {
        const isPreviewPage = () => /v16-webapp-prime.tiktok.com|mime_type=video_mp4/.test(location.href);

        if (isPreviewPage()) {
            const video = document.querySelector('video');
            if (video) {
                const link = document.createElement('a');
                link.href = video.src || video.querySelector('source')?.src;
                link.download = '';
                document.body.appendChild(link);
                link.click();
                link.remove();
            }
        } else {
            const observer = new MutationObserver(() => {
                document.querySelectorAll('video').forEach((video) => {
                    if (!video.classList.contains('handled')) {
                        video.classList.add('handled'); // Mark Video To Prevent Multiple Event Listeners
                        video.addEventListener('mouseover', handleMouseOver);
                    }
                });
            });

            observer.observe(document.body, { childList: true, subtree: true });
            document.querySelectorAll('video').forEach((video) => {
                if (!video.classList.contains('handled')) {
                    video.classList.add('handled'); // Mark Video To Prevent Multiple Event Listeners
                    video.addEventListener('mouseover', handleMouseOver);
                }
            });
        }
    };

    initialize();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址