Python爬虫:通过js逆向获取某视频平台上的视频的m3u8链接

news/2024/7/19 9:33:18 标签: python, 爬虫, javascript

Python爬虫:通过js逆向获取某视频平台上的视频的m3u8链接

        • 1. 前言
        • 2. js逆向分析
        • 3. 参考代码和运行结果

1. 前言

现在我们在网页端看的视频,其前端实现原理就小编目前知道的而言,总的有两点:其一,直接就是一个mp4(或其他类似的)视频链接,如果我们能得到这个视频链接,直接用这个链接就能下载到这个视频;其二,和第一点差不多吧!但是直接用链接下载,获取不到视频文件,而是一个其他类型的文件(比如m3u8文件),虽然不能直接下载到视频,但是通过进一步处理,最后还是能得到视频文件的。最近,看到了一个视频平台,觉得这个平台挺好的,没有广告,想得到在这个平台的视频文件,但是其原理属于第二种情况,且网站进行相对复杂的加密处理,怎样才能得到这个平台上的视频的m3u8文件呢?
请添加图片描述

2. js逆向分析

通过一些分析,可以发现,要想得到这个m3u8文件,首先需要得到m3u8链接,要想得到m3u8链接,前提是明白这个链接中的一些参数的来源,然而这些参数来源却是一个请求接口链接的结果数据,为此,需要得到这个接口链接,可是这个接口链接的一些请求参数却做了严格的加密处理,如下:
请添加图片描述
主要是上述图片中画上红框的两个参数值,通过一些js逆向分析,最后可以定位到这里。
请添加图片描述
因为其中做了较为复杂的加密处理,如果要详细讲解,可能本篇博文很长,为此,只是简化讲解而已。这两个参数值用Python模拟加密之后,进行链接组合,最后可以得到这个接口链接,请求这个接口链接,可以得到如下数据:
请添加图片描述
在上述json数据找到一些在m3u8链接中需要用到的参数值,通过Python模拟加密,然后再进行组合,最后便可以得到最终想要的m3u8链接。请添加图片描述
Python模拟
请添加图片描述
因为其中一些参数进行随机化处理,所以上述两张图片中m3u8链接并不是相同的,但是都是可以正常访问的。

3. 参考代码和运行结果

python">import execjs
import requests
from crawlers.userAgent import useragent
import json
from lxml import etree


obj = {
    "webSite": "ppVideo_PC_site",
    "queryParams": "&o=0&contCoprChl=pptv.web",
    "username": "",
    "token": "",
    "startPosition": 0,
    "resLiveFormat": "flv",
    "resVodFormat": "m3u8",
    "skipMovieTitle": True,
    "autoPlay": False,
    "useP2P": False,
    "environment": "prd",
    "useOnePlay": True,
    "ppi": "302c3532",
    "o": "0",
    "playerVersion": "4.1.18",
    "vvid": "c2834d35-1a50-3790-5568-30f2c2a0ce1b",
    "playApiConfig": {
        "appid": "pptv.web.h5",
        "channel": "sn.cultural",
        "type": "mhpptv"
    },
    "useOnePlayPreview": False,
    "playParamsShow": False,
    "previewKey": ""
}
u = useragent()

html_url = input('输入:')
rsp2 = requests.get(url=html_url,headers={
    'user-agent':u.getUserAgent()
})
html = etree.HTML(rsp2.text)
_json_data = html.xpath('//script/text()')[-1]
_json_data = _json_data[_json_data.find('=')+1:_json_data.rfind(';')].strip()
_map_data = json.loads(_json_data)
cid = _map_data['cid']
with open(file='./test.js',mode='r',encoding='utf-8') as f:
    _js_str = f.read()
ctx = execjs.compile(_js_str)
url = ctx.call('getWebPlayInfoAddr',cid,obj)

