Spaces:
Running
Running
Upload server.js
Browse files
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', () =>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 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 |
|