Помните процесс расшифровки захвата видеопакетов m3u8.
Помните процесс расшифровки захвата видеопакетов m3u8.

Сценарий: срок действия обучающего видео, купленного моей девушкой, истекает через месяц (по истечении срока загрузку невозможно просмотреть локально. Она попросила меня помочь скачать видео. Я заранее записал файл m3u8 и загрузил фрагменты видео для синтеза). это было полное видео. Я думал, что эта миссия очень простая~

Ранго, проверь информацию о приложении, она усилена (псевдоусилена)

Он усилен, а обстрелы и компиляции пока не рассматриваются.

Итак, я начал захватывать пакеты. На моем телефоне Android нет root-прав. При захвате приложения определенного класса был обнаружен прокси-сервер, и в приложении определенного класса не было сети. Я случайно обнаружил его, когда играл в реверс-инжиниринг Android.

Некоторые приложения можно поместить в контейнеры, а данные захвата пакетов запущенных приложений можно получить, захватив контейнеры. То есть установите xx в VirtualXpose, и Хуанняо захватит VirtualXpose.

VirtualXposedСвязь:Нажмите на меня

Примечание. Этот метод применим только к некоторым приложениям, а некоторые из них будут аварийно завершать работу после установки.

Скриншот части захвата пакетов:

Выше приведена захваченная информация m3u8. Согласно предыдущему шагу, файл ключа и фрагмента видео должен быть в состоянии синтезировать полное видео.

Однако при доступе к красной части ключа отображается 404. Видеофрагмент можно загрузить, но нельзя расшифровать.

Я видел блог об удалении ключа после одного доступа. Мне нужно было угадать, получил ли клиент приложения файл ключа после доступа к нему, проанализировал загруженный файл ресурсов во внешнем интерфейсе приложения и затем воспроизвел его с момента обращения к нему. , Однажды полученные мной данные перехвата пакетов уже были доступны. Здесь я посмотрел каталог кеша приложения. Там много искаженных символов, и я не знаю, где находится файл ключа, поэтому я написал все. процесс в питоне.

теперь напиши Авторизоваться->Получить информацию о пользователе иtoken->Получить все курсы->курс, курс->видеоid кодирование На сегодня всё, завтра проверю. В настоящее время я обнаружил, что ссылка на m3u8 взята с сайта.

https://api/userid/x/video_id.m3u8 Позиция x неопределенна, вам не нужно носить с собой следующее:

Реальный адрес: https://hls.videocc.net/9b52ce99c4/d/9b52ce99c4df4d856f4b770a2e8112ad_2.m3u8?did=1638152451432X1376979

Код и интерфейс будут обсуждаться завтра. Если у вас есть лучшие мнения, мнения или новые идеи относительно моего личного мнения, прокомментируйте и поделитесь вышеизложенным.

Язык кода:javascript
копировать
import requests
import json

#Crawl Library Course онлайн оплата курса видео
#Поскольку срок действия платного видео, купленного моей девушкой, истекает, я хочу скачать его и сохранить в качестве резервной копии Не торопитесь и посмотрите
def login(uuid,password):
    host = "https://new6api.kuke99.com/user/login"
    #
    params = {
        "password":password,
        "mobile":'MTU5NjkxMTA5Mjc='
    }
    header = {
        "clientType": "3",
        'version': '6.2.13',
        "Referer": "https://m.kuke99.com",
        "UUID": uuid,
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "deviceType": "V1814T",
        "osVersion": "9",
        "Content-Length": "78",
        "Host": "new6api.kuke99.com",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "okhttp/4.9.1"
    }
    cookies = {
        # "acw_tc": acw_tc

    }

    response = requests.post(host, data=params,headers=header)
    # Вы также можете напрямую заменить поле данных полем json, которое поддерживается после версии 2.4.3.
    # response  = requests.post(url, json = body, headers = headers)
    # Информация о возврате
    data_string=response.json()
    print(data_string)
    if(data_string['code']=='0'):
        print("====Вход успешен====\n")
        print("Идентификатор студента:" + data_string['data']['stu_id'])
        print("Ник пользователя:"+data_string['data']['stu_name'])
        print("Мобильный телефон пользователя:" + data_string['data']['mobile'])
        global access_token
        access_token=data_string['data']['access_token']
        print("Токен_доступа успешно депонирован"+токен_доступа)
        return access_token
    else:
        print("!!!!!Авторизоватьсянеудача!!!!!!")

