const puppeteer = require('puppeteer'); const axios = require('axios'); function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function fbdl(url) { if (!url) { return { author: "Herza", success: false, error: "URL is required" }; } try { const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); await page.setUserAgent('Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.7444.171 Mobile Safari/537.36'); let downloadUrl = null; let apiResponse = null; page.on('response', async (response) => { const resUrl = response.url(); if (resUrl.includes('api.hitube.io/st-tik-video/fb/dl')) { try { const data = await response.json(); apiResponse = data; } catch (e) {} } if (resUrl.includes('api.hitube.io/st-tik-video/token/')) { downloadUrl = resUrl; } }); await page.goto('https://www.hitube.io/id/facebook-video-download', { waitUntil: 'networkidle2', timeout: 60000 }); await wait(2000); await page.waitForSelector('textarea[aria-label="Tempelkan tautan di sini"]', { visible: true, timeout: 10000 }); await page.type('textarea[aria-label="Tempelkan tautan di sini"]', url); await wait(1500); await page.waitForSelector('button.search-btn', { visible: true, timeout: 10000 }); await page.click('button.search-btn'); await wait(12000); try { await page.waitForSelector('div.flex:has-text("Download Foto")', { visible: true, timeout: 30000 }); } catch (e) { console.log('Download button not found, but may have captured URL'); } await wait(2000); await browser.close(); if (downloadUrl) { return { author: "Herza", success: true, data: { url: downloadUrl, } }; } return { author: "Herza", success: false, error: "Failed to capture download URL" }; } catch (error) { console.log('Puppeteer failed, trying API fallback...', error.message); return await fbdlAPI(url); } } async function fbdlAPI(url) { try { const sessionid = `hitube.io_${Math.random().toString(36).substring(7)}_${Date.now()}`; const secureMessages = [ 'XEKpZjB+0IPdSL33zsCyrSczOHvRfGabOwmJfklhnba8ej54WUKef4h1bAQaFcT396jxFrqu0t6VMMk2wToCSs3nvF/Gcv4RHNjX5PCyv8YNg4xncXWyVBrJGOUnanGkdopMxDhqaJkIJusLrAsrHYD3kfI40T59BNJBHd3SlJ8=', 'KZ/0an3pAJwU3XZk/KY08rFh6GjVfXrHKuvOdJBMRWPMO/le4Hrb/E4WzUxZYraEHKYYbrc3EasFGZPoNc3KSqsdwQqKM05epVe+y0ZcZik7e2rVRuiBifPETn2FYT58M61m442O6ncc6aJGJcsTjKp0B+3Mz9kKslRFkcIsei0=', 'YFLqajC+1JQeTM44xtDzsSchPIwSgHbcPxnKgkmincd9fk65XVLfg5i2cBRbGdU497kyGsrv1u7WNNl3xUpDTt4owRrLN16fqOkY6QDzw9ZOh5yodYWzWCsJHPVobhHldqpNyEiqbKlJKvtMsAtsIZE4lgJ51U6+COKCIe4Tmq9=' ]; const secureMessage = secureMessages[Math.floor(Math.random() * secureMessages.length)]; const apiUrl = `https://api.hitube.io/st-tik-video/fb/dl?url=${encodeURIComponent(url)}&sessionid=${sessionid}`; const response = await axios.get(apiUrl, { headers: { 'Accept': 'application/json, text/plain, */*', 'X-Secure-Message': secureMessage, 'User-Agent': 'Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36', 'Referer': 'https://www.hitube.io/id/facebook-video-download', 'Origin': 'https://www.hitube.io' } }); if (response.data.code === 200 && response.data.result.fbBos.length > 0) { const token = response.data.result.fbBos[0].url; const downloadUrl = `https://api.hitube.io/st-tik-video/token/${token}?sessionid=${sessionid}&wh=www.hitube.io&status=download`; return { author: "Herza", success: true, data: { url: downloadUrl } }; } return { author: "Herza", success: false, error: "Video not found" }; } catch (error) { return { author: "Herza", success: false, error: error.message }; } } const handler = async (req, res) => { try { const { url } = req.query; if (!url) { return res.status(400).json({ author: "Herza", success: false, error: 'Missing required parameter: url' }); } const result = await fbdl(url); res.json(result); } catch (error) { res.status(500).json({ author: "Herza", success: false, error: error.message }); } }; module.exports = { name: 'Facebook Downloader', description: 'Download Facebook Video using Our API service', type: 'GET', routes: ['api/download/fbdl'], tags: ['downloader', 'tools', 'misc'], parameters: ['url', 'key'], enabled: true, main: ['Downloader'], handler };