本文章是对 Golang爬取网站视频,音乐等m3u8格式媒体文件 的补充
1.先打开m3u8文件查看加密方式以及解密key和iv的获取方式
演示的是某需要登录状态下才能观看视频的网站的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)