严禁用于学习交流之外的任何用途,侵删
只能说这个比较简单,没什么难度,很适合做js逆向入门
下面就开始解析一下这个网站吧。aHR0cHM6Ly93d3cubWlndXZpZGVvLmNvbS9tZ3Mvd2Vic2l0ZS9wcmQvZGV0YWlsLmh0bWw/Y2lkPTcxMzM4OTcxNg==
确认需要的视频链接不在源码后,我们开始找接口分析:
图一
这么一看,好像是直接在接口里找到目标了,那是不是只需要看看接口有没有加密参数就行了?
那我们看看接口参数:
图二
经过测试,我们只需要红框里的接口就行了,参数只有需要一个contId,也就是这个网页链接里带的id,好像不需要加密参数。(好像不遮挡域名图片会被河蟹掉,上个博客就是。。。)
那似乎真的就好像对接口请求就行了?
其实不是的,这个接口请求会正常返回数据,但是图一返回的数据中,url是个不完整的链接,无法正常跳转。我们把图一的链接复制一下,再去找一下真正的视频链接:
图三
对比:
图四
简单对比之后,发现真正请求的链接是多了两个参数的,也就是,我们在接口获取的链接经过了处理。
行,进到js阶段了
参数 ddCalcu:50c0e4d3b334f11879e1f7f9e045206c64df 就是重点了
全局搜一下:
搜到一个结果,进去看看
打个断点调试:
一下全都出来了,没有什么难度。
简单来说就是把我们接口(图一)获取到的url,在url匹配到参数,然后对参数进行操作,获取ddCalcu,然后再加上传进来的url,返回真正的链接。
代码操作一下:
import re
import execjs
import requests
def get_video1(url):
"""
:param url: 参数,视频链接
:return: None 只解析,不return
"""
video_id = re.search(r'cid=(\d+)', url).group(1)
# header中的参数不可缺,否则返回的数据是有问题的
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
'terminalId': 'www',
'appId': '域名',
'clientId': '83356a76249486924b6804daaa5a4e03',
'Connection': 'keep-alive',
'Host': 'webapi.域名.com',
'Origin': 'https://www.域名.com',
'Referer': 'https://www.域名.com/',
'X-UP-CLIENT-CHANNEL-ID': '0132_10010001005'
}
api = 'https://webapi.域名.com/gateway/playurl/v3/play/playurl?contId={}'
resp = requests.get(api.format(video_id), headers=headers)
# 前置链接非视频链接,在源码中,该链接会作为参数传到js中
video_urls = re.findall(r'"url":"(.*?)"', resp.text, re.S)
video_url = video_urls[0]
# 从链接中拿到必要参数
timestamp = re.search('timestamp=(\d+)', video_url).group(1).strip()
ProgramID = re.search('ProgramID=(\d+)', video_url).group(1).strip()
Channel_ID = re.search('Channel_ID=(\d+_\d+)', video_url).group(1).strip()
puData = re.search('puData=(.*)', video_url).group(1).strip()
print(timestamp, ProgramID, Channel_ID, puData)
# 执行js获取真正链接
ctx = execjs.compile(open('js/migu.js').read())
video_url = ctx.call("getUrl", video_url, timestamp, ProgramID, Channel_ID, puData)
print(video_url)
if __name__ == '__main__':
url = ''
get_video1(url)
值得注意的是,请求头的一些参数是必须的,不然图一获取的url就是不正常的,整个代码也就有问题了。
js代码:
function getUrl(e, timestamp, ProgramID, Channel_ID, puData) {
var t = "eeeeeeeee"
, r = timestamp
, n = ProgramID
, a = Channel_ID
, o = puData
if (!o)
return e;
var s = "2624";
s = s.split("");
for (var u = t.split("")[s[0]] || "e", l = r.split("")[s[1]] || "t", c = n.split("")[s[2]] || "c", f = a.split("")[a.split("").length - s[3]] || "n", d = o.split(""), h = [], p = 0; 2 * p < d.length; p++)
switch (h.push(d[d.length - p - 1]),
p < d.length - p - 1 && h.push(o[p]),
p) {
case 1:
h.push(u);
break;
case 2:
h.push(l);
break;
case 3:
h.push(c);
break;
case 4:
h.push(f)
}
var v = h.join("");
return e + "&ddCalcu=" + v
}
对比源码,坐了一定的处理,正则匹配参数的步骤在python执行,js就更简洁点。
以上