def refresh(uid,accessTok):
    url = "https://new6api.kuke99.com/learning/learning_list"
    #
    params = {
        "subject_id": '0',
        "cate_id": '0'
    }
    header = {
        "accessToken": accessTok,
        "clientType": "3",
        'version': '6.2.13',
        "Referer": "https://m.kuke99.com",
        "UUID": uid,
        "Content-Type": "application/x-www-form-urlencoded",
        "deviceType": "V1814T",
        "osVersion": "9",
        "Content-Length": "22",
        "Host": "new6api.kuke99.com",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "okhttp/4.9.1"
    }
    cookies = {
        # "acw_tc": acw_tc

    }

    response = requests.post(url, data=params, headers=header)
    # Вы также можете напрямую заменить поле данных полем json, которое поддерживается после версии 2.4.3.
    # response  = requests.post(url, json = body, headers = headers)
    # Информация о возврате
    data2_string = response.json()
    # print(data2_string)
    if(data2_string['code']=='0'):
        print("====Получение списка курсов успешно===")
        for keys in data2_string['data']['general']:
            print("Название курса: "+keys['goods_title']+" Идентификатор курса: "+keys['goods_id']+" goods_type:"+keys['goods_type'])

    else:
        print("Не удалось получить список, попробуйте еще раз. Рекомендуется проверить пароль uuid правильность")

def xiangqing(g_id,g_type,access_oken,uuid):
    url = "https://new6api.kuke99.com/goods_collation/detail"
    #
    params = {
        "goods_id": g_id,
        "goods_type": g_type,
        "ac_type":''
    }
    header = {
        "accessToken": access_oken,
        "clientType": "3",
        'version': '6.2.13',
        "Referer": "https://m.kuke99.com",
        "UUID": uuid,
        "Content-Type": "application/x-www-form-urlencoded",
        "deviceType": "V1814T",
        "osVersion": "9",
        "Content-Length": "22",
        "Host": "new6api.kuke99.com",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "okhttp/4.9.1"
    }
    cookies = {
        # "acw_tc": acw_tc

    }

    response = requests.post(url, data=params, headers=header)
    # Вы также можете напрямую заменить поле данных полем json, которое поддерживается после версии 2.4.3.
    # response  = requests.post(url, json = body, headers = headers)
    # Информация о возврате
    data3_string = response.json()
    print(data3_string)
    Страница подробностей #видео

def get_m3u8(video_id,access_oken,uuid):
    host = "https://hls.videocc.net/9b52ce99c4/f/"+video_id+".m3u8?did=1638275844261X1898885"
    print(host)
    params = {

    }
    headers = {
        "accessToken": access_oken,
        "clientType": "3",
        'version': '6.2.13',
        "Referer": "https://m.kuke99.com",
        "UUID": uuid,
        "Content-Type": "application/x-www-form-urlencoded",
        "deviceType": "V1814T",
        "osVersion": "9",
        "Content-Length": "25",
        "Host": "hls.videocc.net",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "polyv-android-sdk2.15.3-20210520 Dalvik/2.1.0 (Linux; U; Android 9; V1814T Build/PKQ1.180819.001)"
    }
    cookies = {


    }

    r = requests.get(host, data=params)
    data3_string = r.json()
    print(data3_string)

def download(g_id,g_type,access_oken,uuid):
    url = "https://new6api.kuke99.com/download/node_list"
    #
    params = {
        "goods_id": g_id,
        "goods_type": g_type,
    }
    header = {
        "accessToken": access_oken,
        "clientType": "3",
        'version': '6.2.13',
        "Referer": "https://m.kuke99.com",
        "UUID": uuid,
        "Content-Type": "application/x-www-form-urlencoded",
        "deviceType": "V1814T",
        "osVersion": "9",
        "Content-Length": "25",
        "Host": "new6api.kuke99.com",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip",
        "User-Agent": "okhttp/4.9.1"
    }
    cookies = {
        # "acw_tc": acw_tc

    }

    response = requests.post(url, data=params, headers=header)
    # Вы также можете напрямую заменить поле данных полем json, которое поддерживается после версии 2.4.3.
    # response  = requests.post(url, json = body, headers = headers)
    # Информация о возврате
    data3_string = response.json()
    # print(data3_string)
    print(data3_string['code'])
    if(data3_string['code']=='0'):
        for keys in data3_string['data']:
            print("Выбранное загружаемое видео id:"+keys['video_id'])
    else:
        print("Не удалось получить информацию о загрузке")
    #видео Загрузить информацию о странице

if __name__ == '__main__':
    UUID=''#Uid идентификатора пользователя
    пароль=""#Пароль
    логин(UUID,пароль)#Авторизоватьсяпароль аккаунта для получения токена
    # print(access_token)
    обновить(UUID,access_token)#Прочитать всю информацию о купленном курсе (список обучения)
    #Пользователь вручную вводит данные
    goods_id = input("Введите идентификатор_товара:")
    print('Входное значение:' + goods_id)
    goods_type = input("goods_type:")
    print('Входное значение:' + goods_type)
    # xiangqing(goods_id,goods_type,access_token,UUID)#видео Подробнее    download(goods_id, goods_type, access_token, UUID)  # Получить список загрузок
    video_id = input("Введите video_id:")
    print('Входное значение:' + video_id)
    get_m3u8(video_id,access_token,UUID)#Получить ссылку m3u8
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose