| 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}`)); |