const express = require('express'); const cors = require('cors'); const { connect } = require("puppeteer-real-browser"); const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); const recaptchav3 = require('./endpoints/recaptchav3'); const app = express(); const port = process.env.PORT || 7860; app.use(cors()); app.use(express.json()); const MAX_CONCURRENT = 5; let active = 0; const CONFIG = { MAX_CONCURRENT: 5, TIMEOUT: 30000, RETRY_ATTEMPTS: 2, HEADLESS: process.env.HEADLESS !== 'false', STEALTH_MODE: true }; app.use((req, res, next) => { req.setTimeout(CONFIG.TIMEOUT); next(); }); async function createBrowser() { const args = [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--no-first-run', '--no-zygote', '--disable-gpu', '--window-size=1920,1080', '--disable-web-security', '--disable-features=IsolateOrigins,site-per-process', '--disable-blink-features=AutomationControlled', '--lang=en-US,id', '--accept-lang=en-US,id' ]; const { browser, page } = await connect({ headless: CONFIG.HEADLESS, args, connectOption: { defaultViewport: null, timeout: CONFIG.TIMEOUT } }); 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'); const cookies = [ { name: 'NID', value: '511=your_cookie_value_here', domain: '.google.com', path: '/', expires: Date.now() + 1000 * 60 * 60 * 24 * 365, httpOnly: true, secure: true, sameSite: 'None' } ]; await page.setCookie(...cookies); return { browser, page }; } app.post('/recaptchav3', async (req, res) => { const { url, siteKey, action } = req.body; if (!url || !siteKey) { return res.status(400).json({ status: "error", message: "Missing url or siteKey" }); } if (active >= MAX_CONCURRENT) { return res.status(429).json({ status: "busy", message: "Server busy" }); } active++; let browserInstance = null; try { const { browser, page } = await createBrowser(); browserInstance = browser; const token = await recaptchav3(page, url, siteKey, action || 'submit'); res.json({ status: "success", token: token }); } catch (error) { const msg = error.message || String(error); console.error("API Error:", msg); res.status(500).json({ status: "error", message: msg }); } finally { if (browserInstance) { try { await browserInstance.close(); } catch {} } active--; } }); app.get('/', (req, res) => res.send("RV3 Solver Ready")); app.listen(port, () => console.log(`Server running on ${port}`));