1. 程式人生 > 程式設計 >Python 呼叫有道翻譯介面實現翻譯

Python 呼叫有道翻譯介面實現翻譯

最近為了熟悉一下 js 用有道翻譯練了一下手,寫一篇部落格記錄一下,也希望能對大家有所啟迪,不過這些網站更新太快,可能大家嘗試的時候會有所不同。

首先來看一下網頁 post 過去的資料

Python 呼叫有道翻譯介面實現翻譯

Python 呼叫有道翻譯介面實現翻譯

大家不難發現,我們翻譯的內容是放在 post 的 data 中的,這些引數,除了 salt 和 sign 要麼就是不會變化,要麼就是一眼能看出來意義的;那麼這個 salt 和 sign 是什麼呢?salt 根據 ta 資料的特徵,我們應該會想到,這應該是一個時間戳,而 sign 又是什麼呢?我們一起來看一下

找到這個 js 檔案,最上面這個 send 檔案

Python 呼叫有道翻譯介面實現翻譯

將裡面的 js 程式碼拷貝出來,格式化一下,搜尋 sign

Python 呼叫有道翻譯介面實現翻譯

我們發現,salt 確實是一個時間戳,但 sign 呢?,這裡對 sign 的計算稍微多囉嗦幾句,如圖:

Python 呼叫有道翻譯介面實現翻譯

大家發現 sign 的值,也就是 o 一共是對四個引數進行求 md5 碼,兩個是定值,一個是前面求到的時間戳,還有一個是什麼呢?這個地方我也找了挺久的(還是不懂 js 的痛啊,哭。。。)剩下的引數,就是圖片中所謂的 t

var t = e.i

然後在 data 中,大家還能發現這麼一句:

i:e.i

這個 i 我們對應到 ta 傳送的 data 中,不就是我們要翻譯的字串嗎?哈哈哈,被我發現了吧!

發現這個就好辦了,我們找出其中引數之間的關係,用Python實現 ta

Python 呼叫有道翻譯介面實現翻譯

但當我們構造好 data 興高采烈地將資料 post 過去的時候,會發現出現報錯了

Python 呼叫有道翻譯介面實現翻譯

為什麼呢?難道是我們的 data 構造的有問題嗎?不清楚,先嚐試一下,咱們吧瀏覽器中的 data 拷貝進來執行一下,發現還是出錯了;那麼說明錯誤不是出在 data 上面了,那究竟是那裡出了問題呢?難道 ta 還有其他的校驗方式;彆著急繼續分析,我們再觀察一下,post 請求,發現這個請求是帶了 cookie的,於是我們猜測,是不是 cookie 的原因呢? 還是不清楚,我們嘗試一下,將 data 對應的 cookie 加上,再執行一下。發現這次通過了,我們的猜測沒錯,確實是 cookie 的原因,那麼這個 cookie 又是怎麼來的呢?

Cookie

Python 呼叫有道翻譯介面實現翻譯

多嘗試幾次,大家會發現,不同的請求內容,前面兩個是不會發生改變的,而第三個,結合我們之前的經驗,是不是很像一個時間戳;既然有猜測,咱們就又來嘗試一下,自己構造一個 Cookie post 過去,萬事大吉,哈哈哈哈。

最後附上我的程式碼

#/usr/bin/python 
# encoding:utf-8
# __Author__ = Slwhy

import requests
import time
import random
import hashlib
#i = "" + ((new Date).getTime() + parseInt(10 * Math.random(),10))
i = str(int(time.time()*1000)+random.randint(1,10))
#o = n.md5("fanyideskweb" + t + i + "aNPG!!u6sesA>hBAW1@(-");
t = raw_input("please input the word you want to translate:")
u = 'fanyideskweb'
l = 'aNPG!!u6sesA>hBAW1@(-'
src = u + t + i + l  # u 與 l 是固定字串,t是你要翻譯的字串,i是之前的時間戳
m2 = hashlib.md5()
m2.update(src)
str_sent = m2.hexdigest()

''' 
  i:number
  from:AUTO
  to:AUTO
  smartresult:dict
  client:fanyideskweb
  salt:1515462554510
  sign:32ea4a33c063d174a069959a5df1a115
  doctype:json
  version:2.1
  keyfrom:fanyi.web
  action:FY_BY_REALTIME
  typoResult:false
'''
head = {
  'Accept':'application/json,text/javascript,*/*; q=0.01','Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zh;q=0.9','Content-Length':'200','Connection':'keep-alive','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','Host':'fanyi.youdao.com','Origin':'http://fanyi.youdao.com','Referer':'http://fanyi.youdao.com/','User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/63.0.3239.108 Safari/537.36','X-Requested-With':'XMLHttpRequest',# 'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; [email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1846816080.1245883; fanyi-ad-id=39535; fanyi-ad-closed=1; JSESSIONID=aaaYuYbMKHEJQ7Hanizdw; ___rl__test__cookies=1515471316884'
}
head['Cookie'] = '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1846816080.1245883; ___rl__test__cookies='+str(time.time()*1000)
         # '___rl__test__cookies=1515471316884'

data = {
  'i': t,'from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':i,'sign':str_sent,'doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'
}

s = requests.session()
# print data
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
p = s.post(url,data= data,headers = head)
print p.text 

到此這篇關於Python 呼叫有道翻譯介面實現翻譯的文章就介紹到這了,更多相關Python 有道翻譯內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!