url:https://www.zhitongcaijing.com/immediately.html
分析过程
-
抓流量包,主要关注如下这条数据包。
响应数据如下。
由于该url中的token参数是经过加密的,所以目的就是找到加密过程。 -
关键字搜索
immediately/content-list.html
,只有两条记录,第一处是个html代码,肯定不是,所以只需要看第二处。
-
打断点,刷新界面,触发该断点。
但通过调用栈发现都是在自我调用,并且此处看不到token
关键字,放弃,换另一种思路。 -
搜索关键词
token
,符合的只有四处。
最下面两处由于url地址都不对可以排除。
第一处由于是个POST方式,跟我们想要的GET方式传参不一致,也排除。
只剩下最后一处了,且是GET传参,符合。
-
打断点,触发。
这个url不对,放过去。滚动一下界面,又触发了断点。
这个url就对了,主要看token是怎么生成的。 -
"token=".concat(Object(i["tokenCrypto"])(u(u({}, e), n)))
,主要看Object(i["tokenCrypto"])
和u(u({}, e), n)
是什么。
u(u({}, e), n)
的值如下,相当于是一个字典,里面带有时间戳等属性。
Object(i["tokenCrypto"])
的定义如下。
打断点,让程序运行到这里。
看call stack,发现是Object(p["a"])(e(t))
中调用了e(t)
函数。
看到传给e
函数的参数如下。
单步向下走,看最后返回的结果是什么。
从结果中就可以得知e
函数就是用&
将传进去的参数进行了拼接。
再看Object(p["a"])
的定义。
看到关键字SHA1
了,原来是个sha1算法,加密的数据就是e
函数执行完后的数据,所以整个逻辑就非常清楚了。
-
编写python代码获取数据。
import time
import hashlib
import requests
timestamp = int(time.time())
# 需要加密的数据
plaintext = "last_update_time={}&platform=web&roll=gt&type=all".format(timestamp)
# sha1加密
sha1_hash = hashlib.sha1()
sha1_hash.update(plaintext.encode("utf-8"))
# print(sha1_hash.hexdigest()) # 0b87a5231b9b13d77b9042ba660bedf90f92a235
token = sha1_hash.hexdigest()[2:]
url = "https://www.zhitongcaijing.com/immediately/content-list.html?type=all&roll=gt&token={}" \
"&last_update_time={}&platform=web".format(token, timestamp)
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, " \
"like Gecko) Chrome/123.0.0.0 Safari/537.36"})
print(resp.text)
运行,成功获取到数据。