расшифровать сегменты .ts из m3u8 с помощью python

Почему мой код не расшифровывает сегмент 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)

URL-адрес 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'


person Nisse Karlsson    schedule 08.02.2018    source источник
comment
попытка доступа к данному URL-адресу заканчивается Access Denied   -  person Skandix    schedule 08.02.2018
comment
@Skandix Теперь я отредактировал вопрос с некоторым кодом из файла m3u8. Это геоблок. Если вы используете шведский прокси или VPN, вы можете подключиться   -  person Nisse Karlsson    schedule 08.02.2018
comment
Вы не можете расшифровать файл, используя случайный IV, вы должны использовать тот же IV, который использовался для шифрования файла. Часто шифр IV добавляется к шифру. Я понятия не имею, какой формат здесь используется, вам нужно будет предоставить дополнительную информацию.   -  person President James K. Polk    schedule 08.02.2018
comment
@JamesKPolk Хорошо? Я добавил ключ из ключевого файла   -  person Nisse Karlsson    schedule 09.02.2018


Ответы (1)


У меня есть идеальное решение для твоей маленькой проблемы. Ваш код великолепен, но ему нужно несколько небольших исправлений. Тогда он будет хорошо работать.

Производитель Python:

 - 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

Правильно установите m3u8.load с вашим собственным RequestsClient.Class.

#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 не был сделан и работал.

Надеюсь, у меня нет ошибок в написании опечаток... ;-)

person MitnickCodeHelper    schedule 20.05.2021