前些天準備批量翻譯一些用戶暱稱,使用 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 不需要,其實我很早都發現這點啦,但還是折騰了本文的所有內容