prasadonly/web-to-epub-bot
0
1const https = require('https');2const crypto = require('crypto').webcrypto;3 4async function decryptWtrlabBody(encryptedStr) {5 if (typeof encryptedStr !== "string") return encryptedStr;6 let isArray = false, dataStr = encryptedStr;7 if (dataStr.startsWith("arr:")) { isArray = true; dataStr = dataStr.substring(4); }8 else if (dataStr.startsWith("str:")) dataStr = dataStr.substring(4);9 else return encryptedStr;10 let parts = dataStr.split(":");11 if (parts.length < 3) return encryptedStr;12 let iv = Uint8Array.from(atob(parts[0]), c => c.charCodeAt(0));13 let tag = Uint8Array.from(atob(parts[1]), c => c.charCodeAt(0));14 let cipherB64 = parts.slice(2).join(":");15 let cipher = Uint8Array.from(atob(cipherB64), c => c.charCodeAt(0));16 let combined = new Uint8Array(cipher.length + tag.length);17 combined.set(cipher); combined.set(tag, cipher.length);18 let rawKey = new TextEncoder().encode("IJAFUUxjM25hyzL2AZrn0wl7cESED6Ru".slice(0, 32));19 let cryptoKey = await crypto.subtle.importKey("raw", rawKey, { name: "AES-GCM" }, false, ["decrypt"]);20 let decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv: iv }, cryptoKey, combined);21 let decodedStr = new TextDecoder().decode(decrypted);22 return isArray ? JSON.parse(decodedStr) : decodedStr;23}24 25function fetchJson(url) {26 return new Promise((resolve, reject) => {27 https.get(url, (res) => {28 let data = ''; res.on('data', chunk => data += chunk);29 res.on('end', () => resolve(JSON.parse(data)));30 }).on('error', reject);31 });32}33 34async function run() {35 let chapters = await fetchJson('https://wtr-lab.com/api/chapters/123');36 for (let i = 0; i < 3; i++) {37 let first = chapters.chapters[i];38 let reqData = JSON.stringify({ translate: "webplus", language: "en", raw_id: "123", chapter_no: first.order.toString(), retry: false, force_retry: false });39 await new Promise(resolve => {40 let req = https.request('https://wtr-lab.com/api/reader/get', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(reqData) } }, (res) => {41 let data = ''; res.on('data', chunk => data += chunk);42 res.on('end', async () => {43 let json = JSON.parse(data);44 if (json.data && json.data.data) {45 let decrypted = await decryptWtrlabBody(json.data.data.body);46 let hasObjects = false;47 if (Array.isArray(decrypted)) {48 hasObjects = decrypted.some(item => typeof item !== 'string');49 if (hasObjects) console.log(`Chapter ${i} has objects!`, decrypted.filter(item => typeof item !== 'string').slice(0, 2));50 }51 console.log(`Chapter ${i}: Array length: ${decrypted.length}, hasObjects: ${hasObjects}`);52 }53 resolve();54 });55 });56 req.write(reqData); req.end();57 });58 }59}60run();61 