如何找一個翻譯介面

可我不愛聰明發表於2018-03-19

背景

最近想在工具集裡面整合一個翻譯功能(英文不好,解決命名問題)。搜了下翻譯API,要麼是sdk,要麼是有次數限制。於是拿出來爬蟲精神,瞄準了有道翻譯,跟蹤了有道前端程式碼,找到了介面引數拼裝方式。

跟蹤步驟

  • 1 嘗試下翻譯,找到介面地址:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
  • 2 在xhr/fetch breakpoints下個斷點包含(translate_o?smartresult=dict&smartresult=rule)
  • 3 觸發下請求,通過call stack找到fanyi.min.js(格式化)第8724行t.translate方法呼叫,分析下函式體就看到引數如何拼裝的

具體模擬程式碼

// md5加密模組
var md5 = require('js-md5');
// 簡化請求模組
var request = require('request');

const time = new Date().getTime();
const client = 'fanyideskweb';
const origin = 'what';
const D = "ebSeFb%=XZ%T[KZ)c(sy!";
const sign = md5(client + origin + time + D);
// 介面引數
const data = {
    i: origin,
    from: 'AUTO',
    to: 'AUTO',
    smartresult: 'dict',
    client,
    salt: time,
    sign,
    doctype: 'json',
    version: '2.1',
    keyfrom: 'fanyi.web',
    action: 'FY_BY_REALTIME',
    typoResult: false
}
// 必須的頭資訊
const headers = {
    "Referer" : 'http://fanyi.youdao.com/',
    "User-Agent" : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
};

// 啟用cookie
const req = request.defaults({jar: true});
// 需要先請求一次翻譯地址,拿到cookie, 表明是在一個session下的請求,
// 驗證的cookie名是OUTFOX_SEARCH_USER_ID
req('http://fanyi.youdao.com/', function (err, httpResponse, body) {
    if (err) {
        return console.error('upload failed:', err);
    }
    console.log('Upload successful!  Server responded with:', body);
    req({
        method: 'POST',
        url,
        form: data,
        headers,
        gzip: true // 開啟壓縮
    }, function(err, httpResponse, body) {
        if (err) {
            return console.error('upload failed:', err);
        }
        console.log('Upload successful!  Server responded with:', body);
    });
})
複製程式碼

結語

做你喜歡做的事,讓事情變得更有趣。

再推銷下我的小站 www.lzuntalented.cn

相關文章