失踪人口回归ing
今天要讲的是今日头条web版的_signature参数逆向
直接上链接 --> 今日头条
首先随便点开一个版本,这里点的是娱乐,抓包看看结果。
可以很清晰地看到首页html源码里面并没有上图中的关键字"古巨基",可以初步判断是异步加载的数据,所以接着往后面找找接口。
不难找到这个接口,可以看到data里面的数据就是网页上所展示的了,所以可以确定这个接口就是用来拿数据的了,然后看看里面post的参数,除了as,sp,_signature以外,其他的都是固定值,as,sp这里先不做分析,因为实际上测试之后发现不带这个参数也无所谓。
首先F12全局搜索这个参数:
这断点一打就发现了大幂幂,看来估计应该不算太难?接着往function里面look look~
这下就很清晰了 实际上就是window.byted_acrawler.sign()这个方法对url进行了encrypt,加密的函数和结果全部都是它来完成的,然后我们全局搜索一下window.byted_acrawler这个东东来看看
这下就很清晰了 把window.byted_acrawler这个算法扣下来,放到nodejs里面跑跑看,就ok了。
主要代码块如下
# -*- coding: utf-8 -*-
import urllib
import requests
def get_json():
url = "https://www.toutiao.com/api/pc/feed/"
headers = {
"content-type": "application/x-www-form-urlencoded",
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
"referer": "https://www.toutiao.com/ch/news_tech/",
}
params = {
"category": "news_tech",
"utm_source": "toutiao",
"widen": "1",
"max_behot_time": "0",
"max_behot_time_tmp": "0",
"tadrequire": "true",
"as": "",
"cp": "",
}
decode_url = url + "?" + urllib.parse.urlencode(params)
decode_url = decode_url.replace("com/", "com/toutiao/")
data = {
"url": urllib.parse.quote(decode_url)
}
_signature = requests.post('http://121.40.96.182:4007/get_sign', data=data).json()['_signature']
print("计算_signature值为:", _signature)
params["_signature"] = _signature
resp = requests.get(url, headers=headers, params=params)
print(resp.json())
if __name__ == '__main__':
get_json()
这个直接在pyexecjs里面跑会报错,所以就用nodejs封装了个api来计算_signature,这样就方便很多了.
update(2020-04-10):
介于部分小伙伴好奇为什么我这边计算出来的_signature会比浏览器上的少了一截,其实很简单,就是init的问题。
window.byted_acrawler.init({
aid: 24,
dfp: true
})