78 lines
3.0 KiB
JavaScript
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 };
|