recycleactor commited on
Commit
cdbc84c
·
verified ·
1 Parent(s): 26f06d4

Upload server.js

Browse files
Files changed (1) hide show
  1. server.js +57 -6
server.js CHANGED
@@ -76,6 +76,7 @@ async function fetchRaw(url, headers = {}) {
76
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
77
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
78
  'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
 
79
  'connection': 'close',
80
  ...headers
81
  },
@@ -87,9 +88,29 @@ async function fetchRaw(url, headers = {}) {
87
  resolve(fetchRaw(loc, headers));
88
  return;
89
  }
90
- let data = [];
91
- res.on('data', (chunk) => data.push(chunk));
92
- res.on('end', () => resolve(Buffer.concat(data).toString('utf8')));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  });
94
  req.on('error', reject);
95
  req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
@@ -651,7 +672,7 @@ const server = http.createServer(async (req, res) => {
651
  const q = query.q || '';
652
  if (!q) { jsonResp(res, { ok: false, error: 'no query' }, 400); return; }
653
  const searchUrl = 'https://uakinogo.io/index.php?do=search&subaction=search&story=' + encodeURIComponent(q);
654
- fetchRaw(searchUrl, { 'user-agent': 'Mozilla/5.0 Chrome/120', 'referer': 'https://uakinogo.io/' }).then(html => {
655
  const results = [];
656
  const addResult = (rawUrl, id, slug) => {
657
  if (!rawUrl || !id) return;
@@ -669,9 +690,39 @@ const server = http.createServer(async (req, res) => {
669
  let m;
670
  while ((m = reAbs.exec(html)) !== null) addResult(m[1], m[2], m[3]);
671
  while ((m = reRel.exec(html)) !== null) addResult(m[1], m[2], m[3]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
672
  try { console.log('[uakinogo/search] results:', results.length, results[0] ? results[0].url : 'none'); } catch (e) {}
673
- jsonResp(res, { ok: true, results: results.slice(0, 10) });
674
- }).catch(e => jsonResp(res, { ok: false, error: e.message }, 500));
675
  return;
676
  }
677
 
 
76
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
77
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
78
  'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
79
+ 'accept-encoding': 'gzip, deflate, br',
80
  'connection': 'close',
81
  ...headers
82
  },
 
88
  resolve(fetchRaw(loc, headers));
89
  return;
90
  }
91
+ let data = [];
92
+ res.on('data', (chunk) => data.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
93
+ res.on('end', () => {
94
+ try {
95
+ const buf = Buffer.concat(data);
96
+ const enc = String(res.headers['content-encoding'] || '').toLowerCase();
97
+ if (enc.includes('br')) {
98
+ const zlib = require('zlib');
99
+ return resolve(zlib.brotliDecompressSync(buf).toString('utf8'));
100
+ }
101
+ if (enc.includes('gzip')) {
102
+ const zlib = require('zlib');
103
+ return resolve(zlib.gunzipSync(buf).toString('utf8'));
104
+ }
105
+ if (enc.includes('deflate')) {
106
+ const zlib = require('zlib');
107
+ return resolve(zlib.inflateSync(buf).toString('utf8'));
108
+ }
109
+ resolve(buf.toString('utf8'));
110
+ } catch (e) {
111
+ resolve(Buffer.concat(data).toString('utf8'));
112
+ }
113
+ });
114
  });
115
  req.on('error', reject);
116
  req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
 
672
  const q = query.q || '';
673
  if (!q) { jsonResp(res, { ok: false, error: 'no query' }, 400); return; }
674
  const searchUrl = 'https://uakinogo.io/index.php?do=search&subaction=search&story=' + encodeURIComponent(q);
675
+ const parseSearchHtml = (html) => {
676
  const results = [];
677
  const addResult = (rawUrl, id, slug) => {
678
  if (!rawUrl || !id) return;
 
690
  let m;
691
  while ((m = reAbs.exec(html)) !== null) addResult(m[1], m[2], m[3]);
692
  while ((m = reRel.exec(html)) !== null) addResult(m[1], m[2], m[3]);
693
+ return results;
694
+ };
695
+
696
+ const looksLikeChallenge = (html) => {
697
+ const t = String(html || '');
698
+ if (!t) return true;
699
+ if (t.includes('cf-challenge') || t.includes('cf-browser-verification')) return true;
700
+ if (/Just a moment/i.test(t) && /Cloudflare/i.test(t)) return true;
701
+ if (t.includes('data-sitekey') && t.includes('cf-turnstile')) return true;
702
+ return false;
703
+ };
704
+
705
+ fetchRaw(searchUrl, { 'user-agent': 'Mozilla/5.0 Chrome/120', 'referer': 'https://uakinogo.io/' }).then(async html => {
706
+ let results = parseSearchHtml(html);
707
+ const challenged = looksLikeChallenge(html);
708
+ if ((challenged || results.length === 0) && typeof getStreams === 'function' && getStreams.toString) {
709
+ try {
710
+ const { getBrowser } = require('./alloha');
711
+ const browser = await getBrowser();
712
+ const page = await browser.newPage();
713
+ 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');
714
+ await page.setExtraHTTPHeaders({ 'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8', 'Referer': 'https://uakinogo.io/' });
715
+ await page.goto(searchUrl, { waitUntil: 'networkidle2', timeout: 25000 });
716
+ await new Promise(r => setTimeout(r, 1200));
717
+ const html2 = await page.content();
718
+ await page.close();
719
+ results = parseSearchHtml(html2);
720
+ } catch (e) {}
721
+ }
722
+
723
  try { console.log('[uakinogo/search] results:', results.length, results[0] ? results[0].url : 'none'); } catch (e) {}
724
+ jsonResp(res, { ok: true, results: results.slice(0, 10) });
725
+ }).catch(e => jsonResp(res, { ok: false, error: e.message }, 500));
726
  return;
727
  }
728