Google Drive Tải Trực Tiếp - Bỏ Qua Quét Virus

Bỏ qua cảnh báo quét virus của Google Drive và tải file trực tiếp. Tự động chuyển hướng đến liên kết tải trực tiếp, bỏ qua trang quét virus khó chịu.

// ==UserScript==
// @name         Google Drive Direct Download - Bypass Virus Scan
// @name:vi      Google Drive Tải Trực Tiếp - Bỏ Qua Quét Virus
// @namespace    gdrive-direct-download
// @version      1.2.16
// @description  Bypass Google Drive virus scan warning and download files directly. Automatically redirects to direct download links, skipping the annoying virus scan page.
// @description:vi Bỏ qua cảnh báo quét virus của Google Drive và tải file trực tiếp. Tự động chuyển hướng đến liên kết tải trực tiếp, bỏ qua trang quét virus khó chịu.
// @author       hongmd
// @license      MIT
// @homepageURL  https://github.com/hongmd/userscript-improved
// @supportURL   https://github.com/hongmd/userscript-improved/issues
// @match        https://drive.google.com/*
// @match        https://drive.usercontent.google.com/*
// @grant        none
// @run-at       document-start
// @noframes
// ==/UserScript==

(function () {
    "use strict";

    // Helper function to validate Google Drive URLs
    function isGoogleDriveUrl(url) {
        try {
            const urlObj = new URL(url);
            // Support multiple Google Drive domains and URL patterns
            return (
                urlObj.hostname === 'drive.usercontent.google.com' ||
                urlObj.hostname === 'drive.google.com'
            ) && (
                urlObj.pathname.includes('/uc') ||
                urlObj.search.includes('id=') ||
                urlObj.pathname.includes('/file/d/') ||
                urlObj.pathname.includes('/open')
            );
        } catch (e) {
            return false;
        }
    }

    // Helper function to extract file ID and create direct download URL
    function createDirectDownloadUrl(originalUrl) {
        try {
            const url = new URL(originalUrl);
            let fileId = url.searchParams.get("id");

            console.log("🔍 Processing URL:", originalUrl);
            console.log("🔍 URL pathname:", url.pathname);
            console.log("🔍 URL search:", url.search);

            if (!fileId) {
                // Try to extract ID from different URL patterns
                const pathMatch = url.pathname.match(/\/uc\?id=([^&]+)/);
                if (pathMatch) {
                    fileId = pathMatch[1];
                    console.log("🔍 Extracted ID from /uc path:", fileId);
                } else {
                    // Handle /file/d/FILE_ID/view pattern
                    const fileMatch = url.pathname.match(/\/file\/d\/([^\/]+)/);
                    if (fileMatch) {
                        fileId = fileMatch[1];
                        console.log("🔍 Extracted ID from /file/d/ path:", fileId);
                    } else {
                        // Handle /open?id=FILE_ID pattern
                        const openMatch = url.search.match(/id=([^&]+)/);
                        if (openMatch) {
                            fileId = openMatch[1];
                            console.log("🔍 Extracted ID from search params:", fileId);
                        }
                    }
                }
            } else {
                console.log("🔍 Found ID in search params:", fileId);
            }

            if (fileId) {
                // Create direct download URL with virus scan bypass
                // Check if URL already has direct download format but missing confirm parameter
                const hasDownloadPath = url.pathname.includes('/download');
                const hasConfirm = url.search.includes('confirm=');
                
                console.log("🔍 hasDownloadPath:", hasDownloadPath);
                console.log("🔍 hasConfirm:", hasConfirm);
                
                if (hasDownloadPath && !hasConfirm) {
                    // Add confirm=t to existing direct download URL
                    const newUrl = new URL(url);
                    newUrl.searchParams.set('confirm', 't');
                    const resultUrl = newUrl.toString();
                    console.log("🔍 Added confirm=t to existing URL:", resultUrl);
                    return resultUrl;
                } else {
                    // Use drive.google.com/uc format which is most reliable
                    const resultUrl = `https://drive.google.com/uc?export=download&id=${fileId}&confirm=t`;
                    console.log("🔍 Using drive.google.com/uc format:", resultUrl);
                    return resultUrl;
                }
            }
        } catch (e) {
            console.error("Error creating direct download URL:", e);
        }
        return null;
    }

    // Helper function to open download with multiple fallback methods
    function openDownload(url) {
        console.log("Attempting to open download:", url);
        
        // Method 1: PRIORITIZE location.href redirect (most reliable for downloads)
        try {
            console.log("🔄 Using location.href redirect (most reliable for downloads)...");
            // Small delay to show user what's happening
            alert("🚀 Starting download... Page will redirect to download URL.");
            setTimeout(() => {
                window.location.href = url;
            }, 100);
            console.log("✅ Download initiated with location.href");
            return true;
        } catch (e) {
            console.warn("⚠️ location.href failed:", e);
        }
        
        // Method 2: Try window.open as fallback
        try {
            const newWindow = window.open(url, '_blank');
            if (newWindow) {
                console.log("✅ Download opened successfully with window.open");
                // Close the popup after a short delay
                setTimeout(() => {
                    try {
                        newWindow.close();
                    } catch (e) {
                        // Ignore errors when closing
                    }
                }, 1000);
                return true;
            } else {
                console.warn("⚠️ window.open was blocked by popup blocker");
            }
        } catch (e) {
            console.warn("⚠️ window.open failed:", e);
        }
        
        // Method 3: Create temporary link and click it
        try {
            console.log("🔗 Trying programmatic link click...");
            const link = document.createElement('a');
            link.href = url;
            link.download = '';
            link.style.display = 'none';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            console.log("✅ Download initiated with link click");
            return true;
        } catch (e) {
            console.warn("⚠️ Link click failed:", e);
        }
        
        // Method 4: Copy to clipboard as last resort
        try {
            console.log("📋 Copying URL to clipboard as fallback...");
            navigator.clipboard.writeText(url).then(() => {
                alert(`🚀 Download URL copied to clipboard!\n\n📄 ${url}\n\n🔗 Paste this URL into a new tab to download directly.`);
                console.log("✅ URL copied to clipboard");
            });
        } catch (e) {
            console.error("❌ All download methods failed!");
            alert(`❌ Failed to open download automatically.\n\n📄 Please manually copy and open this URL:\n\n${url}`);
        }
        
        return false;
    }

    // Intercept fetch requests (optional - may cause issues on some sites)
    try {
        const originalFetch = window.fetch;
        window.fetch = async function (resource, init) {
            try {
                if (typeof resource === "string" && isGoogleDriveUrl(resource)) {
                    console.log("🚀 Intercepting fetch request:", resource);
                    const directUrl = createDirectDownloadUrl(resource);
                    if (directUrl) {
                        console.log("Bypassing virus scan, opening direct download:", directUrl);
                        openDownload(directUrl);
                        return new Response(null, { status: 204 });
                    }
                }
            } catch (e) {
                console.error("Error intercepting fetch:", e);
            }
            return originalFetch.apply(this, arguments);
        };
    } catch (e) {
        console.warn("Fetch interception not available:", e);
    }

    // Intercept XMLHttpRequest
    const originalXHROpen = XMLHttpRequest.prototype.open;
    const originalXHRSend = XMLHttpRequest.prototype.send;

    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        this._url = url;
        this._method = method;
        return originalXHROpen.apply(this, arguments);
    };

    XMLHttpRequest.prototype.send = function (data) {
        try {
            if (this._url && typeof this._url === "string" && isGoogleDriveUrl(this._url)) {
                console.log("🚀 Intercepting XHR request:", this._url);
                const directUrl = createDirectDownloadUrl(this._url);
                if (directUrl) {
                    console.log("Bypassing virus scan via XHR, opening direct download:", directUrl);
                    
                    // Try multiple methods to open download
                    openDownload(directUrl);
                    
                    // Prevent the original request and simulate a successful response
                    setTimeout(() => {
                        Object.defineProperty(this, 'readyState', { value: 4 });
                        Object.defineProperty(this, 'status', { value: 204 });
                        Object.defineProperty(this, 'statusText', { value: 'No Content' });
                        Object.defineProperty(this, 'responseText', { value: '' });

                        if (typeof this.onreadystatechange === 'function') {
                            this.onreadystatechange();
                        }
                    }, 0);
                    return;
                }
            }
        } catch (e) {
            console.error("Error intercepting XHR:", e);
        }
        return originalXHRSend.apply(this, arguments);
    };

    // Additional: Handle direct clicks on download links - PRIORITIZE THIS
    document.addEventListener('click', function (event) {
        try {
            const target = event.target.closest('a');
            if (target && target.href && isGoogleDriveUrl(target.href)) {
                console.log("🚀 Intercepting click on link:", target.href);
                event.preventDefault(); // Stop the default click behavior
                event.stopPropagation();
                
                const directUrl = createDirectDownloadUrl(target.href);
                if (directUrl) {
                    console.log("Bypassing virus scan via link click, redirecting to:", directUrl);
                    
                    // Show alert and redirect immediately
                    alert("🚀 Starting Google Drive download... Page will redirect.");
                    setTimeout(() => {
                        window.location.href = directUrl;
                    }, 100);
                    
                    return false; // Prevent any further processing
                }
            }
        } catch (e) {
            console.error("Error handling link click:", e);
        }
    }, true); // Use capture phase to intercept before other handlers

    console.log("Google Drive Direct Download script loaded - Virus scan bypass enabled");
    
    // ===== VIRUS SCAN PAGE DETECTION =====
    // If user lands on virus scan page, automatically redirect to direct download
    function checkForVirusScanPage() {
        const currentUrl = window.location.href;
        
        // Check if we're on a Google Drive page with virus scan
        if (currentUrl.includes('drive.google.com') && 
            (document.title.includes('Virus scan') || 
             document.body?.textContent?.includes('virus scan') ||
             document.querySelector('[data-target="virus-scan"]') ||
             document.querySelector('.virus-scan-warning'))) {
            
            console.log("🔍 Detected virus scan page, attempting to bypass...");
            
            // Try to extract file ID from current URL
            const urlMatch = currentUrl.match(/\/file\/d\/([^\/]+)/) || currentUrl.match(/id=([^&]+)/);
            if (urlMatch) {
                const fileId = urlMatch[1];
                const directUrl = `https://drive.google.com/uc?export=download&id=${fileId}&confirm=t`;
                
                console.log("🚀 Redirecting from virus scan page to direct download:", directUrl);
                alert("🚀 Bypassing Google Drive virus scan... Redirecting to direct download.");
                
                setTimeout(() => {
                    window.location.href = directUrl;
                }, 500);
                
                return true;
            }
        }
        
        return false;
    }
    
    // Check immediately and also after page loads
    if (!checkForVirusScanPage()) {
        // If not on virus scan page, set up monitoring for dynamic content
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                    // Check if virus scan content was added
                    setTimeout(checkForVirusScanPage, 100);
                }
            });
        });
        
        if (document.body) {
            observer.observe(document.body, { childList: true, subtree: true });
        }
    }
    
    // ===== DIRECT DOWNLOAD PAGE DETECTION =====
    // If user lands directly on a download URL, trigger download immediately
    function checkDirectDownloadPage() {
        // Prevent infinite loops
        if (window.gdriveDownloadTriggered) {
            console.log("⏹️ Download already triggered, skipping");
            return false;
        }
        
        const currentUrl = window.location.href;
        
        // Check if we're directly on a Google Drive download URL
        if (isGoogleDriveUrl(currentUrl) && 
            (currentUrl.includes('/download') || currentUrl.includes('export=download'))) {
            
            console.log("🎯 Detected direct download URL, triggering download:", currentUrl);
            
            // Check if URL already has confirm=t
            if (currentUrl.includes('confirm=t')) {
                console.log("✅ URL already has confirm=t, forcing download programmatically");
                
                // Mark as triggered to prevent loops
                window.gdriveDownloadTriggered = true;
                
                // Force download programmatically since browser may not auto-download
                setTimeout(() => {
                    console.log("🔗 Attempting programmatic download...");
                    
                    // Method 1: Create and click link
                    const link = document.createElement('a');
                    link.href = currentUrl;
                    link.download = '';
                    link.target = '_blank';
                    link.style.display = 'none';
                    
                    document.body.appendChild(link);
                    link.click();
                    document.body.removeChild(link);
                    console.log("✅ Link click attempted");
                    
                    // Method 2: Fallback - use window.open
                    setTimeout(() => {
                        if (!document.querySelector('iframe[src*="drive.google.com"]')) {
                            console.log("🔄 Fallback: using window.open");
                            window.open(currentUrl, '_blank');
                        }
                    }, 1000);
                    
                    // Method 3: Show instructions if download doesn't start
                    setTimeout(() => {
                        if (!document.querySelector('iframe[src*="drive.google.com"]')) {
                            alert(`🚀 Download should start automatically.\n\nIf not, right-click this page and select "Save as..."\n\nFile URL: ${currentUrl}`);
                            console.log("💡 Download instructions shown to user");
                        }
                    }, 3000);
                }, 500);
                
                return true;
            } else {
                // Add confirm=t and redirect
                const directUrl = createDirectDownloadUrl(currentUrl);
                console.log("🔄 Adding confirm=t and redirecting to:", directUrl);
                
                // Mark as triggered
                window.gdriveDownloadTriggered = true;
                
                setTimeout(() => {
                    window.location.href = directUrl;
                }, 500);
                
                return true;
            }
        }
        
        return false;
    }
    
    // Check immediately when script loads
    checkDirectDownloadPage();
    
    // Test the specific URL provided by user
    const testUrl = "https://drive.usercontent.google.com/download?id=1MExRoVwC9nwWn5LviZbJ8GgjEjp8syhz&export=download&authuser=0";
    console.log("Testing URL:", testUrl);
    console.log("Is Google Drive URL:", isGoogleDriveUrl(testUrl));
    
    if (isGoogleDriveUrl(testUrl)) {
        const directUrl = createDirectDownloadUrl(testUrl);
        console.log("Direct download URL:", directUrl);
    }
    
    // Add global function for manual testing
    window.testGDriveDownload = function(url) {
        console.log("Manual test for URL:", url);
        if (isGoogleDriveUrl(url)) {
            const directUrl = createDirectDownloadUrl(url);
            console.log("Opening direct download:", directUrl);
            openDownload(directUrl);
            return directUrl;
        } else {
            console.log("Not a Google Drive URL");
            return null;
        }
    };
    
    console.log("💡 Manual test: Copy and run in console: testGDriveDownload('YOUR_URL_HERE')");
    
    // ===== TEST FUNCTIONS =====
    // Add test button for debugging
    function addTestButton() {
        const testBtn = document.createElement('button');
        testBtn.textContent = '🧪 Test GDrive Download';
        testBtn.style.cssText = `
            position: fixed;
            top: 10px;
            right: 10px;
            z-index: 9999;
            background: #4285f4;
            color: white;
            border: none;
            padding: 8px 12px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 12px;
        `;
        
        testBtn.onclick = function() {
            const testUrls = [
                'https://drive.google.com/file/d/1ABC123/view?usp=sharing',
                'https://drive.google.com/open?id=1ABC123',
                'https://drive.google.com/uc?id=1ABC123&export=download',
                'https://drive.usercontent.google.com/download?id=1ABC123&confirm=t'
            ];
            
            console.log('🧪 Testing URL processing:');
            testUrls.forEach(url => {
                const processed = createDirectDownloadUrl(url);
                console.log(`  ${url} → ${processed}`);
            });
            
            alert('Check console for test results!');
        };
        
        document.body.appendChild(testBtn);
    }
    
    // Add button after page loads
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', addTestButton);
    } else {
        addTestButton();
    }
    
    // ===== MAIN EXECUTION =====
    (function() {
        'use strict';
        
        console.log('🚀 Google Drive Direct Download script loaded');
        
        // Add test button for debugging
        addTestButton();
        
        // Check if we're on a direct download page
        if (checkDirectDownloadPage()) {
            console.log('✅ Direct download page detected and handled');
            return; // Don't set up other listeners
        }
        
        // Set up click interception for regular Google Drive pages
        setupClickInterception();
        
        // Set up XHR/fetch interception as fallback
        setupNetworkInterception();
        
        console.log('🎯 Script ready - waiting for Google Drive links');
    })();
})();