python調用js代碼解決Google翻譯中的tk參數


一、背景

因為這次需要用到一下Google翻譯,對英文翻譯成中文,通過對Google翻譯的分析,發現Google翻譯里面有一個很重要參數tk。這個參數在每次翻譯之前都會重新生成,只有校驗通過了才可以將翻譯的結果返回。而這個參數是使用js來生成了的。

二、解決

通過查閱相關的資料,在國外大佬的個人博客里面找到了這個參數的解析,國內也有很多大佬解析,這里就簡單記錄一下,使用python的方法去調用。

1.1 安裝PyExecJS

通過下面的指令完成PyExecJs的安裝,這樣就可以在python中執行js代碼。

pip install PyExecJS

1.2 代碼封裝

通過下面的代碼對輸入參數的js,進行混淆解析,返回生成的tk值,直接引用即可,后面使用js.getTk方法就可以進行解析了。

import execjs
class
Py4Js: def __init__(self): self.ctx = execjs.compile(""" function TL(a) { var k = ""; var b = 406644; var b1 = 3293161072; var jd = "."; var $b = "+-a^+6"; var Zb = "+-3^+b+-f"; for (var e = [], f = 0, g = 0; g < a.length; g++) { var m = a.charCodeAt(g); 128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = m >> 18 | 240, e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, e[f++] = m >> 6 & 63 | 128), e[f++] = m & 63 | 128) } a = b; for (f = 0; f < e.length; f++) a += e[f], a = RL(a, $b); a = RL(a, Zb); a ^= b1 || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return a.toString() + jd + (a ^ b) }; function RL(a, b) { var t = "a"; var Yb = "+"; for (var c = 0; c < b.length - 2; c += 3) { var d = b.charAt(c + 2), d = d >= t ? d.charCodeAt(0) - 87 : Number(d), d = b.charAt(c + 1) == Yb ? a >>> d: a << d; a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d } return a } """) def getTk(self, text): return self.ctx.call("TL", text) js = Py4Js()

1.3 分析

通過上面的代碼可以看到通過execjs.compile對代碼進行編譯,使用call函數進行調用,第一個為調用的函數名,第二個為參數。這樣就可以將python中的參數傳遞給js,同時返回執行的結果。剩下的內容就可以按照正常的爬蟲請求就可以完成了。

三、總結

網上也有很多資料,這里簡單做個記錄對以后的復習有好處。找到那個blog地址就把地址補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM