const express = require('express'); const { chromium, devices } = require('playwright'); const cors = require('cors'); const dotenv = require('dotenv'); const os = require('os'); dotenv.config(); const config = { maxTextLength: 100, viewport: { width: 1920, height: 1080 }, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' }; let browser, page; const utils = { async initialize() { if (!browser) { browser = await chromium.launch({ headless: true }); const context = await browser.newContext({ viewport: config.viewport, userAgent: config.userAgent }); await context.route('**/*', (route) => { const url = route.request().url(); if (url.endsWith('.png') || url.endsWith('.jpg') || url.includes('google-analytics')) { return route.abort(); } route.continue(); }); page = await context.newPage(); await page.goto('https://www.bratgenerator.com/', { waitUntil: 'domcontentloaded', timeout: 10000 }); try { await page.click('#onetrust-accept-btn-handler', { timeout: 2000 }); } catch { } await page.evaluate(() => setupTheme('white')); } }, async generateBrat(text) { await page.fill('#textInput', text); const overlay = page.locator('#textOverlay'); return overlay.screenshot({ timeout: 3000 }); }, async close() { if (browser) await browser.close(); } }; const utils2 = { async initialize() { if (!browser) { browser = await chromium.launch({ headless: true }); const context = await browser.newContext({ viewport: config.viewport, userAgent: config.userAgent, ...devices['iPhone 13'], }); await context.route('**/*', (route) => { const url = route.request().url(); if (url.endsWith('.png') || url.endsWith('.jpg') || url.includes('google-analytics')) { return route.abort(); } route.continue(); }); page = await context.newPage(); await page.goto('https://www.bratgenerator.com/', { waitUntil: 'domcontentloaded', timeout: 10000 }); await page.addStyleTag({ content: ` * { font-family: "Apple Color Emoji", -apple-system, BlinkMacSystemFont, sans-serif !important; } ` }); try { await page.click('#onetrust-accept-btn-handler', { timeout: 2000 }); } catch { } await page.evaluate(() => setupTheme('white')); } }, async generateBrat(text) { await page.fill('#textInput', text); const overlay = page.locator('#textOverlay'); return overlay.screenshot({ timeout: 3000 }); }, async close() { if (browser) await browser.close(); } }; const app = express(); app.use(express.json()); app.use(cors()); app.set('json spaces', 3); app.get('*', async (req, res) => { try { const { q, type } = req.query; if (!q) { return res.status(200).json({ name: 'HD Bart Generator API', message: 'Parameter q di perlukan', version: '2.1.0', runtime: { os: os.type(), platform: os.platform(), architecture: os.arch(), cpuCount: os.cpus().length, uptime: `${os.uptime()} seconds`, memoryUsage: `${Math.round((os.totalmem() - os.freemem()) / 1024 / 1024)} MB used of ${Math.round(os.totalmem() / 1024 / 1024)} MB` } }); } if (type === "iphone") { const imageBuffer = await utils2.generateBrat(q); res.set('Content-Type', 'image/png'); res.send(imageBuffer); } else { const imageBuffer = await utils.generateBrat(q); res.set('Content-Type', 'image/png'); res.send(imageBuffer); } } catch (error) { console.error(error); res.status(500).json({ status: false, message: 'Error generating image', error: process.env.NODE_ENV === 'development' ? error.message : undefined }); } }); const PORT = process.env.PORT || 7860; app.listen(PORT, async () => { console.log(`Server running on port ${PORT}`); await utils.initialize(); await utils2.initialize(); }); process.on('SIGINT', async () => { await utils.close(); await utils2.close(); process.exit(0); });