File size: 4,365 Bytes
2fde7e2 |
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
const express = require('express');
const { chromium } = 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;
let totalRequests = 0;
function formatUptime(seconds) {
const years = Math.floor(seconds / (365 * 24 * 3600));
const days = Math.floor((seconds % (365 * 24 * 3600)) / (24 * 3600));
const hours = Math.floor((seconds % (24 * 3600)) / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = Math.floor(seconds % 60);
return `${years}y ${days}d ${hours}h ${minutes}m ${secs}s`;
}
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 app = express();
app.use(express.json());
app.use(cors());
app.set('json spaces', 3);
app.get('*', async (req, res) => {
try {
const { q } = req.query;
if (!q) {
return res.status(200).json({
name: 'HD Bart Generator API',
group: 'https://chat.whatsapp.com/ETZ8r7CLypfAPH93q0gC0y',
channel: 'https://whatsapp.com/channel/0029VaJYWMb7oQhareT7F40V',
message: 'Parameter q di perlukan',
version: '2.1.0',
runtime: {
os: {
type: os.type(),
platform: os.platform(),
release: os.release(),
architecture: os.arch(),
uptime: formatUptime(os.uptime())
},
cpu: {
count: os.cpus().length,
model: os.cpus()[0].model,
speed: `${os.cpus()[0].speed} MHz`
},
memory: {
total: `${(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)} GB`,
used: `${((os.totalmem() - os.freemem()) / 1024 / 1024 / 1024).toFixed(2)} GB`,
free: `${(os.freemem() / 1024 / 1024 / 1024).toFixed(2)} GB`
},
loadAverage: os.platform() === 'linux' || os.platform() === 'darwin' ? os.loadavg().map(n => n.toFixed(2)) : 'N/A',
totalRequests: totalRequests
}
});
}
totalRequests++;
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();
});
process.on('SIGINT', async () => {
await utils.close();
process.exit(0);
});
|