python爬虫js逆向学习(二)

1.问题分析过程

本文以百度翻译为例介绍js逆向过程

1.1 通过抓包找出返回数据的api,因刷新时页面不变,所以数据是通过ajax异步获取,所以可在xhr中抓包
python爬虫js逆向学习(二)_第1张图片
1.2 分析请求头得到formdata的信息,只有sign是可变的,token是固定的,query为输入的信息
python爬虫js逆向学习(二)_第2张图片
1.3 再全局搜索数据包的接口v2transapi?,找出js代码文件,从中寻找生成sign的函数
python爬虫js逆向学习(二)_第3张图片
1.4 断点debug鼠标移到y上可定位到生成函数,y(n)=e®
python爬虫js逆向学习(二)_第4张图片
1.5 对于较长的参数生成js代码,可直接在Python中利用PyExecJs模块调用执行,发现js代码中还存在局部参数未传值
在这里插入图片描述
在这里插入图片描述
1.6 找出i的生成式,但是不知道l的值,将l在控制台中执行,得到gtk,所以i=window[“gtk”],接下来在源码中对gtk进行搜索得到需要的结果
python爬虫js逆向学习(二)_第5张图片
在这里插入图片描述
1.7 将window.gtk的值赋给i后再对js代码进行调试得到sign值
python在pycharm中用PyExecJs调用执行js代码时需配置相应的环境,windows自带JScript引擎会报错,所以需要安装nodejs,然后添加到本机的环境变量后配置到pycharm中
python爬虫js逆向学习(二)_第6张图片

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)

你可能感兴趣的:(python爬虫js逆向学习(二))