登录
一、数据接口分析
主页地址:某某点集
1、抓包
通过抓包可以发现登录接口是phonePwdLogin
2、判断是否有加密参数
- 请求参数是否加密?
通过查看“载荷”模块可以发现有pwd
和sig
两个加密参数
- 请求头是否加密?
无 - 响应是否加密?
无 - cookie是否加密?
无
二、加密位置定位
1、pwd
(1)看启动器
查看启动器发现里面包含异步,所以无法正确找到加密位置
(2)搜索关键字
通过搜索关键字pwd:
可以找到一个pwd
的加密位置
在此处打上断点,再次登录,发现可以断住,并且此处是将明文转换为了密文,所以可以确定此处是加密位置
2、sig
(1)搜索关键字
通过搜索关键字sig:
可以找到一个sig
的赋值位置
在此处打上断点,再次登录,发现可以断住,并且sig
的生成就在上方,所以可以确定此处是加密位置
三、扣js代码
1、pwd
通过控制台测试可以发现,pwd
参数加密是使用的标准MD5加密,所以可以不扣js,使用标准MD5模块进行加密
2、sig
通过控制台测试可以发现,sig
参数同样是使用的MD5加密,只不过,在加密前对参数进行了处理,所以我们可以将处理方法H
和S
扣出,然后再使用标准MD5加密即可。
数据
一、数据接口分析
1、抓包
通过抓包可以发现数据接口是api/dy
2、判断是否有加密参数
- 请求参数是否加密?
通过查看“载荷”模块可以发现有一个sign
加密参数,还有一个token
是登录成功后服务器返回的,不需要关心
- 请求头是否加密?
无 - 响应是否加密?
无 - cookie是否加密?
无
二、加密位置定位
1、看启动器
查看启动器发现里面包含异步,所以无法正确找到加密位置
2、搜索关键字
通过搜索关键字sign:
可以发现sign
的生成位置
在此处打上断点,再次获取数据,发现可以断住,所以确定此处就是加密位置
三、扣js代码
通过加密位置可以看出,sign
是由E
方法生成的,调试执行进入E
方法可以发现,是对数据进行加盐,然后使用sha256进行加密。其中加盐参数C
经过多次生成,发现都是一样的,所以可以写死。
javascrapt源码
var CryptoJS = require('crypto-js')
function H(n) {
var e = []
, t = "";
for (var a in n)
e.push(n[a]);
for (var i = 0; i < e.length; i++)
t += e[i] + "";
return t += "JzyqgcoojMiQNuQoTlbR5EBT8TsqzJ",
t
}
function S(n) {
for (var e = Object.keys(n).sort(), t = {}, a = 0; a < e.length; a++)
t[e[a]] = n[e[a]];
return t
}
function E(n, e) {
return CryptoJS.SHA256("param=" + JSON.stringify(n) + "×tamp=" + e + "&tenant=1&salt=" + 'kbn%&)@<?FGkfs8sdf4Vg1*+;`kf5ndl$').toString()
}
function get_login_params(phone, password) {
var s = {
"phoneNum": phone,
pwd: CryptoJS.MD5(password).toString(),
"t": (new Date).getTime(),
"tenant": 1
};
var sig = CryptoJS.MD5(H(S(s))).toString()
s['sig'] = sig
return s
}
function get_data_params(token) {
var e = (new Date).getTime()
var n = {
"no": "dy0002",
"data": {
"days": 1,
"rankType": 5,
"liveDay": "2023-08-24"
}
}
return {
param: JSON.stringify(n),
sign: E(n, e),
tenant: "1",
timestamp: e,
token: token
}
}
Python源码
"""
Email:912917367@qq.com
Date: 2023/8/25 14:25
"""
import execjs
import requests
class Spider:
def __init__(self):
self.session = requests.session()
self.session.headers = {
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/json",
"Origin": "http://www.hh1024.com",
"Pragma": "no-cache",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"sec-ch-ua": "^\\^Chromium^^;v=^\\^116^^, ^\\^Not)A;Brand^^;v=^\\^24^^, ^\\^Google",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "^\\^Windows^^"
}
with open('get_params.js', 'r', encoding='utf-8') as f:
self.js_obj = execjs.compile(f.read())
self.token = ''
def login(self):
url = "https://user.hrdjyun.com/wechat/phonePwdLogin"
data = self.js_obj.call('get_login_params', '账号', '密码')
response = self.session.post(url, json=data)
self.token = response.json()['data']['token']
print('token:', self.token)
print(response.text)
def get_data(self):
url = "https://ucp.hrdjyun.com:60359/api/dy"
data = self.js_obj.call('get_data_params', self.token)
print(data)
response = self.session.post(url, json=data)
print(response.text)
print(response)
if __name__ == '__main__':
s = Spider()
s.login()
s.get_data()