File size: 3,244 Bytes
77f6a35 abc92ad 77f6a35 abc92ad 77f6a35 abc92ad 08f7964 abc92ad 77f6a35 01f9943 bfa0169 abc92ad bfa0169 abc92ad bfa0169 abc92ad bfa0169 abc92ad bfa0169 01f9943 abc92ad 08f7964 bfa0169 77f6a35 bfa0169 08f7964 bfa0169 08f7964 bfa0169 77f6a35 01f9943 77f6a35 01f9943 abc92ad 01f9943 08f7964 01f9943 bfa0169 01f9943 abc92ad 77f6a35 08f7964 01f9943 abc92ad 01f9943 abc92ad bfa0169 01f9943 77f6a35 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
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'
};
const utils = {
async createBrowserInstance() {
const 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();
});
const 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'));
return { browser, page };
},
async generateBrat(text) {
const { browser, page } = await this.createBrowserInstance();
try {
await page.fill('#textInput', text);
const overlay = page.locator('#textOverlay');
// Take screenshot
const pngBuffer = await overlay.screenshot({
timeout: 3000,
type: 'png'
});
// Convert to WebP
return await sharp(pngBuffer)
.webp({ quality: 80 })
.toBuffer();
} finally {
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 diperlukan',
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, () => {
console.log(`Server running on port ${PORT}`);
}); |