Spaces:
Paused
Paused
| const express = require('express'); | |
| const puppeteer = require('puppeteer-extra'); | |
| const StealthPlugin = require('puppeteer-extra-plugin-stealth'); | |
| const path = require('path'); | |
| puppeteer.use(StealthPlugin()); | |
| const app = express(); | |
| app.use(express.json()); | |
| app.use(express.static(path.join(__dirname, 'public'))); | |
| app.post('/api/generate', async (req, res) => { | |
| const { prompt } = req.body; | |
| if (!prompt) return res.status(400).json({ success: false, error: "Prompt is required." }); | |
| let browser; | |
| try { | |
| // Notice we removed executablePath, it will use the one NPM installs! | |
| browser = await puppeteer.launch({ | |
| headless: "new", | |
| args: [ | |
| '--no-sandbox', | |
| '--disable-setuid-sandbox', | |
| '--disable-dev-shm-usage', | |
| '--window-size=1280,720' | |
| ] | |
| }); | |
| const page = await browser.newPage(); | |
| await page.setViewport({ width: 1280, height: 720 }); | |
| await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'); | |
| let mediaUrl = null; | |
| page.on('response', async (response) => { | |
| if (response.url().includes('/nextjs-api/stream/create-evaluation') && response.status() === 200) { | |
| try { | |
| const text = await response.text(); | |
| const match = text.match(/https:\/\/[^\s"'<>\\]+\.(mp4|png|webp|jpg|jpeg)/i); | |
| if (match) mediaUrl = match[0]; | |
| } catch (e) {} | |
| } | |
| }); | |
| // 1. Go to site | |
| await page.goto('https://arena.ai/', { waitUntil: 'networkidle2' }); | |
| // Give Cloudflare 5 extra seconds to clear | |
| await new Promise(r => setTimeout(r, 5000)); | |
| // 2. Wait for textarea and type | |
| await page.waitForSelector('textarea', { timeout: 15000 }); | |
| await page.type('textarea', prompt, { delay: 50 }); | |
| await new Promise(r => setTimeout(r, 500)); | |
| // 3. Press Enter | |
| await page.keyboard.press('Enter'); | |
| // 4. Wait for media (up to 45 seconds) | |
| let attempts = 0; | |
| while (!mediaUrl && attempts < 45) { | |
| await new Promise(r => setTimeout(r, 1000)); | |
| attempts++; | |
| } | |
| if (mediaUrl) { | |
| res.json({ success: true, creator: "Silent Tech", prompt: prompt, url: mediaUrl }); | |
| } else { | |
| // 👁️ TAKE A SCREENSHOT OF THE BLOCK! | |
| const base64Screenshot = await page.screenshot({ encoding: "base64" }); | |
| res.status(500).json({ | |
| success: false, | |
| error: "Generation Timeout. See debug screenshot to find out why.", | |
| debug_image: `data:image/png;base64,${base64Screenshot}` | |
| }); | |
| } | |
| } catch (err) { | |
| res.status(500).json({ success: false, error: err.message }); | |
| } finally { | |
| if (browser) await browser.close(); | |
| } | |
| }); | |
| app.listen(7860, "0.0.0.0", () => { | |
| console.log('Silent Tech API Proxy running on port 7860'); | |
| }); |