本节内容是马蜂窝的cookie生成分析以及该页面m3u8文件地址获取,该网站采用了加速乐(JSL)的混淆和加密,特征比较明显,cookie会经过多次请求后生成。
目标网站链接地址:https://www.mafengwo.cn/i/9754893.html
第一步分析接口,查看数据包。先通过控制台Application中的cookie位置,删除现有的cookie,然后刷新页面抓包,如图1所示:
可以发现,请求时页面加载了3次。
第一次请求,响应头中的cookie有__jsluid_s,请求失败。
第二次请求,cookie中多了一个__jsl_clearance_s,请求失败。
第三次请求,cookie的__jsl_clearance_s发生了变化,请求成功获得相应。
对第一次请求内容进行分析,__jsluid_s可以通过请求在set-cookie中直接获得。全局搜索能找到这段代码,但无法在浏览器中显示响应内容。此时需要用抓包工具来查看,打开charles,发现返回的是一段经典的字符混淆。如图1右下角所示。
对第二次请求内容进行分析,如图2所示:
这看起来像是经典的ob混淆,ob混淆的特征是开头就是大串数组,接下来通过工具进行解混淆,格式化查看,结果如图3所示:
整段代码的意思大概是方法执行后添加了一个cookie,如图4所示:
可以发现_0xe5bffc是传进去的参数,_0xe5bffc['tn']就是上面的__jsl_clearance_s,说明执行这里后更新了__jsl_clearance_s。其实到这里就分析完了,在第三次请求中无其他参数,携带着前两次生成的cookie即可进行请求。
接下来根据分析出的流程来编写代码:
import re
import json
import execjs
import requests
import hashlib
# 关闭SSl验证提示
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings((InsecureRequestWarning))def start():'''发起第一次请求'''# 第一次访问,直接得到JS代码res = session.get(url=url, headers=headers, verify=False)# 正则匹配需要的部分__jsl_clearance_s = re.findall('cookie=(.*?);location', res.text)[0]# 反混淆,分割出cookie的部分__jsl_clearance_s = execjs.eval(__jsl_clearance_s).split(';')[0].split('=')[1]print(f"__jsl_clearance_s:{__jsl_clearance_s}")return then(__jsl_clearance_s)def then(__jsl_clearance_s):'''发起第二次请求'''cookie = {'__jsl_clearance_s': __jsl_clearance_s}# 携带获得的cookie进行第二次访问session.cookies.update(cookie)res = session.get(url=url, headers=headers, verify=False)# 正则提取出go函数部分go = json.loads(re.findall('};go\((.*?)\)</script>', res.text)[0])return parse_cookie(go)def parse_cookie(go):'''根据sha256算法规则反解cookie'''global hafor i in range(len(go['chars'])):for j in range(len(go['chars'])):values = go['bts'][0] + go['chars'][i] + go['chars'][j] + go['bts'][1]if go['ha'] == 'md5':ha = hashlib.md5(values.encode()).hexdigest()elif go['ha'] == 'sha1':ha = hashlib.sha1(values.encode()).hexdigest()elif go['ha'] == 'sha256':ha = hashlib.sha256(values.encode()).hexdigest()# print(ha)if ha == go['ct']:__jsl_clearance_s = valuesprint(f"__jsl_clearance_s:{__jsl_clearance_s}")return end(__jsl_clearance_s)def end(cookie):'''携带cookie第三次访问,提取文件地址'''cookie = {'__jsl_clearance_s':cookie}session.cookies.update(cookie)res = session.get(url=url,headers=headers,verify=False)# 通过正则提取出m3u8文件地址file = re.findall('data-url="(.*?)"',res.text)file = [i for i in file if i]print(file)if __name__ == '__main__':url = 'https://www.mafengwo.cn/i/9754893.html'headers = {'Referer': 'https://www.mafengwo.cn/i/9754893.html','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36'}session = requests.Session()start()
代码运行成功,结果如图5所示: