/** * Last update: 2018/11/24 * https://translate.google.com/translate/releases/twsfe_w_20160620_RC00/r/js/desktop_module_main.js * * Everything between 'BEGIN' and 'END' was copied from the url above. */ var got = require('got'); var Configstore = require('configstore'); /* eslint-disable */ // BEGIN function sM(a) { var b; if (null !== yr) b = yr; else { b = wr(String.fromCharCode(84)); var c = wr(String.fromCharCode(75)); b = [b(), b()]; b[1] = c(); b = (yr = window[b.join(c())] || "") || "" } var d = wr(String.fromCharCode(116)) , c = wr(String.fromCharCode(107)) , d = [d(), d()]; d[1] = c(); c = "&" + d.join("") + "="; d = b.split("."); b = Number(d[0]) || 0; for (var e = [], f = 0, g = 0; g < a.length; g++) { var l = a.charCodeAt(g); 128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 === (l & 64512) && g + 1 < a.length && 56320 === (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = l >> 18 | 240, e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224, e[f++] = l >> 6 & 63 | 128), e[f++] = l & 63 | 128) } a = b; for (f = 0; f < e.length; f++) a += e[f], a = xr(a, "+-a^+6"); a = xr(a, "+-3^+b+-f"); a ^= Number(d[1]) || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return c + (a.toString() + "." + (a ^ b)) } var yr = null; var wr = function (a) { return function () { return a } } , xr = function (a, b) { for (var c = 0; c < b.length - 2; c += 3) { var d = b.charAt(c + 2) , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d) , d = "+" === b.charAt(c + 1) ? a >>> d : a << d; a = "+" === b.charAt(c) ? a + d & 4294967295 : a ^ d } return a }; // END /* eslint-enable */ var config = new Configstore('google-translate-api'); var window = { TKK: config.get('TKK') || '422854.923862967' }; function updateTKK(opts) { opts = opts || {tld: 'com', proxy: {}, headers: {}}; return new Promise(function (resolve, reject) { var now = Math.floor(Date.now() / 3600000); if (Number(window.TKK.split('.')[0]) === now) { resolve(); } else { got('https://translate.google.' + opts.tld, {...opts.proxy, headers: opts.headers, timeout: 2000, retry: 0}).then(function (res) { var code = res.body.match(/TKK='.*?';/g); if (code) { eval(code[0]); /* eslint-disable no-undef */ if (typeof TKK !== 'undefined') { window.TKK = TKK; config.set('TKK', TKK); } /* eslint-enable no-undef */ } /** * Note: If the regex or the eval fail, there is no need to worry. The server will accept * relatively old seeds. */ resolve(); }).catch(function () { reject(); }); } }); } function get(text, opts) { return updateTKK(opts).then(function () { var tk = sM(text); tk = tk.replace('&tk=', ''); return {name: 'tk', value: tk}; }).catch(function () { return null; }); } module.exports.get = get;