gpt4 book ai didi

python3.6根据m3u8下载mp4视频

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 29 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python3.6根据m3u8下载mp4视频由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

需要下载某网站的视频,chrome浏览器按f12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这个链接后找不到网页,网上查了下,找到了下载方法,在这里做个记录,如果有错误,欢迎指出.

程序在windows 10下运行,不过linux应该也没问题.

使用到的有re模块,requests模块和crypto模块,其中requests模块和crypto模块如果没安装可以使用pip命令安装。(crypto模块安装感觉比较坑,我是从anaconda里拷贝了一份) 。

下面开始正题:

注:以下使用的m3u8文件所在的网站是自己搭建用来测试的,链接可能会失效.

首先在chrome的network里找到一个m3u8文件的请求,可以通过它下载视频.

python3.6根据m3u8下载mp4视频

通过preview可以看到m3u8文件的内容.

python3.6根据m3u8下载mp4视频

这里m3u8文件比较重要的内容有两个.

一个是uri后面的链接,这个是加密和解密的秘钥,如果m3u8文件里有这个uri,那么这个视频就是经过了加密的,加密的方法可以看uri前面,这里是aes-128加密算法.

另一个是以ts结尾链接,这个是视频片段,如果是没进行加密的,可以直接打开这个链接下载视频片段,下载下来的是后缀为ts的文件,一般可以直接播放,不过时间很短。如果是加密过的,下载后播放会提示视频文件已损坏.

知道这些后,就可以进行下载了,先获取m3u8文件的内容,然后解析出秘钥(key)和ts的链接,然后下载key对每一个ts进行解密,保存到一个mp4文件里.

下载用的是requests模块,解析key和ts的链接是用的re模块,解密用的是crypto模块.

使用crypto需要注意三个地方,一个是安装和导入,第二个是crypto里aes.new的参数,第三个是decrypt方法的参数。下面先看代码.

导入模块:

?
1
2
3
import re
import requests
from crypto.cipher import aes

初始设置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 保存的mp4文件名
name = "dream_it_possible.mp4"
 
# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"
 
 
# 请求头,不一定需要,看网站更改
headers = {
  "referer" : "http://www.jiuyi.info/video/dream_it_possible" ,
  "user-agent" : "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 "
      "(khtml, like gecko) chrome/71.0.3578.80 safari/537.36" ,
  }

获取m3u8文件内容,并解析出key和ts文件的url.

?
1
2
3
4
5
6
7
8
# 获取m3u8文件内容
r = requests.get(url)
 
# 通过正值表达式获取key和ts的url
k = re. compile (r "http://.*?\.key" ) # key的正则匹配
t = re. compile (r "http://.*?\.ts" # ts的正则匹配
key_url = k.findall(r.text)[ 0 # key的url
ts_urls = t.findall(r.text)  # ts的url列表

下载并解密ts文件,保存为mp4文件.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 下载key
key = requests.get(key_url).content
 
# 解密并保存ts
for ts_url in ts_urls:
 
  ts_name = ts_url.split( "/" )[ - 1 # ts文件名
 
  # 解密,new有三个参数,
  # 第一个是秘钥(key)的二进制数据,
  # 第二个使用下面这个就好
  # 第三个iv在m3u8文件里uri后面会给出,如果没有,可以尝试把秘钥(key)赋值给iv
  sprytor = aes.new(key, aes.mode_cbc, iv = key)
 
  # 获取ts文件二进制数据
  ts = requests.get(ts_url).content
 
  # 密文长度不为16的倍数,则添加二进制"0"直到长度为16的倍数
  while len (ts) % 16 ! = 0 :
  ts + = b "0"
 
  # 写入mp4文件
  with open (name, "ab" ) as file :
   # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
   file .write(sprytor.decrypt(ts))
  print (name, "下载完成" )

到这里就下载完成了.

完整代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import re
import requests
from crypto.cipher import aes
 
 
# 保存的mp4文件名
name = "dream_it_possible.mp4"
 
# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"
 
 
# 请求头,不一定需要,看网站更改
headers = {
  "referer" : "http://www.jiuyi.info/video/dream_it_possible" ,
  "user-agent" : "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 "
      "(khtml, like gecko) chrome/71.0.3578.80 safari/537.36" ,
  }
 
print ( "正在解析:" + url.split( "/" )[ - 1 ])
 
# 获取m3u8文件内容
r = requests.get(url)
 
# 通过正值表达式获取key和ts的链接
k = re. compile (r "http://.*?\.key" ) # key的正则匹配
t = re. compile (r "http://.*?\.ts" ) # ts的正则匹配
key_url = k.findall(r.text)[ 0 ] # key的url
ts_urls = t.findall(r.text) # ts的url列表
 
# 下载key的二进制数据
print ( "正在下载key" )
key = requests.get(key_url).content
 
# 解密并保存ts
for ts_url in ts_urls:
 
  ts_name = ts_url.split( "/" )[ - 1 # ts文件名
 
  # 解密,new有三个参数,
  # 第一个是秘钥(key)的二进制数据,
  # 第二个使用下面这个就好
  # 第三个iv在m3u8文件里uri后面会给出,如果没有,可以尝试把秘钥(key)赋值给iv
  sprytor = aes.new(key, aes.mode_cbc, iv = key)
 
  # 获取ts文件二进制数据
  print ( "正在下载:" + ts_name)
  ts = requests.get(ts_url).content
 
  # 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数
  while len (ts) % 16 ! = 0 :
   ts + = b "0"
 
  print ( "正在解密:" + ts_name)
 
  # 写入mp4文件
  with open (name, "ab" ) as file :
   # # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
   file .write(sprytor.decrypt(ts))
   print ( "保存成功:" + ts_name)
print (name, "下载完成" )

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://blog.csdn.net/u012552769/article/details/87949543 。

最后此篇关于python3.6根据m3u8下载mp4视频的文章就讲到这里了,如果你想了解更多关于python3.6根据m3u8下载mp4视频的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0