使用python下载加密的流媒体m3u8视频文件,获取电影资源

  • m3u8简介
  • 代码示例
    • 获取文件名与m3u8地址
    • 媒体序列解密
    • 视频序列片段下载
    • 完整代码
  • 后记

m3u8简介

M3U8是Unicode版本的M3U,用UTF-8编码,m3u8文件其实是 HTTP Live Streaming(缩写为HLS)协议的部分内容。
HLS 的工作原理是把整个流分成多个小的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。
综上,m3u8 文件实质是一个播放列表(playlist)
协议格式主要标签:

  1. EXTM3U:声明该文件是一个 m3u8 文件;
  2. EXT-X-VERSION:声明 HLS 的协议版本号;
  3. EXT-X-TARGETDURATION:表示每个视频分段序列的最大时长(单位:秒);
  4. EXT-X-PLAYLIST-TYPE:表明流媒体类型,若值为VOD表示该视屏流为点播源,若值为EVENT表示该视频流为直播源;
  5. EXT-X-MEDIA-SEQUENCE:表示播放列表第一个 URL 片段文件的序列号;
  6. EXT-X-KEY:使用此标签可以指定解密方法,属性列表主要包括:1) METHOD:指定加密方法,2) URI:指定密钥路径;
  7. EXTINF:表示其后 URL 指定的媒体片段序列时长(单位:秒),每个 URL 媒体片段序列之前必须指定该标签.

代码示例

在在线视频网站中,使用python下载加密的流媒体m3u8视频文件。

获取文件名与m3u8地址

在浏览器中,打开开发者工具,切换到“网络“选项卡,过滤获得m3u8流媒体文件地址。

name = 'nz'
url = "https://vod3.buycar5.cn/20210402/Z4mMbiNW/1000kb/hls/index.m3u8"

媒体序列解密

为了爬虫自动化获取密钥,需要了解密钥获取流程。

  1. 利用上述获取的m3u8文件,切换到”响应(Response)“选型卡查看EXT-X-KEY标签的URI属性的值:
https://ts3.xarxrljt.com:9999/20210402/Z4mMbiNW/1000kb/hls/key.key

  1. 复制密钥地址,查看密钥:

爬虫获取密钥,解密需要使用Crypto库,使用以下命令安装所需库:

pip install pycrypto

利用密钥地址获取密钥:

if "#EXT-X-KEY" in line:method_pos = line.find("METHOD")comma_pos = line.find(",")method = line[method_pos:comma_pos].split('=')[1]#获取加密方式print("Decode Method:", method)uri_pos = line.find("URI")quotation_mark_pos = line.rfind('"')key_path = line[uri_pos:quotation_mark_pos].split('"')[1]key_url = key_pathres = requests.get(key_url,headers=headers)key = res.content   #获取加密密钥

视频序列片段下载

想要下载视频,首先需要解析得到m3u8文件中的视频片段序列,然后根据视频片段序列列表下载视频:

#视频片段序列构建
if '#EXTINF' in line:# 获取每一媒体序列的.ts文件链接地址if 'http' in list_content[index + 1]:href = list_content[index + 1]player_list.append(href)else:href = base_url + list_content[index+1]player_list.append(href)
#视频序列片段下载
for i,j in enumerate(player_list):if not os.path.exists('{}/'.format(movie_name + str(i+1) + '.ts')):cryptor = AES.new(key, AES.MODE_CBC, key)res = requests.get(j,headers=headers)requests.adapters.DEFAULT_RETRIES = 5with open('{}/'.format(movie_name) + str(i+1) + '.ts','wb') as file:file.write(cryptor.decrypt(res.content))#将解密后的视频写入文件print('正在写入第{}个文件'.format(i+1))#time.sleep(5)

下载结果

完整代码

import requests
import os
from Crypto.Cipher import AES
import timeheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.56","Connection": "close"}
def m3u8(url,movie_name):base_url = url[:url.rfind('/')+1]#用于拼接urlrs = requests.get(url,headers=headers).textlist_content = rs.split('\n')player_list = []#创建文件夹,用于存放ts文件if not os.path.exists('{}'.format(movie_name)):#os.system('mkdir merge')os.mkdir('{}'.format(movie_name))key = ''for index,line in enumerate(list_content):# 判断视频是否经过AES-128加密if "#EXT-X-KEY" in line:method_pos = line.find("METHOD")comma_pos = line.find(",")method = line[method_pos:comma_pos].split('=')[1]#获取加密方式print("Decode Method:", method)uri_pos = line.find("URI")quotation_mark_pos = line.rfind('"')key_path = line[uri_pos:quotation_mark_pos].split('"')[1]key_url = key_pathres = requests.get(key_url,headers=headers)key = res.content   #获取加密密钥#print("key:", key)"""获取.ts文件链接地址方式可根据需要进行定制"""if '#EXTINF' in line:# 获取每一媒体序列的.ts文件链接地址if 'http' in list_content[index + 1]:href = list_content[index + 1]player_list.append(href)else:href = base_url + list_content[index+1]player_list.append(href)if(len(key)):print('此视频经过加密')#print(player_list)#打印ts地址列表for i,j in enumerate(player_list):if not os.path.exists('{}/'.format(movie_name + str(i+1) + '.ts')):cryptor = AES.new(key, AES.MODE_CBC, key)res = requests.get(j,headers=headers)requests.adapters.DEFAULT_RETRIES = 5with open('{}/'.format(movie_name) + str(i+1) + '.ts','wb') as file:file.write(cryptor.decrypt(res.content))#将解密后的视频写入文件print('正在写入第{}个文件'.format(i+1))#time.sleep(5)else:#print(i)passelse:print('此视频未加密')#print(player_list)#打印ts地址列表for i,j in enumerate(player_list):if not os.path.exists('{}/'.format(movie_name + str(i+1) + '.ts')):res = requests.get(j,headers=headers)with open('{}/'.format(movie_name) + str(i+1) + '.ts','wb') as file:file.write(cryptor.decrypt(res.content))#将解密后的视频写入文件print('正在写入第{}个文件'.format(i+1))print('下载完成')name = 'nz'
url = "https://vod3.buycar5.cn/20210402/Z4mMbiNW/1000kb/hls/index.m3u8"
m3u8(url,name)

