吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 29261|回复: 554
上一主题 下一主题
收起左侧

[Windows] 自己动手写个M3U8播放&下载工具

    [复制链接]
跳转到指定楼层
楼主
xue5hen 发表于 2022-11-25 01:18 回帖奖励
  类似的工具论坛里有,自己编写主要是想进一步了解其中的门道。软件编写使用的是Electron+Vue。
  【未加密视频的播放和下载】
  这个比较简单,只在界面上设置了“视频地址输入”“下载目录设置”“播放按钮”“下载按钮”以及“播放区域”。

  播放使用的是hls.js这个插件,使用方法如下:
[JavaScript] 纯文本查看 复制代码
this.hlsVideoObj = new HLS()
this.hlsVideoObj.attachMedia(this.$refs.video)
this.hlsVideoObj.on(HLS.Events.MEDIA_ATTACHED, () => {
    this.hlsVideoObj.loadSource(this.videoUrl)
})
this.$nextTick(() => {
    this.$refs.video.play()
})

  下载功能是先使用fetch请求到m3u8的文件,然后使用m3u8-parser插件对文件内容进行解析,得到ts文件的列表,然后循环下载ts资源。待所有ts文件下载完成以后将它们合并并输出到本地下载目录。
[JavaScript] 纯文本查看 复制代码
downloadTs () {
    let urlArr = this.videoUrl.split('?')[0].split('/')
    let baseUrl = urlArr.slice(0, urlArr.length - 1).join('/')
    let segments = this.parsedManifest.segments || []
    let fileName = urlArr[urlArr.length - 1] + '.mp4'
    this.taskList = []
    this.dataList = []
    this.downloadingCount = segments.length
    segments.forEach((v, i) => {
        let tsUrl = `${baseUrl}/${v.uri}`
        this.taskList.push(
        fetch(tsUrl, {method: 'get', responseType: 'arraybuffer'}).then(res => {
            return res.arrayBuffer()
        }).then((ab) => {
            this.dataList[i] = Buffer.from(ab)
        }).catch((err) => {
            console.log(`segment ${i}:`, err)
        }).finally(() => {
            this.downloadingCount--
        })
        )
    })
    Promise.all(this.taskList).then(() => {
        let filePath = path.join(this.toPath, fileName)
        let dataList = this.dataList.filter(v => v)
        let data = Buffer.concat(dataList)
        this.$sharedObject('jstoolsNode').writeFile(filePath, data).then(() =>{
            this.$toast('下载成功')
            this.taskList = []
            this.dataList = []
        }).catch((err) => {
            this.$toast('下载失败' + err)
        })
    })
}

  【加密视频的播放和下载】
  加密视频因为涉及到解密,所以会增加很多配置项,所以界面会相应变得复杂一些。

  对于加密视频,首先有个套路,就是基本都会对请求源做校验,所以要先修改请求头,这里使用Electron的session模块拦截修改所有请求的referer
[JavaScript] 纯文本查看 复制代码
setOriginUrl () {
    let urlObj = {}
    try { urlObj = new URL(this.videoUrl) } catch (err) { console.log(err) }
    let origin = urlObj.origin || '*://*/*'
    let filters = {urls: [`${origin}/*`]}
    session.defaultSession.webRequest.onBeforeSendHeaders(filters, (details, callback) => {
        details.requestHeaders['Origin'] = origin
        details.requestHeaders['Referer'] = this.refererUrl
        callback({cancel: false, requestHeaders: details.requestHeaders})
    })
    this.$toast('请求源设置已生效')
}

  接着,在m3u8中找到key对应的地址获取到key,这里接口返回的往往是经过加密的key,这时就需要解密一次

  得到真实key以后,就可以用它对下载下来的ts数据进行解密了。
