本文只做技術(shù)交流,若有冒犯請(qǐng)告知我撤除
百度翻譯不知道啥時(shí)候開(kāi)始轉(zhuǎn)向收費(fèi)的形式攘蔽,開(kāi)發(fā)者可以免費(fèi)享受200w字符/月的福利
廢話少說(shuō),入主題
參數(shù)分析
參數(shù)名 | 參數(shù)解釋 |
---|---|
from | 要翻譯的原文語(yǔ)種 |
to | 翻譯結(jié)果的目標(biāo)語(yǔ)種 |
query | 要翻譯的內(nèi)容 |
transtype | 翻譯類(lèi)型(該參數(shù)目前發(fā)現(xiàn)有 realtime 和 translang 兩種,我們使用 realtime 即可) |
simple_means_flag | 未知 |
接口更新后上述鏈接會(huì)返回如下內(nèi)容
出現(xiàn)錯(cuò)誤碼 998渡蜻,這里暫時(shí)不對(duì)錯(cuò)誤碼進(jìn)行解釋
我們重新看看新的接口
通過(guò) Chrome Dev Tools 可以看到,新的請(qǐng)求如下
除了原有的5個(gè)參數(shù)之外计济,新增了兩個(gè)參數(shù)
參數(shù)名 | 參數(shù)解釋 |
---|---|
sign | 簽名(如:719145.924184) |
token | 請(qǐng)求令牌(如:3a1ae6d96bdd2a8e0f2eb367cb23cb83) |
對(duì)谷歌翻譯接口有研究的大神應(yīng)該不難發(fā)現(xiàn)茸苇,sign 的加密后的值與 Google 的翻譯加密后的值非常類(lèi)似,趕緊看看唄
回到 Chrome Dev Tools沦寂,觀察新的請(qǐng)求發(fā)現(xiàn)翻譯頁(yè)面界面總共加載了 8 個(gè) JavaScript 文件学密,其中最值得我們注意的就是 index_a6525c5.js 該文件了,不要問(wèn)我為什么传藏,男人的直覺(jué)
根據(jù)翻譯接口 v2transapi 可以查到一段迷之代碼
langIsDeteced: function(t, a, n, r) {
if (null !== t) {
var s = $(".select-from-language .language-selected").attr("data-lang"),
o = $(".select-to-language .language-selected").attr("data-lang"),
l = null;
r && !c.get("fromLangIsAuto") && s !== t ? l = i.processOcrLang(t, s, o) : (e.show(t, s), l = i.getLang(t, s, o)),
u.show();
var g = this,
a = this.processQuery(a),
d = {
from: l.fromLang,
to: l.toLang,
query: a,
transtype: n,
simple_means_flag: 3,
sign: h(a),
token: window.common.token
};
this.translateXHR && 4 !== this.translateXHR.readyState && this.translateXHR.abort(),
this.translateXHR = $.ajax({
type: "POST",
url: "/v2transapi",
cache: !1,
data: d
}).done(function(t) {
c.set("isInRtTransState", !0),
g.translateSuccess(t, l.fromLang, l.toLang, a)
})
}
}
很明顯可以看出就是翻譯的核心代碼腻暮,其中 token 的值直接通過(guò) window.common.token
獲取即可,稍微要費(fèi)點(diǎn)心思的就是 sign 的值漩氨,通過(guò) h(a)
獲取的
其中 a 是傳入的待翻譯的內(nèi)容西壮,那么很容易猜到 h()
這個(gè)函數(shù)會(huì)返回 719145.924184
類(lèi)似這樣的結(jié)果,并且多次嘗試發(fā)現(xiàn)叫惊,a 的值固定的情況下款青,h()
的返回值也是固定的,這樣也方便大家測(cè)試
因?yàn)榇a加密過(guò)霍狰,需要男人的直覺(jué)給我們更多的指引..
看這段代碼
define("translation:widget/translate/input/pGrab",
function(r, o, t) {
"use strict";
function a(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
a = "+" === o.charAt(t + 1) ? r >>> a: r << a,
r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}
function n(r) {
var o = r.length;
o > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(o / 2) - 5, 10) + r.substr( - 10, 10));
var t = void 0,
n = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
t = null !== C ? C: (C = window[n] || "") || "";
for (var e = t.split("."), h = Number(e[0]) || 0, i = Number(e[1]) || 0, d = [], f = 0, g = 0; g < r.length; g++) {
var m = r.charCodeAt(g);
128 > m ? d[f++] = m: (2048 > m ? d[f++] = m >> 6 | 192 : (55296 === (64512 & m) && g + 1 < r.length && 56320 === (64512 & r.charCodeAt(g + 1)) ? (m = 65536 + ((1023 & m) << 10) + (1023 & r.charCodeAt(++g)), d[f++] = m >> 18 | 240, d[f++] = m >> 12 & 63 | 128) : d[f++] = m >> 12 | 224, d[f++] = m >> 6 & 63 | 128), d[f++] = 63 & m | 128)
}
for (var S = h,
u = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), l = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), s = 0; s < d.length; s++) S += d[s],
S = a(S, u);
return S = a(S, l),
S ^= i,
0 > S && (S = (2147483647 & S) + 2147483648),
S %= 1e6,
S.toString() + "." + (S ^ h)
}
var C = null;
t.exports = n
});;
返回的結(jié)果中有一段 S.toString() + "." + (S ^ h)
抡草,與我們期望的加密值結(jié)構(gòu)非常類(lèi)似
嗯,其實(shí)這段代碼就是加密的核心代碼蔗坯,有興趣的朋友可以詳細(xì)理解康震,這里就不多說(shuō)啦
我已經(jīng)將加密的代碼單獨(dú)整理出來(lái),大家直接調(diào)用即可
這里再啰嗦一下宾濒,加密過(guò)程中需要用到一個(gè)名為 gtk
的參數(shù)腿短,該值直接通過(guò) window.gtk 即可獲取,可以獲取網(wǎng)頁(yè)源碼后通過(guò) regex 匹配該值,這個(gè)值是可以重復(fù)使用的橘忱,不需要每次調(diào)用赴魁,所以再初始化的時(shí)候獲取到即可
好啦,不啰嗦了钝诚,加密源碼奉上
https://www.devtool.top/upload/2018/01/u5kr8hdmtgikjqpi8ta7q00sqr.zip
后續(xù)會(huì)有更多有趣的內(nèi)容和大家分享討論颖御,如果覺(jué)得對(duì)你有幫助的話點(diǎn)下關(guān)注~~