UNPKG

twx-media-scrapper

Version:

Twitter/x.com media content extractor via Puppeteer and TwitterDL

64 lines (47 loc) 2.14 kB
const fs = require("fs"); const path = require("path"); const { TwitterDL } = require("twitter-downloader"); const { getTwitterAuth } = require("./auth"); const CACHE_PATH = path.join(__dirname, "auth_cache.json"); async function listTwitterMediaPath(url, email, username, password) { let auth = null; try { console.log("🚀 Coba ambil media tanpa login..."); const result = await TwitterDL(url); // tanpa auth if (result?.result?.media) { console.log("✅ Media ditemukan tanpa login."); return result.result; } console.log("🔐 Media tidak ditemukan atau akun dilindungi. Perlu login..."); // Login dan ambil token baru auth = await getTwitterAuth(email, username, password); const retryResult = await TwitterDL(url, { authorization: auth.authorization, cookie: auth.cookie }); if (retryResult?.result?.media) { console.log("✅ Media ditemukan setelah login."); return retryResult.result; } else { throw new Error("❌ Gagal mengambil media meskipun sudah login. Akun mungkin private atau URL tidak valid."); } } catch (err) { if (err.message.includes("401") || err.message.includes("unauthorized")) { console.warn("⚠️ Token expired atau tidak valid. Login ulang..."); if (fs.existsSync(CACHE_PATH)) fs.unlinkSync(CACHE_PATH); auth = await getTwitterAuth(email, username, password); const retryResult = await TwitterDL(url, { authorization: auth.authorization, cookie: auth.cookie }); if (retryResult?.result?.media) { console.log("✅ Media ditemukan setelah login ulang."); return retryResult.result; } else { throw new Error("❌ Gagal mengambil media setelah login ulang."); } } throw new Error(err.message); } } module.exports = { listTwitterMediaPath };