后记

可以使用多线程,提高视频下载速度。
文中示例的m3u8视频文件的加密方式简单,其他复杂加密方式可以利用JS断点获得密钥,然后传递给解密函数。
Enjoy coding!

使用python下载加密的流媒体m3u8视频文件,获取电影资源相关推荐

  1. 关于如何使用python下载各大网站的视频

    关于如何使用python下载各大网站的视频 前提摘要: 最近有些朋友问我怎么下载例如腾讯爱奇艺这些网站的视频,众所周知,这些网站视频只能先在PC端下载他们的客户端,然后再在客户端上缓存,而且缓存下来的 ...

  2. Python 下载 图片、音乐、视频 和 断点续传

    Python3 使用 requests 模块显示下载进度: http://blog.csdn.net/supercooly/article/details/51046561 python编写断点续传下 ...

  3. python Gstreamer 播放不同编码格式的视频文件

    python Gstreamer 播放不同编码格式的视频文件   在之前的博客中写过了如何查找一个视频中的video以及audio编码格式,并根据编码的格式挑选元件对视频进行播放.但在相同的封装格式的 ...

  4. 如何[破解]观看加密受保护的视频文件

      如何 [ 破解 ] 观看加密受保护的视频文件 一 , 修复系统「数字管理组件」 DRM 由于加密视频使用了

  5. Python调用OpenCV接口播放本地视频文件、本地和网络摄像头

    1 前言 上篇文章介绍了在WIN10系统上, C++调用OpenCV接口,播放本地视频文件.本地和网络摄像头视频.本篇我们来看一下,Python如何调用OpenCV接口,做同样的事情. 序号 视频来源 ...

  6. python下载加密视频_Python下载未加密的m3u8文件(流媒体文件)

    很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.m3u8格式的,按文件目录找过去发现是一个几十K大小的系统不可读的文件,那我们缓存下来的文件去哪儿了呢? 其实.m3u8文件就相当于一个协议 ...

  7. Python下载加密m3u8视频

    一些网站会提供m3u8视频地址,以供下载观看.或者一些网站经过分析后发现是使用m3u8格式进行播放的,这时使用m3u8的地址链接就可以下载到相应的视频. 一.关于m3u8:(https://blog. ...

  8. 下载加密的流媒体视频

    声明:文章内容仅供学习交流,切勿以身试法. [目标] 因涉及广告,测试地址马赛克. [尝试1] 这个视频是m3u8的形式进行播放的,可以观看,但不允许下载.首先,我想到的是尝试下载ts文件,如果可以的 ...

  9. 利用python下载钉钉群直播视频

    今年因为疫情的原因不能开学,所以很多学校都使用钉钉进行在线授课,但是在钉钉里面点击下载群直播回放的时候却发现管理员关闭了下载功能,那么,我们在这种情况下应该怎样利用 Python 程序来达到我们下载视 ...

最新文章

  1. 【Treap】bzoj1588-HNOI2002营业额统计
  2. MySQL数据库开发规范-EC
  3. 华硕笔记本如何锁定计算机,我的华硕电脑开机密码被锁定了怎么办
  4. android studio 插件开发 FindByTag插件 局部情况下取代ButterKnife插件
  5. C#中的Dispose模式
  6. BZOJ 3039: 玉蟾宫( 悬线法 )
  7. centOS7安装matlab2014a
  8. 系统虚拟化与虚拟机的区别
  9. 介绍一个被称为十一边形战士的强大模型
  10. 怎样快速打出初中常用的化学反应方程式
  11. 数据清洗_缺失值处理
  12. Newton-Cotes 公式及代码
  13. wamp5环境配置基础教程
  14. oracle数据库exec用法,Sql中exec的用法
  15. IE和标准下有哪些兼容性的写法
  16. mysql编写1到n的奇数和_编写程序。输入任意整数n,计算1到n的奇数和
  17. uoj#209【UER #6】票数统计
  18. 鸿蒙系统报名选择一个应用,申请鸿蒙系统有一个应用选择怎么选择呢
  19. zuul 里面的 prefix 和 strip-prefix 怎么使用
  20. 计算机三级网络技术(选择高频考点)

热门文章

  1. Partition List,拆分链表
  2. 【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)
  3. layout_weight
  4. DirectUI的初步分析-转
  5. Python生成器 yield
  6. hdu 1358 Period (KMP求循环次数)
  7. iphone开发中图像处理相关要点
  8. Minimum Window Substring @LeetCode
  9. 3.c语言结构体成员内存对齐详解
  10. 再解Java中的String