const puppeteer = require("puppeteer"); function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } (async () => { const browser = await puppeteer.launch({ headless: false, defaultViewport: null, args: ["--kiosk", "--disable-infobars", "--no-sandbox"] }); const page = await browser.newPage(); await page.goto("https://my.flightradar24.com/dredgy", { waitUntil: "networkidle2" }); console.log("✅ Page loaded"); // Fullscreen button await page.waitForSelector("button.gm-fullscreen-control", { visible: true }); await page.evaluate(() => { const btn = document.querySelector("button.gm-fullscreen-control"); if (btn) btn.scrollIntoView(), btn.click(); btn.style.display = "none"; }); await delay(1000); // Double-click zoom const width = await page.evaluate(() => window.innerWidth); const height = await page.evaluate(() => window.innerHeight); const center = { x: width / 2, y: height / 2 }; for (let i = 0; i < 2; i++) { await page.mouse.click(0, 0, { clickCount: 2 }); await delay(500); } console.log("✅ Zoomed in 2x"); const startX = center.x; // inside viewport const startY = center.y; const tileWidth = 3440; const tileHeight = 1440; const cols = 7; const rows = 6; const delayBetweenPans = 1000; for (let row = 0; row < rows; row++) { const leftToRight = row % 2 === 0; // snake pattern for (let col = 0; col < cols; col++) { console.log(`Panning row ${row + 1}, col ${col + 1}`); await delay(delayBetweenPans); // take screenshot const filename = `output/tile_row${row + 1}_col${col + 1}.png`; await page.screenshot({ path: filename }); console.log(`📸 Saved screenshot: ${filename}`); // skip pan on last column if (col === cols - 1) continue; // horizontal pan const panDistance = tileWidth * 0.5; // adjust for overlap const dx = leftToRight ? -panDistance : panDistance; // left/right await page.mouse.move(startX, startY); await page.mouse.down(); await page.mouse.move(startX + dx, startY, { steps: 30 }); await page.mouse.up(); } // vertical pan to next row const verticalPan = tileHeight * 0.5; // adjust for overlap await page.mouse.move(startX, startY); await page.mouse.down(); await page.mouse.move(startX, startY - verticalPan, { steps: 30 }); // up = map moves down await page.mouse.up(); await delay(delayBetweenPans); } console.log("✅ Finished panning loop"); })();