XORE21 commited on
Commit
0554a46
·
verified ·
1 Parent(s): f154f4a

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +76 -72
index.js CHANGED
@@ -1,52 +1,21 @@
1
  const express = require('express');
2
  const cors = require('cors');
3
  const { connect } = require("puppeteer-real-browser");
4
- const fs = require('fs');
5
  const path = require('path');
 
6
 
7
  const app = express();
8
  app.use(cors());
9
  app.use(express.json());
10
 
11
  const PORT = process.env.PORT || 7860;
12
- const MAX_CONCURRENT_BROWSERS = Number(process.env.MAX_BROWSERS) || 5;
13
  let activeBrowsers = 0;
14
 
15
- const CACHE_DIR = path.join(__dirname, "cache");
16
- const CACHE_FILE = path.join(CACHE_DIR, "cache.json");
17
- const CACHE_TTL = 30 * 60 * 1000;
18
-
19
- function getCache(key) {
20
- if (!fs.existsSync(CACHE_FILE)) return null;
21
- try {
22
- const data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));
23
- if (data[key] && Date.now() - data[key].timestamp < CACHE_TTL) {
24
- return data[key].value;
25
- }
26
- } catch (e) { return null; }
27
- return null;
28
- }
29
-
30
- function setCache(key, value) {
31
- try {
32
- if (!fs.existsSync(CACHE_DIR)) {
33
- fs.mkdirSync(CACHE_DIR, { recursive: true });
34
- }
35
-
36
- let data = {};
37
- if (fs.existsSync(CACHE_FILE)) {
38
- data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));
39
- }
40
- data[key] = { timestamp: Date.now(), value };
41
- fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2));
42
- } catch (e) { console.error("Cache Error : ", e); }
43
- }
44
-
45
  async function createBrowser(proxy = null) {
46
  const options = {
47
  headless: false,
48
  turnstile: true,
49
- executablePath: process.env.CHROME_PATH,
50
  args: [
51
  '--no-sandbox',
52
  '--disable-setuid-sandbox',
@@ -54,8 +23,10 @@ async function createBrowser(proxy = null) {
54
  '--disable-accelerated-2d-canvas',
55
  '--no-first-run',
56
  '--no-zygote',
57
- '--disable-gpu'
 
58
  ],
 
59
  customConfig: {},
60
  connectOption: { defaultViewport: null }
61
  };
@@ -73,72 +44,105 @@ async function createBrowser(proxy = null) {
73
  return { browser, page };
74
  }
75
 
76
- const handleCloudflare = require('./endpoints/cloudflare');
77
- const handleTurnstile = require('./endpoints/turnstile');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
  app.post('/bypass', async (req, res) => {
80
  const { url, mode, siteKey, proxy } = req.body;
81
 
82
- if (!url || !mode) {
83
- return res.status(400).json({ status: "error", message: "URL and Mode are required" });
84
- }
85
 
86
  if (activeBrowsers >= MAX_CONCURRENT_BROWSERS) {
87
- return res.status(429).json({ status: "busy", message: "Server is busy, please try again later" });
88
  }
89
 
90
- const cacheKey = JSON.stringify({ url, mode, siteKey });
91
- const cached = getCache(cacheKey);
92
- if (cached) return res.json({ status: "success", cached: true, ...cached });
93
-
94
  activeBrowsers++;
95
  let browserInstance = null;
96
 
97
  try {
 
 
98
  const { browser, page } = await createBrowser(proxy);
99
  browserInstance = browser;
100
 
101
  let result;
102
- if (mode === 'cloudflare') {
103
- result = await handleCloudflare(page, url);
104
- } else if (mode === 'turnstile') {
105
- if (!siteKey) throw new Error("Sitekey is required for Turnstile mode");
106
  result = await handleTurnstile(page, url, siteKey);
107
  } else {
108
- throw new Error("Unrecognized mode (use : cloudflare / turnstile)");
109
  }
110
 
111
- if (result) setCache(cacheKey, result);
112
-
113
  res.json({ status: "success", ...result });
114
 
115
  } catch (error) {
116
- console.error("Error Processing : ", error.message);
117
- res.status(500).json({ status: "error", message: error.message });
 
 
 
 
 
 
118
  } finally {
119
  if (browserInstance) {
120
- try { await browserInstance.close(); } catch (e) {}
121
  }
122
  activeBrowsers--;
123
  }
124
  });
125
 
126
- app.get('/', (req, res) => {
127
- res.json({
128
- status: "Running",
129
- active_browsers: activeBrowsers,
130
- max_browsers: MAX_CONCURRENT_BROWSERS,
131
- usage: {
132
- method: "POST",
133
- endpoint: "/bypass",
134
- body: {
135
- url: "https://target.com",
136
- mode: "cloudflare | turnstile",
137
- siteKey: "0x4AAAA... (only for turnstile)",
138
- proxy: { hostname: "...", port: "...", username: "...", password: "..." }
139
- }
140
- }
141
- });
142
- });
143
 
144
- app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
 
1
  const express = require('express');
2
  const cors = require('cors');
3
  const { connect } = require("puppeteer-real-browser");
 
4
  const path = require('path');
5
+ const fs = require('fs');
6
 
7
  const app = express();
8
  app.use(cors());
9
  app.use(express.json());
10
 
11
  const PORT = process.env.PORT || 7860;
12
+ const MAX_CONCURRENT_BROWSERS = 3;
13
  let activeBrowsers = 0;
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  async function createBrowser(proxy = null) {
16
  const options = {
17
  headless: false,
18
  turnstile: true,
 
19
  args: [
20
  '--no-sandbox',
21
  '--disable-setuid-sandbox',
 
23
  '--disable-accelerated-2d-canvas',
24
  '--no-first-run',
25
  '--no-zygote',
26
+ '--disable-gpu',
27
+ '--window-size=1280,720'
28
  ],
29
+ executablePath: process.env.CHROME_PATH || "/usr/bin/google-chrome-stable",
30
  customConfig: {},
31
  connectOption: { defaultViewport: null }
32
  };
 
44
  return { browser, page };
45
  }
46
 
47
+ async function handleTurnstile(page, url, siteKey) {
48
+ return new Promise(async (resolve, reject) => {
49
+ const timeout = setTimeout(() => reject(new Error("Timeout waiting for Turnstile token")), 45000);
50
+
51
+ try {
52
+ const htmlContent = `
53
+ <!DOCTYPE html>
54
+ <html>
55
+ <head><title>Turnstile</title></head>
56
+ <body>
57
+ <div class="cf-turnstile" data-sitekey="${siteKey}" data-callback="turnstileCallback"></div>
58
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
59
+ <script>
60
+ function turnstileCallback(token) {
61
+ console.log("Token received");
62
+ window.cf_token = token;
63
+ }
64
+ </script>
65
+ </body>
66
+ </html>
67
+ `;
68
+
69
+ await page.setRequestInterception(true);
70
+ page.once('request', request => {
71
+ request.respond({
72
+ status: 200,
73
+ contentType: 'text/html',
74
+ body: htmlContent
75
+ });
76
+ });
77
+
78
+ console.log(`[Turnstile] Navigating to ${url}`);
79
+ await page.goto(url, { waitUntil: "domcontentloaded" });
80
+
81
+ const checkToken = setInterval(async () => {
82
+ try {
83
+ const token = await page.evaluate(() => window.cf_token);
84
+ if (token) {
85
+ clearInterval(checkToken);
86
+ clearTimeout(timeout);
87
+ resolve({ token: token });
88
+ }
89
+ } catch (e) {
90
+ }
91
+ }, 500);
92
+
93
+ } catch (e) {
94
+ clearTimeout(timeout);
95
+ reject(e);
96
+ }
97
+ });
98
+ }
99
 
100
  app.post('/bypass', async (req, res) => {
101
  const { url, mode, siteKey, proxy } = req.body;
102
 
103
+ if (!url || !mode) return res.status(400).json({ status: "error", message: "Missing url or mode" });
 
 
104
 
105
  if (activeBrowsers >= MAX_CONCURRENT_BROWSERS) {
106
+ return res.status(429).json({ status: "busy", message: "Server busy, try again in 5 seconds" });
107
  }
108
 
 
 
 
 
109
  activeBrowsers++;
110
  let browserInstance = null;
111
 
112
  try {
113
+ console.log(`[REQ] Processing: ${url} | Mode: ${mode}`);
114
+
115
  const { browser, page } = await createBrowser(proxy);
116
  browserInstance = browser;
117
 
118
  let result;
119
+ if (mode === 'turnstile') {
120
+ if (!siteKey) throw new Error("siteKey required for turnstile");
 
 
121
  result = await handleTurnstile(page, url, siteKey);
122
  } else {
123
+ throw new Error("Only 'turnstile' mode supported in this fix version");
124
  }
125
 
126
+ console.log(`[SUCCESS] Token obtained for ${url}`);
 
127
  res.json({ status: "success", ...result });
128
 
129
  } catch (error) {
130
+ console.error(`[CRITICAL ERROR]`, error);
131
+
132
+ res.status(500).json({
133
+ status: "error",
134
+ message: error.message,
135
+ stack: error.stack
136
+ });
137
+
138
  } finally {
139
  if (browserInstance) {
140
+ try { await browserInstance.close(); } catch {}
141
  }
142
  activeBrowsers--;
143
  }
144
  });
145
 
146
+ app.get('/', (req, res) => res.send("M3M3K3 Server Running. Use POST /bypass"));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
+ app.listen(PORT, () => console.log(`Server listening on port ${PORT}`));