爬蟲破解js加密破解(二) 有道詞典js加密參數 sign破解

在爬蟲過程當中,常常給服務器形成壓力(好比耗盡CPU,內存,帶寬等),爲了減小沒必要要的訪問(好比爬蟲),網頁開發者就發明了反爬蟲技術。javascript

    常見的反爬蟲技術有封ip,user_agent,字體庫,js加密,驗證碼(字符驗證碼,滑動驗證碼,點觸式驗證碼等)。所謂魔高一尺道高一丈。有反爬蟲,就有反反爬蟲技術。本文重要講js加密的破解方法。前端

 

js加密通常是在請求頭或者請求參數加入加密有的字段。爬蟲開發者不知道加密的方法,就可以抵擋一些低級爬蟲工程師。可是js加密函數或者過程必定是在瀏覽器完成, java

也就是必定會把js代碼暴露給使用者。經過閱讀加密算法,就能夠模擬出加密過程,從而達到破解。web

 

js破解的方式有:ajax

  一:把js代碼翻譯成Python或者java等代碼。這個對於大部分的爬蟲工程師是有難度的。由於爬蟲偏向於後端的處理,不多有爬蟲工程師去精通前端的知識,還有一點就是通過加密,混要,壓縮的js代碼閱讀性不好的。即便是開發三五年的前端工程師,也不多能看懂的。更況且是沒有搞過js的爬蟲工程師呢?固然也有一些高手除外。算法

    二: 執行js代碼。可使用Python的一些第三方庫好比 pyv8,或者execjs去執行js代碼。這個代碼效率很高的。json

  三:使用selenium或者appiun等框架。強烈不建議使用。由於代碼的穩定性和效率都很低。後端

 

有道詞典參數破解分析流程:瀏覽器

  第一步:咱們在頁面輸入須要翻譯的單詞 好人。輸出結果是  A good man。請求接口是 url= http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule服務器

  輸入參數以下圖所示。

  

第二部:遇到加密的請求參數,通常是去js代碼裏面找這個接口。

    

   咱們在 http://shared.ydstatic.com/fanyi/newweb/v1.0.15/scripts/newweb/fanyi.min.js文件中找到了 ajax請求接口。

  

 

   格式化js代碼:

   找到核心代碼以下:

        

 

   加密過程找sign,以下:

      

 

 

 最後一步。Python代碼實現加密過程。

代碼以下:

 
 
# coding:utf-8

# 破解js加密,版本2
'''
經過在js文件中查找salt或者sign,能夠找到
1.能夠找到這個計算salt的公式
r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
2.sign:n.md5("fanyideskweb" + t + r + "p09@Bn{h02_BIEe]$P^nG");
md5 一共須要四個參數,第一個和第四個都是固定值得字符串,第三個是所謂的salt,
第二個參數是輸入的須要翻譯的單詞
'''

import requests
import time, random
import requests
session = requests.session()




ts = str(int((time.time()*1000)))
salt = str(ts) + str(random.randint(0, 10))

print ts
print salt



def getmd5(v):
import hashlib
md5 = hashlib.md5()
md5.update(v)
sign = md5.hexdigest()
return sign

def getSign(key, salt):

sign = "fanyideskweb" + str(key) + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
sign = getmd5(sign)
return sign

def youdao(key):

url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
data = {
"i":key,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt": str(salt),
"sign":getSign(key, salt),
"ts":ts,
"bv":"6074bfcb52fb292f0428cb1dd669cfb8",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false",


}
headers = {

"Host":"fanyi.youdao.com",
# "Proxy-Connection":"keep-alive",
"Content-Length":len(data),
"Accept":"application/json, text/javascript, */*; q=0.01",
"Origin":"http://fanyi.youdao.com",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Referer":"http://fanyi.youdao.com/",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Cookie":"OUTFOX_SEARCH_USER_ID=119019685@10.168.8.63; JSESSIONID=aaaAioBu8RNDK46QQgoKw; OUTFOX_SEARCH_USER_ID_NCOO=585978009.1173552; UM_distinctid=1690e1aeb4938-0e3d396c4bdd96-551f3c12-100200-1690e1aeb4b7e; ___rl__test__cookies=1550723437154",


}
result =requests.post(url=url, data=data, headers=headers)
print result.text



if __name__ == '__main__':
youdao("好人")

 

輸出結果:

 

本博客寫於2019年2月21日。不保證代碼一直有效。僅供參考學習,請勿用於商業用途上。

相關文章
相關標籤/搜索