[JavaScript] 纯文本查看 复制代码
decrypt (buffer, key, iv) {
    key = this.key || key || ''
    iv = this.iv || iv || ''
    // 处理key和iv的格式
    let keyWA = key
    if (typeof key === 'string') {
      // 密钥转字节数组(16位)  
      let keyBy = stringToBytes(key)
      // 字节数组转Uint8Array
      let keyBv = new Uint8Array(keyBy)
      // Uint8Array转WordArray
      keyWA = CryptoJS.enc.u8array.parse(keyBv) 
    }
    let ivWA = iv
    if (typeof iv === 'string') {
      let ivBy = hexToBytes(iv)
      let ivBv = new Uint8Array(ivBy)
      ivWA = CryptoJS.enc.u8array.parse(ivBv)
    }
    let view = new Uint8Array(buffer)
    // 将Uint8Array 转成 WordArray
    let contentWA = CryptoJS.enc.u8array.parse(view)
    // base64字符串
    let dcBase64String = contentWA.toString(CryptoJS.enc.Base64)
    // 解密
    let decryptedData = CryptoJS.AES.decrypt(dcBase64String, keyWA, {
      iv: ivWA,
      mode: CryptoJS.mode[this.decryptMode],
      padding: CryptoJS.pad[this.decryptPadding]
    })
    // 把解密后的对象再转为base64编码,这步是关键,跟解密文字不同
    let d64 = decryptedData.toString(CryptoJS.enc.Base64)
    return base642arraybuffer(d64)
}

  待所有数据都解密完成后,就可以将他们合并然后下载到本地了。


  更多详情和代码解释可以看视频展示:https://www.bilibili.com/video/BV14M411r7QX/


免费评分

