1. 前言
网页端视频的前端实现原理主要有两种:一是直接提供 mp4 等视频链接,可直接下载;二是返回 m3u8 等文件类型,需进一步处理才能获取视频文件。针对某些无广告但加密复杂的视频平台,需要通过分析接口参数来获取 m3u8 链接。

2. JS 逆向分析
获取 m3u8 链接的前提是解析接口中的加密参数。这些参数通常经过严格加密处理。

主要涉及红框内的两个参数值,通过 JS 逆向分析可定位到具体逻辑。

由于加密逻辑较为复杂,此处简化讲解。使用 Python 模拟加密后组合链接,请求接口可获得如下数据:

在 JSON 数据中找到 m3u8 链接所需参数,再次模拟加密并组合,即可得到最终 m3u8 链接。

Python 模拟

部分参数随机化导致链接不同,但均可正常访问。
3. 参考代码和运行结果
import execjs
import requests
from crawlers.userAgent import useragent
import json
from lxml import etree
obj = {
"webSite": "ppVideo_PC_site",
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: {
: ,
: ,
:
},
: ,
: ,
:
}
u = useragent()
html_url = ()
rsp2 = requests.get(url=html_url, headers={: u.getUserAgent()})
html = etree.HTML(rsp2.text)
_json_data = html.xpath()[-]
_json_data = _json_data[_json_data.find()+:_json_data.rfind()].strip()
_map_data = json.loads(_json_data)
cid = _map_data[]
(file=, mode=, encoding=) f:
_js_str = f.read()
ctx = execjs.(_js_str)
url = ctx.call(, cid, obj)
rsp = requests.get(url=, headers={: u.getUserAgent()})
_res_str = rsp.text
_res_str = _res_str[_res_str.find()+:_res_str.rfind()]
_ = json.loads(_res_str)
items = _[][][][][][]
(file=, mode=, encoding=) f:
_js_str2 = f.read()
ctx2 = execjs.(_js_str2)
e items:
rid = e[]
v_id = rid[:rid.rfind()]
e_obj = e[]
flag, bh, id_val, sh, iv, st, key = e_obj[], e_obj[], e_obj[], e_obj[], e_obj[], e_obj[], e_obj[][]
params = ctx2.call(, flag, bh, id_val, sh, iv, st, key)
(e[], .(v_id, params))

