【问题标题】:decrypt .ts segments from m3u8 with python使用 python 从 m3u8 解密 .ts 段
【发布时间】:2018-02-08 16:05:03
【问题描述】:

为什么我的代码无法解密 ts 段?

from Crypto.Cipher import AES
import requests as req
import os
import m3u8
with req.session() as req:
    m3u = m3u8.load('https://svt1-a.akamaized.net/se/svt1/d132b755-8088-475e-91df-2c8f2de9cf6c/hls-v6/v6.m3u8')
    key_url = m3u.keys[0].absolute_uri
    seg = m3u.segments[0].absolute_uri
    key = ''
    for chunk in req.get(key_url,stream=True):
        key+=chunk
    cipher = AES.new(key, AES.MODE_CBC, os.urandom(16))
    data = ''
    for chunk in req.get(seg, stream=True):
        data+=chunk
    data = cipher.decrypt(data)
    with open('ulk.ts','wb') as fil:
        fil.write(data)

m3u8 网址是:

https://svt1-a.akamaized.net/se/svt1/d132b755-8088-475e-91df-2c8f2de9cf6c/hls-v6/v6.m3u8

来自 m3u8 的代码:

EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:220662
#EXTINF:3.20000,
#EXT-X-KEY:METHOD=AES-128,URI="../key-d132b755-8088-475e-91df-2c8f2de9cf6c.ts"
v6-220662.ts
#EXTINF:3.20000,
v6-220663.ts
#EXTINF:3.20000,
v6-220664.ts
#EXTINF:3.20000,
v6-220665.ts
#EXTINF:3.20000,
v6-220666.ts
#EXTINF:3.20000,
v6-220667.ts
#EXTINF:3.20000,
v6-220668.ts
#EXTINF:3.20000,
v6-220669.ts
#EXTINF:3.20000,
v6-220670.ts
#EXTINF:3.20000,
v6-220671.ts

钥匙串:

'PB{\xf1\xb9\xf9.\xb7\x1d\xeb\x95\x8f=\xcd\x93\xce'

【问题讨论】:

  • 尝试访问给定的 URL 以 Access Denied 结尾
  • @Skandix 我现在已经用 m3u8 中的一些代码编辑了这个问题。这是一个地理区块。如果您使用一些瑞典代理或 vpn,您可以连接
  • 您不能使用随机 IV 解密文件,您必须使用用于加密文件的相同 IV。通常,加密 IV 会预先添加到密码中。我不知道这里使用的是什么格式,你必须提供一些额外的信息。
  • @JamesKPolk 好吗?我已经从密钥文件中添加了密钥

标签: python encryption aes m3u8


【解决方案1】:

我有一个完美的解决你的小问题。 你的代码很棒,但它需要一些小修复——它会很好地运行。

Python venv:

 - python3 -m venv Your-Python-VEnviroment-Name-env
 - cd Your-Python-VEnviroment-Name-env
 - source bin/activate
  • 按照步骤 1..5
  • 停用

步骤 01:Module-List 必须安装到 python venv 中:

 - python3 -m pip install m3u8
 - python3 -m pip install requests
 - python3 -m pip install pycryptodome

步骤02:创建文件GetSegments.py 步骤 03:使用以下代码框填写它

进口清单:

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

设置一个自己的 RequestsClient 来让 https 工作。

class MyOwnReqClient():
    def download(self, uri, timeout=None, headers={}, verify_ssl=True):
        result = requests.get(uri, timeout=timeout, headers=headers)
        return result.text, result.url

使用您自己的 RequestsClient.Class 正确设置 m3u8.load。

#Other headers should you look at F12 ;-)
headers = {'host':'Your-Data-Here', 'User-Agent':'Your-Browser-User-Agent-Here-VERY-IMPORTANT'}
url = 'https://YOUR.URL.M3U8.Encrypted-ts-segments.HERE'
m3u = m3u8.load(url, http_client=MyOwnReqClient(), headers=headers)

正确设置关键变量。

key_url = m3u.keys[0].absolute_uri
key = []
for chunk in req.get(url=key_url,stream=True,headers=headers,method="get"):
    key.append(chunk)

为加密设置正确的 IV。

lines = str(m3u.segments[0]).split('\n')
IV = lines[0].split("IV=")[1]
#convert into bytes and remove the first 2 chars
IV = bytes.fromhex(IV.replace("0x",""))

初始化加密。

cipher = AES.new(key[0], AES.MODE_CBC, IV=IV)

至少你必须改变你的数据存储例程。

#Get each segment of m3u8-file        
for single_segment in m3u.segments:
    #Get correct URL for ts-file
    download_url = single_segment.absolute_uri

    #Counter 1..n
    num = 1

    #Write bytes into a file
    with open('Filename.part' + str(num) + '.ts', 'wb') as seg_ts:
        #Get all chunks of current part-file
        for chunk in requests.request(url=download_url, stream=True, headers=headers, method="get"):
            #decrypt it and write it into the file
            seg_ts.write(cipher.decrypt(chunk))

        #Counter increase for the next part number
        num += 1

步骤 04:保存文件并尝试。

步骤05:python3 GetSegments.py

我希望它可以帮助您和其他所有人。 如果 python 脚本没有完成并且工作正常,我无法入睡。

我希望我没有写错错字... ;-)

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2016-07-27
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多