Golang爬取网站视频,音乐等(加密/登录)的m3u8格式媒体文件

Golang爬取网站视频,音乐等(加密/登录)的m3u8格式媒体文件

远航
2022-05-07 / 0 评论 / 284 阅读 / 正在检测是否收录...

本文章是对 Golang爬取网站视频,音乐等m3u8格式媒体文件 的补充

1.先打开m3u8文件查看加密方式以及解密key和iv的获取方式

iShot_2022-05-07_16.18.21.png
演示的是某需要登录状态下才能观看视频的网站的m3u8文件前几行
很容易发现m3u8文件的第三行为加密方式以及解密key和iv的获取方式
不同网站的key获取方式不一致,在浏览器控制器监控网络请求很容易分析
这里就不多废话了

2.开始下载ts文件,这里和之前有一点点不一样需要加上请求头
// 请求头
headMap := map[string]string{
    "这里到浏览器控制器复制":"然后填到这里",
}
syncTime := sync.WaitGroup{}
syncTime.Add(len(tsArr))
for _, v := range tsArr {
    fn := path.Base(v)
    fmt.Println("下载:" + fn)
    // 这里的下载需要加上header头信息,里面包含登录状态
    _ = down.DownloadFileHasHeader(filePath+fn, v, headMap, nil)
    syncTime.Done()
}
syncTime.Wait()
3.下载完后先编写个解密工具函数
// DecryptFile 解密ts文件
func DecryptFile(files []string, keys, ivs string) error {
    // 判断iv是否0x开头 如果是,去掉
    if gstr.SubStr(ivs, 0, 2) == "0x" {
        ivs = gstr.SubStr(ivs, 2)
    }
    // 循环批量解密
    for _, f := range files {
        // 读取文件内容
        ciphertext, _ := ioutil.ReadFile(f)
        // key转字节类型
        key, _ := hex.DecodeString(fmt.Sprintf("%x", keys))
        // iv转字节类型
        iv, _ := hex.DecodeString(ivs)
        // 解密
        decrypt, err := gaes.DecryptCBC(ciphertext, key, iv)
        if err != nil {
            return err
        }
        // 把解密后的内容重新写入回去完成解密
        err = gfile.PutContents(f, string(decrypt))
        if err != nil {
            return err
        }
    }
    return nil
}
4.然后开始解密ts文件,具体的key和iv的获取按实际网站情况自己截取
// IsDir 判断目录是否存在
// 解密
// 截取m3u8文件第三行
aesMsg := StringToArray(content, "\n")[2]
// 分隔第三行数据
aesMsgArr := StringToArray(aesMsg, ",")
// 获取aes加解密Key的url地址
aesKeyUrl := aesMsgArr[1]
keyUrl := gstr.TrimRight(gstr.SubStr(aesKeyUrl, 5), `"`)
// 获取aes加解密的iv
aesIv := aesMsgArr[2]
iv := gstr.SubStr(aesIv, 3)
// 请求获取到加解密所用的key
key := HttpGet(keyUrl, googleUa)
// 解密ts文件
err := DecryptFile(fileName, key, iv)
if err != nil {
    glog.Error(err.Error())
    return
}
5.解密后就开始合并和之前的文章一样了

现在就可以开开心心爬取视频和音频啦

0

评论 (0)

取消