const fs = require('fs'); const path = require('path'); const puppeteer = require('puppeteer'); const readline = require('readline'); async function askCode(question) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); return new Promise(resolve => { rl.question(question, answer => { rl.close(); resolve(answer.trim()); }); }); } (async () => { const username = process.env.INSTAGRAM_USER; const password = process.env.INSTAGRAM_PASS; const cookieFile = process.env.COOKIE_FILE || '/shared/cookies/instagram.json'; if (!username || !password) { console.error('Faltam as variáveis INSTAGRAM_USER ou INSTAGRAM_PASS'); process.exit(1); } console.log('Iniciando navegador headless...'); const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); const page = await browser.newPage(); await page.setViewport({ width: 1366, height: 768 }); console.log('Acessando página de login do Instagram...'); await page.goto('https://www.instagram.com/accounts/login/', { waitUntil: 'networkidle2', }); await page.waitForSelector('input[name="username"]', { timeout: 60000 }); await page.type('input[name="username"]', username, { delay: 40 }); await page.type('input[name="password"]', password, { delay: 40 }); await Promise.all([ page.click('button[type="submit"]'), page.waitForNavigation({ waitUntil: 'networkidle2' }).catch(() => {}), ]); // Tenta detectar 2FA / código de segurança console.log('Verificando se o Instagram pediu código de 2 fatores...'); let twoFaInput = null; try { twoFaInput = await page.waitForSelector('input[type="text"]', { timeout: 30000 }); } catch (e) { console.log('Nenhum campo de 2FA detectado (pode já estar logado).'); } if (twoFaInput) { console.log('Campo de 2FA encontrado. Pegue o código que chegou no seu celular...'); const code = await askCode('Digite o código de 2 fatores recebido por SMS: '); await page.type('input[type="text"]', code, { delay: 50 }); // botão de confirmar (pode variar, então tentamos alguns seletores comuns) const selectorsBotao = [ 'button[type="button"]', 'button[type="submit"]', 'div[role="button"]' ]; let clicked = false; for (const sel of selectorsBotao) { const btn = await page.$(sel); if (btn) { await Promise.all([ btn.click(), page.waitForNavigation({ waitUntil: 'networkidle2' }).catch(() => {}), ]); clicked = true; break; } } if (!clicked) { console.warn('Não foi possível encontrar o botão de confirmar 2FA automaticamente.'); } } const currentUrl = page.url(); console.log('URL após login:', currentUrl); // Aqui consideramos que se não caiu na tela de erro, provavelmente logou const cookies = await page.cookies(); fs.mkdirSync(path.dirname(cookieFile), { recursive: true }); fs.writeFileSync(cookieFile, JSON.stringify(cookies, null, 2), 'utf8'); console.log('Cookies salvos em:', cookieFile); await browser.close(); process.exit(0); })();