参与人数 129吾爱币 +118 热心值 +112 收起 理由
130366 + 1 + 1 谢谢@Thanks!
DM4406 + 1 + 1 谢谢@Thanks!
yqmm666 + 1 + 1 我很赞同!
whp272422. + 1 + 1 我很赞同!
jixiangyh + 1 + 1 我很赞同!
a3ddr + 1 + 1 我很赞同!
xiangnianguxian + 1 谢谢@Thanks!
aquarz + 1 + 1 热心回复!
enzooo + 1 + 1 谢谢@Thanks!
a2556483812 + 1 + 1 我很赞同!
kiva555 + 1 我很赞同!
zhujs47 + 1 + 1 大佬,牛!
maihiang + 1 我很赞同!
sthw + 1 + 1 热心回复!
RgeniO + 1 + 1 谢谢@Thanks!
blindcat + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhpsdbx + 1 + 1 用心讨论,共获提升!
XW2PJ + 1 用心讨论,共获提升!
一个云用户 + 1 谢谢@Thanks!
time2s + 1 + 1 谢谢@Thanks!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
jiangyf70 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
halou + 1 + 1 谢谢@Thanks!
鸭嘴饭 + 1 + 1 我很赞同!
miaoj29 + 1 谢谢@Thanks!
draeag + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
和马 + 1 + 1 我很赞同!
xiaomr1990 + 1 + 1 谢谢@Thanks!
fye123 + 1 + 1 谢谢@Thanks!
javaxue + 1 + 1 请问你做的微信信息读取,可以读取微信聊天记录吗
shd888 + 1 + 1 我很赞同!
t55555 + 1 + 1 谢谢@Thanks!
ljknb + 1 + 1 我很赞同!
XXXXXXXXMMMM + 1 + 1 我很赞同!
cafe2001 + 1 + 1 谢谢@Thanks!
pantr0y + 1 热心回复!
yjn866y + 1 + 1 谢谢@Thanks!
clark + 1 我很赞同!
maiwens + 1 + 1 谢谢@Thanks!
hap + 1 我很赞同!
1230123 + 1 + 1 谢谢@Thanks!
hanfujk + 1 谢谢@Thanks!
yuanfangbro0701 + 1 + 1 我很赞同!
Night痕 + 1 + 1 谢谢@Thanks!
fengwen18245 + 1 + 1 我很赞同!
tang5210 + 1 + 1 我很赞同!
cooker689 + 1 谢谢@Thanks!
9277d + 1 + 1 谢谢@Thanks!
dadao815 + 1 + 1 用心讨论,共获提升!
guajun + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hxsl + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
LightMature27 + 1 + 1 我很赞同!
p9rsu9 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
taichao + 1 + 1 谢谢@Thanks!
cctvlive + 1 谢谢@Thanks!
qianshuiqiu + 1 谢谢@Thanks!
吾等汝多时 + 1 我很赞同!
Newconi + 1 谢谢@Thanks!
smallchop + 1 + 1 我很赞同!
753k951 + 1 + 1 我很赞同!
hyyqxx + 1 谢谢@Thanks!
kuiur0810 + 1 + 1 我很赞同!
hehehero + 1 + 1 热心回复!
liuxia + 1 + 1 热心回复!
晴森_ + 1 + 1 谢谢@Thanks!
yaan + 1 + 1 我很赞同!
neople2017 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
greendays + 1 + 1 我很赞同!
vitas5566 + 1 + 1 等大侠出成品
BarryAllen829 + 1 热心回复!
aabbcc123123 + 1 + 1 谢谢@Thanks!
candleliu + 1 + 1 谢谢@Thanks!
Techflow + 1 + 1 我很赞同!
shiningkaka + 1 + 1 谢谢@Thanks!
danshiyuan + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
mashan2014 + 1 + 1 我很赞同!
止语 + 1 + 1 我很赞同!
长河落 + 1 + 1 用心讨论,共获提升!
专业老中医 + 1 + 1 用心讨论,共获提升!
plasd + 1 + 1 谢谢@Thanks!
nightdo + 1 + 1 我很赞同!
liyanqi + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
loiq + 1 + 1 我很赞同!
78zhanghao87 + 1 我很赞同!
fengyingdianxia + 1 + 1 我很赞同!期盼成品!!
franklizz + 1 热心回复!
sgch007 + 1 + 1 谢谢@Thanks!
yfdbg + 1 + 1 谢谢@Thanks!
xiniu233 + 1 + 1 热心回复!
Alldate + 1 用心讨论,共获提升!
Kervin + 1 + 1 谢谢@Thanks!
zhaoqingdz + 1 谢谢@Thanks!
zshuim + 1 鼓励转贴优秀软件安全工具和文档!
Hxie + 1 谢谢@Thanks!
a2604273891 + 1 谢谢@Thanks!
lingyun011 + 1 + 1 我很赞同!
jintian7du + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hengwujun + 1 谢谢@Thanks!
坐久落花多 + 1 界面看着也不错

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
gdbop 发表于 2022-11-25 08:03
期待楼主提供个成品能试用试用,看能不能下载某书网课的资源。

免费评分

参与人数 3吾爱币 +3 热心值 +1 收起 理由
彭半仙 + 1 + 1 我很赞同!
Mailz + 1 我很赞同!
shiqiangge + 1 我很赞同!

查看全部评分

推荐
flylg999 发表于 2022-11-25 17:14
实战经验:好多收费课程key 的原始字符串有时候字符会是乱码,不如直接用32位的hex字符串
iv 一般都在m3u8里直接有定义,可以下载时直接获取
推荐
zrz444 发表于 2022-11-25 07:24
3#
FYL11162022 发表于 2022-11-25 03:04
感谢分享
4#
xixicoco 发表于 2022-11-25 05:07
都是高手,厉害
5#
owenlrj 发表于 2022-11-25 06:10
不错不错
6#
dx163 发表于 2022-11-25 06:33
没有成品啊
7#
生命的插曲 发表于 2022-11-25 06:34
有定时功能就好了
8#
hflyday 发表于 2022-11-25 06:53
不太明白,认真学习
9#
ITtongxue 发表于 2022-11-25 07:09
想找能下加密m3u8的程序好久了!谢谢分享!
10#
aonima 发表于 2022-11-25 07:12
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 00:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表