// ==UserScript== // @name 推特翻译机 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 该脚本用于翻译推特为中文,不会经过中间服务器。 // @author HolynnChen // @match https://twitter.com/* // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== const transdict={'谷歌翻译':translate_gg,'沪江翻译':translate_hj,'爱词霸翻译':translate_icib,'关闭翻译':e=>e.className+=" js_translate"}; (function() { 'use strict'; let choice=GM_getValue('translate_choice')||'谷歌翻译'; setInterval(_=>{ let temp=makeArray(document.querySelectorAll('.tweet-text,div[lang]')).filter(x=>x.className.indexOf('js_translate')==-1); for(let i=0;i{choice=select.value;GM_setValue('translate_choice',choice);history.go(0)}; for(let i in transdict)select.innerHTML+=''; document.body.appendChild(select); document.querySelector('#js_translate option[value='+choice+']').selected=true; })(); function makeArray(arr){ if(arr.item){ var len = arr.length; var array = []; while(len--){ array[len] = arr[len]; } return array; } return Array.prototype.slice.call(arr); } function tk(a){ var b='431175.164380763'; var d = b.split("."); b = Number(d[0]) || 0; for (var e = [], f = 0, g = 0; g < a.length; g++) { var k = a.charCodeAt(g); 128 > k ? e[f++] = k : (2048 > k ? e[f++] = k >> 6 | 192 : (55296 == (k & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (k = 65536 + ((k & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = k >> 18 | 240, e[f++] = k >> 12 & 63 | 128) : e[f++] = k >> 12 | 224, e[f++] = k >> 6 & 63 | 128), e[f++] = k & 63 | 128) } a = b; for (f = 0; f < e.length; f++)a = Fo(a+e[f], "+-a^+6"); a = Fo(a, "+-3^+b+-f"); a ^= Number(d[1]) || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return a.toString() + "." + (a ^ b) } function Fo(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 } function ce_text(e,name,text){//change element text if(text.length==0)text='翻译异常' e.innerHTML+='\n\n-----------'+name+'-----------\n\n'+text } function translate_gg(e,error){ let myname='谷歌翻译' e.className+=" js_translate"; GM_xmlhttpRequest({ method:"GET", url:'https://translate.google.com/translate_a/single?client=webapp&sl=auto&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&source=btn&ssel=0&tsel=0&kc=0&tk='+tk(e.innerText)+'&q='+encodeURIComponent(e.innerText), onload:(data)=>{ let s='' try{ data=JSON.parse(data.responseText); s=data[0].map(x=>x[0]||'').join('') sessionStorage.setItem(myname+'-'+e.innerText,s) }catch(err){ console.log(data.responseText) if(error){ce_text(e,mynanm,'翻译出错');return} setTimeout(_=>translate_gg(e,true),3000) return } ce_text(e,myname,s) }}) } function translate_hj(e,error){ let myname='沪江翻译' e.className+=" js_translate"; GM_xmlhttpRequest({ method:"POST", url:'https://dict.hjenglish.com/v10/dict/translation/jp/cn', data:'content='+encodeURIComponent(e.innerText.replace('twitter','推特')), headers: { "Content-Type": "application/x-www-form-urlencoded", 'Cookie':'HJ_UID=0;' }, onload:(data)=>{ let s='' try{ data=JSON.parse(data.responseText); s=data.data.content; sessionStorage.setItem(myname+'-'+e.innerText,s) }catch(err){ console.log(data.responseText) console.log(e.innerText) if(error){ce_text(e,myname,'翻译出错');return} setTimeout(_=>translate_hj(e,true),3000) return } ce_text(e,myname,s) }}) } function translate_icib(e,error){ let mynanme='爱词霸翻译' e.className+=" js_translate"; GM_xmlhttpRequest({ method:"POST", url:'http://fy.iciba.com/ajax.php?a=fy', data:'f=auto&t=auto&w='+encodeURIComponent(e.innerText), headers: { "Content-Type": "application/x-www-form-urlencoded", }, onload:(data)=>{ let s='' try{ data=JSON.parse(data.responseText); s=data.content.out; sessionStorage.setItem(myname+'-'+e.innerText,s) }catch(err){ console.log(data.responseText) console.log(e.innerText) if(error){ce_text(e,myname,'翻译出错');return} setTimeout(_=>translate_icib(e,true),3000) return } ce_text(e,myname,s) }}) }