西北乱跑娃 --- python m3u8库

有勇气的牛排
官网:https://lgch.xyz/添加链接描述
兼职写代码赚米,可进官网查看,千人团队,实力合作,同多家淘宝等店铺合作,质量靠谱,当天结款。

解析m3u8并提取url

一、安装m3u8库

pip install m3u8
cryptor = AES.new(key, AES.MODE_CBC, key)

二、解析提取url

import m3u8

m3u8_obj = m3u8.load(r'C:\Users\Administrator\Desktop\anylise\hls-720p.m3u8')
for seg in m3u8_obj.segments:
    print(seg.uri)

m3u8.load()中可以直接放入url

三、爬取视频

import re
import m3u8
import requests
from Crypto.Cipher import AES

# 保存的mp4文件名
name = "result.mp4"

# m3u8文件的url
url = "https://hls.videocc.net/f8f97d17d0/d/f8f97d17d0a21f1a1d84d214c5dcbfdd_1.m3u8?pid=1574769126087X1685817&device=desktop"


headers = {
    "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文件内容
r = requests.get(url).content.decode()
# print(r)
m3u8_obj = m3u8.load(url)
ts_urls = []
for i, seg in enumerate(m3u8_obj.segments):
    if i<=10:
        # print(seg.uri)
        ts_urls.append(seg.uri)
print(ts_urls)

# 通过正则匹配下载key
k = re.findall(r'URI="(.*)"', r)[0]  # key的正则匹配
print(k)

# 此处加请求头访问key文件,否则相应可能为空
head = {
    'Origin': 'https://www.shiguangkey.com',
    'Referer': 'https://www.shiguangkey.com/video/2321?videoId=40168&classId=4179&playback=1',
    'Sec-Fetch-Mode': 'cors',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
key = requests.get('https://hls.videocc.net/playsafe/f8f97d17d0/d/f8f97d17d0a21f1a1d84d214c5dcbfdd_1.key?token=4155fc5a-c118-4c1e-89ca-9838ddf4c5dd-w6175726', headers=head).content
# key = 0x798352326fcc8c33808758cb969f6ac9
print(key)
# 解密并保存ts
for ts_url in ts_urls:
	# 如果连接末尾没有.ts手动加上
    ts_name = ts_url.split("/")[-1] + '.ts'  # ts文件名
    print(ts_name)

    # 解密,new有三个参数,
    # 第一个是秘钥(key)的二进制数据,
    # 第二个使用下面这个就好
    # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV
    sprytor = AES.new(key, AES.MODE_GCM)
    print(sprytor)

    # 获取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, "下载完成")
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西北乱跑娃

万水千山总是情,犒赏一下行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值