1、环境搭建
通过python代码模拟js去生成加密数据完成数据破解,需要用到PyExecJS模块
①安装模块pip install pyexecjs
通过模块的方法来读取js代码,也可以用js2py(不更新维护了)、selenium(driver.wxecute_script(js代码))去执行js文件,这里以pyexecjs为例
②python调用js代码的时候需要nodejs的环境(安装步骤如下)
nodejs下载地址:点解对应版本下载,我选择64位msi
选择msi它可以自动配置环境变量,不用手动配置环境变量,选择zip需要先解压,后手动配置path环境变量(增加nodejs配置)
无脑next按照默认选项操作,直到finish,通过命令行来验证是否成功安装,按ctrl+c退出node交互模式
③写一个js文件通过python来读取它的数据初步进入js逆向的学习
2、浏览器知识点补充
浏览器抓包工具在什么是爬虫中有过介绍,这里再补充一点常用小技巧,框中的代表保留日志信息,比如一些ajax请求,如果不勾选它,一旦页面刷新,那么他不会保留之前的信息,不利于爬取数据查看api信息
键盘按住shift鼠标悬停再对应的文件之上,可以查看到他们之间对应的层级依赖关系会以颜色显示
3、哈希类JS加密(一般处理登录过程中的加密)
3.1MD5:模拟登录一品威客
先找到加密的数据是哪些数据再通过search搜索加密文件是再那个js文件里面,然后通过断点调试找到数据加密的方法,将js文件复制进入pycharm,通过excejs引入js进行解密破解该加密数据,进行模拟登录。
3.2有道词典
有道词典也是一个post请求,通过对比翻译两个不同单词form_data表单携带不同的数据来比较出哪些数据是变化的比较发现i、salt、sign、its发生变化,下图没有写全,自己比较,将不同的加密参数模拟出来传入通过requests获得结果,js代码自己去分析,或者私聊我,py代码我放下面
from day01 import get_js_function
import requests
dic = get_js_function('youdao.js', 'youdao', 'ordinary')
dic['i'] = 'ordinary'
dic['from'] = 'AUTO'
dic['to'] = 'AUTO'
dic['smartresult'] = 'dict'
dic['client'] = 'fanyideskweb'
dic['doctype'] = 'json'
dic['version'] = '2.1'
dic['keyfrom'] = 'fanyi.web'
dic['action'] = 'FY_BY_CLICKBUTTION'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36','Referer': 'http://fanyi.youdao.com/','Host': 'fanyi.youdao.com','Cookie': 'OUTFOX_SEARCH_USER_ID=-1063838233@10.169.0.82; JSESSIONID=aaa6LVCQlOvoh7aoDIXux; OUTFOX_SEARCH_USER_ID_NCOO=518038871.14423877; ___rl__test__cookies=1602854040845'
}
r = requests.post('http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule', data=dic, headers=header)
print(r.json())
3.3模拟登录唯品会
通过分析发现它的密码是md5加密,search密码,找到对用的js文件发现他是匿名函数,将他改写,通过execjs将js转换为python可以获得加密的密码,携带data模拟登录唯品会
from day01 import get_js_function
import requests
pwd = get_js_function('weipin.js','md5','666666')
data = {
'loginName': 18329520409,
'password': pwd
}
url = 'https://www.epwk.com/index.php?do=login'
res = requests.post(url,data=data).json()
print(res)