tubapi-node/cookiewarmer.js
2026-03-21 19:54:23 -07:00

78 lines
3.0 KiB
JavaScript

const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
chromium.use(stealth);
async function exportCookiesFromBotProfile() {
const userDataDir = '/home/xesar/bot-profile';
const outputPath = path.resolve(__dirname, 'cookies.txt');
const lockFile = path.join(userDataDir, 'SingletonLock');
// 1. Limpieza de procesos previos para evitar el error de "Profile in use"
console.log('🧹 Limpiando bloqueos de Chrome...');
try {
execSync(`rm -f "${lockFile}"`);
execSync('pkill -f "user-data-dir=/home/xesar/bot-profile" || true');
} catch (e) {}
console.log('🚀 Iniciando Chrome con perfil de Bot...');
const context = await chromium.launchPersistentContext(userDataDir, {
executablePath: '/usr/bin/google-chrome',
headless: true, // Puedes ponerlo en false si quieres ver cómo entra a YouTube
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-blink-features=AutomationControlled'
]
});
const page = await context.newPage();
try {
// 2. Navegar a YouTube para que el navegador cargue las cookies en memoria activa
console.log('📺 Refrescando sesión en YouTube...');
await page.goto('https://www.youtube.com', { waitUntil: 'networkidle', timeout: 60000 });
// Esperamos un momento para que se carguen las cookies Secure-3PSID y similares
await page.waitForTimeout(5000);
// 3. Obtener cookies (Playwright las extrae YA DESCIFRADAS del navegador)
const cookies = await context.cookies();
// 4. Formatear al estándar Netscape (el que usa tu extensión y yt-dlp)
let netscape = "# Netscape HTTP Cookie File\n# This file is generated by Enlace Directo News Bot\n\n";
cookies.forEach(c => {
const domain = c.domain.startsWith('.') ? c.domain : `.${c.domain}`;
const hostOnly = "TRUE";
const path = c.path;
const secure = c.secure ? "TRUE" : "FALSE";
const expires = c.expires ? Math.round(c.expires) : 0;
// Estructura: domain \t flag \t path \t secure \t expiration \t name \t value
netscape += `${domain}\t${hostOnly}\t${path}\t${secure}\t${expires}\t${c.name}\t${c.value}\n`;
});
fs.writeFileSync(outputPath, netscape);
console.log(`✅ ¡Éxito! Se exportaron ${cookies.length} cookies.`);
console.log(`📄 Archivo guardado en: ${outputPath}`);
} catch (error) {
console.error('❌ Error durante la exportación:', error.message);
} finally {
await context.close();
}
}
// Ejecución automática si se llama al script directamente
if (require.main === module) {
exportCookiesFromBotProfile();
}
module.exports = { exportCookiesFromBotProfile };