📌免责声明:本文章涉及到的代码仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和非公开权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关。禁止将本文技术或者本文所关联的Github项目源码用于任何除学习外的目的。如本文有任何侵权,请联系删除。
分析页面
打开页面后,在开发者工具中查看头信息、载荷和返回值。然后通过requests进行访问测试。
确定目标
发现请求载荷中的sign
值为必需携带的签名,是这次模拟的目标。
定位代码位置
搜索sign:
关键字,定位到下图位置,设置断点后,刷新页面可以正常拦截,可以确定代码位置。
分析实现算法
代码中代码可简化成如下伪码:
p = function(e){}(text)
# 其中function(e){}为算法,text为待加密字符串,输出结果为32位16进制密文
# 拆分开两部分进行分别分析
_hadoken = function(e){}
text = o.token + "&" + a + "&" + s + "&" + n.data
函数分析
根据加密后字符特性,猜测算法为MD5。将函数赋值给_hadoken
变量,测试字符“1”
的加密值跟MD5标准算法相同,所以可以确认算法为MD5标准算法。
参数分析
然后分析参数值o.token + "&" + a + "&" + s + "&" + n.data
,实际值如下图:
观察得知:
o.token
为cookie里面的_m_h5_tk参数,访问网站后会自动获得,且值短期内不变。
a
为时间戳,可以直接生成。
s
为appKey,应该是标识应用id,固定不变为12574478。
n.data
的值跟查询表单相同,可以直接构造。
至此, 模拟算法已分析完成,可用python实现代码如下:
import requests
import hashlib
import time
import re
headers = {
"authority": "h5api.m.taobao.com",
"accept": "application/json",
"accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"cache-control": "no-cache",
"content-type": "application/x-www-form-urlencoded",
"origin": "https://zc-paimai.taobao.com",
"pragma": "no-cache",
"referer": "https://zc-paimai.taobao.com/",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
cookies = {
"cna": "WHVfHEC+s0gCAXFo75AtW31b",
"cookie2": "2684da5df27f5ac5f9d7f3332dad27af",
"t": "e643beab1e45cf6e24d842d88d81c2d1",
"_tb_token_": "f08437ebe3eae",
"xlly_s": "1",
"_m_h5_tk": "44faf6e4294578f14c7f8662a602ec23_1679041878217",
"_m_h5_tk_enc": "38b523e9efd3584ecdfa56c775e020f6",
"isg": "BPb2ETm6jlJDr319Fxfsn6IkRyr4FzpRCPe4eGDH_Fl0o5M9yafSYaUSu3_PCzJp",
"l": "fBTFDzPcTWQP8CT1BO5Zourza77O3EAfCsPzaNbMiIEGa6a5GFwugNCsnHK6PdtjgTfxBeKy58T6YdIow34NixDDBe45AzmfSc99-bpU-L5..",
"tfstk": "cKt1Bw1oeIKEaXm0j1ME3pR4JTIdCze5hV1MCffI3djEH-nfTo1cQu57W7T0MiWAd"
}
url = "https://h5api.m.taobao.com/h5/mtop.taobao.datafront.invoke.auctionwalle/1.0/"
params = {
"jsv": "2.6.1",
"appKey": "12574478",
"t": "",
"sign": "",
"bxPageId": "1910955",
"api": "mtop.taobao.datafront.invoke.auctionwalle",
"v": "1.0",
"type": "originaljson",
"dataType": "json",
"requiredParams": "dfApiName,dfUniqueId"
}
data = {
"data": "{\"dfApp\":\"auctionwalle\",\"dfApiName\":\"auctionwalle.datou.getPageModulesData\",\"dfVariables\":\"{\\\"pageId\\\":1910955,\\\"moduleIds\\\":\\\"4394607430,4489817680,4480874310,2004318340,4529967930,2708524060,global\\\",\\\"context\\\":{\\\"keyword\\\":\\\"二手房\\\",\\\"page\\\":\\\"1\\\",\\\"userInfo\\\":\\\"{}\\\",\\\"sceneCode\\\":\\\"20210823QCG72BUD\\\",\\\"firstScreen\\\":\\\"true\\\",\\\"device\\\":\\\"pc\\\"}}\",\"dfUniqueId\":\"1910955.4394607430,4489817680,4480874310,2004318340,4529967930,2708524060,global\",\"dfVariablesRecover\":\"{}\"}"
}
def make_t():
"""
时间戳
:return:
"""
temp_time = int(time.time() * 1000)
params['t'] = str(temp_time)
def make_sign():
"""
请求主要根据sign进行验证
(o.token + "&" + a + "&" + s + "&" + n.data)
token:来自于cookie
a:当前时间戳
s:appKey 12574478
n.data: 请求参数data
"""
make_t()
token = cookies['_m_h5_tk'].split('_')[0]
str_data = f"{token}&{params['t']}&12574478&{data['data']}"
return hashlib.md5(str_data.encode(encoding='utf-8')).hexdigest()
def get_page():
response = requests.post(url, headers=headers, cookies=cookies,
params=params,
data=data)
return response.text
if __name__ == '__main__':
params['sign'] = make_sign()
print(params)
data_text = get_page()
print(data_text)
评论区