const puppeteer = require('/opt/webpage-screenshot-mcp/node_modules/puppeteer'); (async () => { const url = process.argv[2]; const out = process.argv[3] || '/tmp/shot.png'; const user = process.env.GF_USER || 'admin'; const pass = process.env.GF_PASS || 'astral66'; const base = new URL(url); const loginUrl = `${base.protocol}//${base.host}/login`; const browser = await puppeteer.launch({ headless: true, args: [ '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu', ], defaultViewport: { width: 1920, height: 1400 }, }); const page = await browser.newPage(); const res = await page.evaluate( async (loginUrl, user, pass) => { const r = await fetch(loginUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user, password: pass }), }); return r.status; }, loginUrl, user, pass ).catch(() => null); await page.goto(loginUrl, { waitUntil: 'domcontentloaded' }); await page.evaluate( async (loginUrl, user, pass) => { await fetch(loginUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ user, password: pass }), }); }, loginUrl, user, pass ); await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 }); await new Promise((r) => setTimeout(r, 6000)); await page.screenshot({ path: out, fullPage: false }); console.log('saved', out); await browser.close(); })().catch((e) => { console.error('ERR', e.message); process.exit(1); });