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>>d:a<k?e[f++]=k:(2048>k?e[f++]=k>>6|192:(55296==(k&64512)&&g+1>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;fa&&(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 不需要,其实我很早都发现这点啦,但还是折腾了本文的所有内容

你可能感兴趣的:(google)