推特翻译机

该脚本用于翻译推特为中文,不会经过中间服务器。

目前為 2019-03-30 提交的版本,檢視 最新版本

// ==UserScript==
// @name         推特翻译机
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  该脚本用于翻译推特为中文,不会经过中间服务器。
// @author       HolynnChen
// @match        https://twitter.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://cdn.bootcss.com/crypto-js/3.1.9-1/core.min.js
// @require      https://cdn.bootcss.com/crypto-js/3.1.9-1/md5.min.js
// ==/UserScript==
const transdict={'谷歌翻译':translate_gg,'沪江翻译':translate_hj,'爱词霸翻译':translate_icib,'必应翻译':translate_biying,'有道翻译':translate_youdao,'关闭翻译':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<temp.length;i++){
            if(sessionStorage.getItem(choice+'-'+temp[i].innerText)){
                temp[i].className+=" js_translate";
                ce_text(temp[i],choice,sessionStorage.getItem(choice+'-'+temp[i].innerText));
            }else{
                transdict[choice](temp[i]);
            }
        }
    },50);
    let select=document.createElement("select");
    select.id='js_translate';
    select.style='z-index:99999;height:35px;width:100px;background-color:#fff;position:fixed;border-radius:17.5px;right:9px;top:9px;text-align-last:center;color:#000000';
    select.onchange=_=>{choice=select.value;GM_setValue('translate_choice',choice);history.go(0)};
    for(let i in transdict)select.innerHTML+='<option value="'+i+'">'+i+'</option>';
    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='431647.4062989038';
    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 myname='爱词霸翻译'
    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)
    }})
}
function translate_biying(e,error){
    let myname='必应翻译'
    e.className+=" js_translate";
    GM_xmlhttpRequest({
        method:"POST",
        url:'https://cn.bing.com/ttranslate',
        data:'from=ja&to=zh-CHS&text='+encodeURIComponent(e.innerText),
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
        },
        onload:(data)=>{
            let s=''
            try{
                data=JSON.parse(data.responseText);
                s=data.translationResponse;
                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_biying(e,true),3000)
                return
            }
            ce_text(e,myname,s)
    }})
}
function youdao_data(text){
    let ts=""+(new Date).getTime(),salt=ts+parseInt(10 * Math.random(), 10);
    let result=`i=${encodeURIComponent(text)}&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=${salt}&sign=${CryptoJS.MD5("fanyideskweb"+text+salt+"1L5ja}w$puC.v_Kz3@yYn")}&ts=${ts}&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME&typoResult=false`
    return result
}
function translate_youdao(e,error){
    let myname='有道翻译'
    e.className+=" js_translate";
    GM_xmlhttpRequest({
        method:"POST",
        url:'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',
        data:youdao_data(e.innerText),
        headers: {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Referer": "http://fanyi.youdao.com/",
            "User-Agent": "test",
        },
        onload:(data)=>{
            let s=''
            try{
                data=JSON.parse(data.responseText);
                s=data.translateResult.map(e=>e.map(t=>t.tgt).join()).join('\n');
                sessionStorage.setItem(myname+'-'+e.innerText,s)
            }catch(err){
                console.log(data,data.responseText)
                if(error){ce_text(e,myname,'翻译出错');return}
                setTimeout(_=>translate_youdao(e,true),3000)
                return
            }
            ce_text(e,myname,s)
    }})
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址