Greasy Fork

Greasy Fork is available in English.

TikTok Video Downloader - Ultimate

Download TikTok Videos Without A Watermark

目前为 2024-07-29 提交的版本,查看 最新版本

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

(function() {
    'use strict';

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

    function createDownloadButton(video) {
        const img = document.createElement('img');
        img.src = ICON_URL;
        img.className = 'download-btn';
        img.style = `
            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);
        `;
        img.addEventListener('click', () => {
            const videoUrl = video.src || video.querySelector('source')?.src;
            if (videoUrl) {
                const a = document.createElement('a');
                a.href = videoUrl;
                a.target = '_blank';
                a.download = '';
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
            } else {
                console.error('Video URL not found');
            }
        });
        return img;
    }

    function addDownloadButton(video) {
        if (!video.nextElementSibling?.classList.contains('download-btn')) {
            video.parentNode.insertBefore(createDownloadButton(video), video.nextSibling);
        }
    }

    function initialize() {
        const observer = new MutationObserver(() => {
            document.querySelectorAll('video').forEach(addDownloadButton);
        });

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

        // Initial check
        document.querySelectorAll('video').forEach(addDownloadButton);
    }

    initialize();
})();