CoolFace
Apppublic

prasadonly/web-to-epub-bot

sourceHugging Faceupdated 5d agoView on Hugging Face
0likes
test_wtr_objects.cjs61 linesDownload Raw Back to root
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