twx-media-scrapper
Version:
Twitter/x.com media content extractor via Puppeteer and TwitterDL
64 lines (47 loc) • 2.14 kB
JavaScript
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 };