google translate 免費使用 /translate_a/single 接口翻譯

前些天準備批量翻譯一些用戶暱稱,使用 Google Cloud Translation 還需要註冊賬號,可能還面臨收費,所以就想着在 Google 翻譯 裏直接翻譯,本想着找出它的接口地址逐個翻譯,無奈時間緊任務重的我當時選擇了手動以文檔方式分批翻譯,約8K個暱稱還讓我均分成四個文檔進行翻譯,因爲內容太多的話好像後面的就不怎麼翻譯啦,當時的我就在想,有時間一定要找出它的接口地址,想辦法自己能直接調用

我不常做此類事情,也並不擅長做此類事情,對我而言整個過程還是蠻費勁的,更多的是參考前人的結晶,接下來步入正題

打開 Chrome 瀏覽器 檢查(F12),此時輸入 現在 兩個漢子進行漢英翻譯,接着去 檢查->Network 搜索 現在 這倆漢子,你應該會發現接口地址如下

https://translate.google.com/translate_a/single?client=webapp&sl=zh-CN&tl=en&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=0&tsel=0&kc=1&tk=925073.572365&q=%E7%8E%B0%E5%9C%A8

此時你通過 curl 發送請求是能繼續拿到回覆的

請求攜帶的參數有點多,前人的一個問答,雖然年代久遠,但是讓我們知曉參數中只需要保留一個dt

https://translate.google.com/translate_a/single?client=webapp&sl=zh-CN&tl=en&hl=zh-CN&dt=t&otf=1&ssel=0&tsel=0&kc=1&tk=925073.572365&q=%E7%8E%B0%E5%9C%A8

此時再嘗試去掉一些不必要的參數

https://translate.google.com/translate_a/single?client=webapp&sl=zh-CN&tl=en&dt=t&tk=925073.572365&q=%E7%8E%B0%E5%9C%A8

單次翻譯需要提供的參數有

sl: source language

tl: target language

q: query word / text

暫時寫死的參數有

client: 客戶端類型

dt=t: 僅回覆翻譯結果

程序根據翻譯內容每次需要計算的是 tk 參數

根據前人的經驗分享,搞定它已不成問題,藉此我稍費點力使用 Google 的最新代碼來構建我的程序吧

先摘出來計算 tk 的主方法,捎帶把它使用的變量和方法也都摘出來

var xo=function(a){return function(){return a}};
var yo=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};
var zo=null;
var window={TKK:"435819.1958473774"};
var Ao=function(a){if(null!==zo)var b=zo;else{b=xo(String.fromCharCode(84));var c=xo(String.fromCharCode(75));b=[b(),b()];b[1]=c();b=(zo=window[b.join(c())]||"")||""}var d=xo(String.fromCharCode(116));c=xo(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 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+=e[f],a=yo(a,"+-a^+6");a=yo(a,"+-3^+b+-f");a^=Number(d[1])||0;0>a&&(a=(a&2147483647)+2147483648);a%=1E6;return c+(a.toString()+"."+
(a^b))};

瀏覽器全局變量 window 中 TKK 的值可以通過 Chrome 查看Google 翻譯源代碼,搜索 tkk 拿到,爲什麼搜索 tkk 你可以打印下 Ao 方法中的 b.join(c()) 看一下

tkk:'435819.1958473774'
TKK = mobileWebapp.tkk

藉助 nodejs http.get example 可以輕鬆寫出如下代碼,之後應該是想怎麼用就怎麼用了吧

let str = "理想";

let sl = 'zh-CN';
let tl = 'en';

https.get('https://translate.google.com/translate_a/single?client=webapp&sl=' + sl + '&tl=' + tl + '&dt=t' + Ao(str) + '&q=' + encodeURI(str), (res) => {
    const { statusCode } = res;
    const contentType = res.headers['content-type'];

    let error;
    if (statusCode !== 200) {
        error = new Error('請求失敗\n' +
            `狀態碼: ${statusCode}`);
    } else if (!/^application\/json/.test(contentType)) {
        error = new Error('無效的 content-type.\n' +
            `期望的是 application/json 但接收到的是 ${contentType}`);
    }
    if (error) {
        console.error(error.message);
        res.resume();
        return;
    }

    res.setEncoding('utf8');
    let rawData = '';
    res.on('data', (chunk) => { rawData += chunk; });
    res.on('end', () => {
        try {
            const parsedData = JSON.parse(rawData);
            console.log(parsedData);
        } catch (e) {
            console.error(e.message);
        }
    });
}).on('error', (e) => {
    console.error(`出現錯誤: ${e.message}`);
});

說了這麼多,從前人的問題中發現貌似有更簡單的方案可用,即不需要提供 tk 參數

curl 'https://translate.google.com/translate_a/single?client=at&sl=zh-CN&tl=en&dt=t&q=%E7%90%86%E6%83%B3'
curl 'https://translate.google.com/translate_a/single?client=gtx&sl=zh-CN&tl=en&dt=t&q=%E7%90%86%E6%83%B3'

client 類型裏 t 和 webapp 需要,at 和 gtx 不需要,其實我很早都發現這點啦,但還是折騰了本文的所有內容

發佈了75 篇原創文章 · 獲贊 44 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章