| import express from 'express'; |
| import { chromium } from 'playwright'; |
| import cors from 'cors'; |
| import dotenv from 'dotenv'; |
| import os from 'os'; |
| import sharp from 'sharp'; |
|
|
| 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'); |
| |
| const pngBuffer = await overlay.screenshot({ |
| timeout: 3000, |
| type: 'png' |
| }); |
| |
| |
| return sharp(pngBuffer) |
| .webp({ quality: 80 }) |
| .toBuffer(); |
| }, |
|
|
| async close() { |
| if (browser) await browser.close(); |
| } |
| }; |
|
|
| const app = express(); |
| app.use(express.json()); |
| app.use(cors()); |
|
|
| app.get('*', async (req, res) => { |
| try { |
| const { q } = req.query; |
| if (!q) { |
| return res.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` |
| } |
| }); |
| } |
| const imageBuffer = await utils.generateBrat(q); |
| res.set('Content-Type', 'image/webp'); |
| res.send(imageBuffer); |
| } catch (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(); |
| }); |
|
|
| process.on('SIGINT', async () => { |
| await utils.close(); |
| process.exit(0); |
| }); |