python爬蟲js逆向學習(二)

Aaron_liu1發表於2020-07-03
1.問題分析過程

本文以百度翻譯為例介紹js逆向過程

1.1 通過抓包找出返回資料的api,因重新整理時頁面不變,所以資料是通過ajax非同步獲取,所以可在xhr中抓包
在這裡插入圖片描述
1.2 分析請求頭得到formdata的資訊,只有sign是可變的,token是固定的,query為輸入的資訊
在這裡插入圖片描述
1.3 再全域性搜尋資料包的介面v2transapi?,找出js程式碼檔案,從中尋找生成sign的函式
在這裡插入圖片描述
1.4 斷點debug滑鼠移到y上可定位到生成函式,y(n)=e®
在這裡插入圖片描述
1.5 對於較長的引數生成js程式碼,可直接在Python中利用PyExecJs模組呼叫執行,發現js程式碼中還存在區域性引數未傳值
在這裡插入圖片描述
在這裡插入圖片描述
1.6 找出i的生成式,但是不知道l的值,將l在控制檯中執行,得到gtk,所以i=window[“gtk”],接下來在原始碼中對gtk進行搜尋得到需要的結果
在這裡插入圖片描述
在這裡插入圖片描述
1.7 將window.gtk的值賦給i後再對js程式碼進行除錯得到sign值
python在pycharm中用PyExecJs呼叫執行js程式碼時需配置相應的環境,windows自帶JScript引擎會報錯,所以需要安裝nodejs,然後新增到本機的環境變數後配置到pycharm中
在這裡插入圖片描述

2.程式碼示例

2.1 獲取js函式引數

import requests
import re

def get_params():
	headers={'user-agent':''}
	url="https://fanyi.baidu.com/"
	html=requests.get(url,headers=headers).text
	token=re.findall(r"window.*token: '(.*?)'",html,re.S)[0]
	gtk=re.findall(r"window.gtk = '(.*?)';",html,re.S)[0]
	return gtk,token

2.2 執行js程式碼獲取formdata

import execjs
import os

def get_FormData(word):
	gtk,token=get_params()
	# 修改當前執行環境
	os.environ["EXECJS_RUNTIME"] = "Node"
	# 獲取環境引擎
	name=execjs.get().name
	with open('code.js','r') as f:
		js_text=f.read()
		# 編譯js程式碼
		ctx=execjs.compile(js_text)
		js='e("{}","{}")'.format(word,gtk)
		#eval可模擬執行js程式碼
		sign=ctx.eval(js)
	return token,sign

2.3 攜帶formdata對翻譯介面發起post請求

def get_res():
	token,sign=get_FormData()
	choice=input("請選擇:zh or en 漢譯英>zh,英譯漢>en :")
	if choice=='zh':
		f,t='zh','en'
	if choice=='en':
		f,t='en','zh'
	word=input("請輸入:")
	data={
	'from': f,
	'to': t,
	'query': word,
	'transtype': 'translang',
	'simple_means_flag': '3',
	'sign': sign,
	'token': token,
	'domain': 'common'
}
res=requests.post(trs_url,headers=headers,data=data).json()
print(res)

相關文章