const axios = require('axios').default; const { random } = require('lodash'); const DEEPL_BASE_URL = 'https://www2.deepl.com/jsonrpc'; const headers = { 'Content-Type': 'application/json', Accept: '*/*', 'x-app-os-name': 'iOS', 'x-app-os-version': '16.3.0', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'x-app-device': 'iPhone13,2', 'User-Agent': 'DeepL-iOS/2.9.1 iOS 16.3.0 (iPhone13,2)', 'x-app-build': '510265', 'x-app-version': '2.9.1', Connection: 'keep-alive', }; function getICount(translateText) { return (translateText || '').split('i').length - 1; } function getRandomNumber() { return random(8300000, 8399998) * 1000; } function getTimestamp(iCount) { const ts = Date.now(); if (iCount === 0) { return ts; } iCount++; return ts - (ts % iCount) + iCount; } async function translate( text, sourceLang = 'AUTO', targetLang = 'KO', numberAlternative = 0, printResult = false, ) { const iCount = getICount(text); const id = getRandomNumber(); numberAlternative = Math.max(Math.min(3, numberAlternative), 0); const postData = { jsonrpc: '2.0', method: 'LMT_handle_texts', id: id, params: { texts: [{ text: text, requestAlternatives: numberAlternative }], splitting: 'newlines', lang: { source_lang_user_selected: sourceLang.toUpperCase(), target_lang: targetLang.toUpperCase(), }, timestamp: getTimestamp(iCount), }, }; let postDataStr = JSON.stringify(postData); if ((id + 5) % 29 === 0 || (id + 3) % 13 === 0) { postDataStr = postDataStr.replace('"method":"', '"method" : "'); } else { postDataStr = postDataStr.replace('"method":"', '"method": "'); } try { const response = await axios.post(DEEPL_BASE_URL, postDataStr, { headers: headers, }); if (response.status === 429) { throw new Error( `Too many requests, your IP has been blocked by DeepL temporarily, please don't request it frequently in a short time.` ); } if (response.status !== 200) { console.error('Error', response.status); return; } const result = response.data.result.texts[0] if (printResult) { console.log(result); } return result; } catch (err) { console.error(err.message); } } exports.translate = translate;