rsp = requests.get(url=f'https:{url}',headers = {
    'user-agent':u.getUserAgent()
})
_res_str = rsp.text
_res_str = _res_str[_res_str.find('(')+1:_res_str.rfind(')')]
_map = json.loads(_res_str)
items = _map['data']['program']['media']['resource']['vod2']['item']
with open(file='./test2.js',mode='r',encoding='utf-8') as f:
    _js_str2 = f.read()
ctx2 = execjs.compile(_js_str2)
for e in items:
    rid = e['rid']
    v_id = rid[:rid.rfind('.')]
    e_obj = e['dt']
    flag,bh,id,sh,iv,st,key = e_obj['flag'],e_obj['bh'],e_obj['id'],e_obj['sh'],e_obj['iv'],e_obj['st'],e_obj['key']['content']
    params = ctx2.call('buildOnePlayVodSubStreamDetails',flag,bh,id,sh,iv,st,key)
    print(e['bitrate'],'https://ksyun.vod.pptv.com/{}.m3u8?fpp.ver=1.0.0&{}'.format(v_id,params))

【注】其中有两个js文件,因为代码量实在是太大了,所以就没有粘贴出来了。上述代码最终能得到视频的m3u8链接,如果读者想用这个m3u8链接最终得到视频文件,可以去看看小编这篇文章,文章链接为:Python爬虫:通过js逆向我发现了斗鱼视频请求参数的加密原理,当然,读者也可以考虑直接使用PotPlayer这个软件来播放这个m3u8链接。

代码运行结果:

Python爬虫:通过js逆向获取pp视频平台上的视频的m3u8链接


http://www.niftyadmin.cn/n/5010157.html

相关文章

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一:完全背包问题的变体(版本1)方法二:完全背包问题变体(版本2) 三、拓展:先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包(组合问题…

aarch64架构CPU的docker中ubuntu18.04,20.04,22.04等系统apt update均报错的原因

宿主及环境为aarch64的CPU的Ubuntu18.04,docker版本为自带的19.03.6。 对于Ubuntu14.04、16.04、18.04这个原因很乌龙,之前百度搜索结果也都不对,最终原因竟然只是因为网络问题。早上8点左右我到公司执行atp update,一切正常&…

windows安装CUDA

windows安装CUDA 说明 适用于你的电脑为nvidia的显卡 第一步 先运行nvcc -V 查看cuda版本,不过应该都是未识别的命令,如下图所示 打开pytorch的官网 https://pytorch.org/get-started/locally/ ,查看其支持最新的cuda为多少版本&#xf…

从jdk8 升级到jdk17的问题总结

目录 1. java.lang.reflect.InaccessibleObjectException: 2. java.lang.UnsatisfiedLinkError in autosys 3. java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser 4. java.lang.UnsatisfiedLinkError: **…

Docker的初级使用

Docker的初级使用 Docker的安装1.1 如果之前安装过旧版本的Docker,可以使用下面命令卸载:1.2.安装docker1.3.启动docker1.4.配置镜像加速2.CentOS7安装DockerCompose2.1.下载2.2.修改文件权限2.3.Base自动补全命令:3.Docker镜像仓库3.1.简化版镜像仓库3.2.带有图形化界面版本…

解锁“文心一言”赋能大型连锁商超密码

解锁“文心一言”赋能大型连锁商超密码](https://mp.weixin.qq.com/s/rgj9sZFiajxc5EBVvnMH8Q) 2023年,“AIGC”江湖风起云涌,前有百度“文心一言”对标ChatGPT全民开放,后有其他公司的大模型迅速跟进落地,譬如某飞。 大模型这部…

Python机器学习、深度学习在气象、海洋、水文领域实践应用

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…

MySQL服务关闭开机自启,改成手动启动状态

最近在写前端,所以就先把后端数据库禁用或手动启动吧。防止浪费太多内存或资源。一般就之前损坏了的数据库就禁用吧,其他最近不常用的服务就没必要开机自启动吧,毕竟电脑只有一台,不想学习想用电脑来玩的话就讲工作服务从开机自启…