Spaces:
Running
Running
| 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 | |
| }; |