Python反編譯調用有道翻譯(附完整代碼)


     網易有道翻譯是一款非常優秀的產品,他們的神經網絡翻譯真的挺無敵。無奈有道客戶端實在是太難用了,而且在某些具體場景 (比如對網站進行批量翻譯) 無法使用,而有道的雲服務又特別的貴,一般人是無法支付得起的。

然而理論上而言,所有看得見的東西都是爬得到的,有道翻譯接口也一樣。為了祖國未來花朵(咸魚) 的發展,今天就來給大家介紹一下如何用 Python 超簡單快速地調用有道翻譯得到翻譯結果 。此外,本教程僅供學習哦。

如果你懶得看教程,只想要拿到源代碼,請關注 Python 實用寶典公眾號並回復:“Python 有道接口” 。
PS:很多人在學習Python的過程中,往往因為遇問題解決不了或者沒好的教程從而導致自己放棄,為此我整理啦從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF等】需要的可以進Python全棧開發交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,里面有最新Python教程項目可拿,不懂的問題有老司機解決哦,一起相互監督共同進步

 

1. 找到翻譯相關接口

打開 fanyi.youdao.com 隨便輸入一個單詞進行翻譯,使用開發者工具(空白處右鍵檢查或 F12)查看請求數據。

 

 

 

可以看到,請求的接口是:\
http://fanyi.youdao.com/translate_o?smartr...

開發者工具往下拉,查看 Form Data 得到請求的 body 是:

  1. i: 你好
  2. from: AUTO
  3. to: AUTO
  4. smartresult: dict
  5. client: fanyideskweb
  6. salt: 15707931034929
  7. sign: 99d0fc48506346afc40e36d5648cc320
  8. ts: 1570793103492
  9. bv: ca3dedaa9d15daa003dbdaaa991540d1
  10. doctype: json
  11. version: 2.1
  12. keyfrom: fanyi.web
  13. action: FY_BY_REALTlME
 

2. 解析請求 body 內容

顯然,以上 body 內容中,i 是需要翻譯的文本,from 是原文語言,to 是翻譯語言。我們其他的參數只需要設置為一致的即可。現在需要解決這幾個參數:salt, sign, bv,ts.

ts 從格式上看就知道是時間戳,而且 ts 和 salt 內容很接近,且只差了一位,可以合理猜測,salt 就是 ts+1 位隨機數。

 

Python 反編譯有道翻譯
 

 

接下來就差 sign 和 bv,這兩個值看起來非常像 MD5,不過不確定是什么參數的 MD5,因此需要閱讀前端源代碼。

在 performance 中錄制,重新請求接口,找到翻譯接口的前端代碼 (fanyi.min.js). 然后搜索我們的關鍵詞 sign 或者 bv. 使用 debug 工具查看值的流動。

 

Python 反編譯有道翻譯
 

 

從這里我們可以知道,bv 即瀏覽器頭部信息 MD5 的值,我的瀏覽器頭部是這樣的: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"

實際上在請求接口的時候隨便用什么頭部都能過這個校驗,只要符合標准就行。

最后一個未知參數是 sign. 同樣,我們打開 debug 模式,輸入信息,就可以得到其值了。

 

Python 反編譯有道翻譯
 

 

很顯然,sign 由 n.md5 ("fanyideskweb" + e + i + "n% A-rKaT5fb [Gy?;N5@Tj") 組成,而 e 根據 debug 顯示的結果,就是我們需要翻譯的信息,而 i 就是 salt. 因此 4 個參數我們全部成功反編譯!

 

3. 用 Python 調用接口進行翻譯

我們只需要偽造請求的 body,向接口發送 post 請求即可得到翻譯結果。比如,ts 是 13 位時間戳,在 Python 中可以使用 time.time ()*1000 獲得:

  1. ts = str(int(time.time()*1000))

salt 是 ts + 一位隨機數,太簡單了:

  1. salt = ts + str(random.randint(0, 9))

bv 是瀏覽器 User-Agent,需要進行 MD5 計算,我們新建一個 MD5 函數,將字符串傳入函數獲得 MD5。

  1. def get_md5(string):
  2. string = string.encode('utf-8')
  3. md5 = hashlib.md5(string).hexdigest()
  4. return md5
  5. bv = get_md5("5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")

sign 是四個字符串組成后進行 MD5 的結果:

  1. sign = get_md5("fanyideskweb" + context + salt + "n%A-rKaT5fb[Gy?;N5@Tj")

這樣,我們獲得了所有需要用到的參數,集合在一起后發送 post 請求。

 

Python 反編譯有道翻譯
 

 

試一下效果:

  1. print (translation (' 你好 '))

成功得到接口返回的翻譯結果:

    1. (base) F:\push\20191011>python YouDaoSpider.py
    2. hello
      以上就是本次分享,另外很多人在學習Python的過程中,往往因為遇問題解決不了或者沒好的教程從而導致自己放棄,為此我整理啦從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF等】需要的可以進Python全棧開發交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,里面有最新Python教程項目可拿,不懂的問題有老司機解決哦,一起相互監督共同進步

      本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作刪除處理。


免責聲明!

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



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