python实战:分析网站的m3u8文件下载ts文件并解密

简介: python实战:分析网站的m3u8文件下载ts文件并解密

前言

这个文章默认读者已了解m3u8的相关知识,包括如何在浏览器中查找m3u8文件的url和ts文件的下载地址;

代码实战

使用到的模块有:

os,requests, re,Crypto

主要模块Crypto在安装时执行命令如下:

pip install pycryptodome

实现逻辑:

  • 在浏览器里找到m3u8文件的额url
  • 解析m3u8文件,获取ts下载地址和解密所需的key

    在m3u8文件中,key所在的行一般以EXT-X-KEY标识,记录加密方法METHOD和key,iv等信息;IV值一般不需要;
  • 获取的ts是多个,需要单个下载,并解密

    根据获取的ts下载地址直接下载下来的文件,如果无法播放,那基本上就是加密了;需要通过获取的key来解密;
  • 下载的文件命名需要有规律,方便后续合成的需求;

实现代码如下:


'''
目标网站: 
根据m3u8文件下载ts并解密

'''

import os,requests,re
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

dest_folder = 'F:\kecom'

def d_ts_decrypt(key_url,ts_urls,folder='1'):
    '''
    下载ts并解密存储
    '''
    #先创建文件夹
    ts_dir = os.path.join(dest_folder,folder)
    if not os.path.exists(ts_dir):
        os.makedirs(ts_dir)

    key = requests.get(key_url).content   # 请求 key
    cryptor = AES.new(key, AES.MODE_CBC)    # 创建一个解密器
    start = 0
    for ts_url in ts_urls:
        start = start + 1
        print(ts_url)
        content = requests.get(ts_url).content #获取ts
        decrypt_content = cryptor.decrypt(content) #解密
        # 写入文件
        ts_file = os.path.join(ts_dir,str(start).zfill(4) + '.ts')
        with open(ts_file,'ab') as f:
            f.write(decrypt_content) 



#处理m3u8文件地址,解析出key和ts_url
def deal(m3u8_file_url,index='0'):
    
    mf_text = requests.get(m3u8_file_url).text
    #print(mf_text)
    ts = mf_text.split("\n")
    for l in ts:
        if 'URI' in l:
            keyUrl = re.findall(r'URI=".*?"',l)[0]
            break
    
    origin_url = m3u8_file_url[0:m3u8_file_url.index('voddrm')]
    #获取完整的url
    keyUrl = keyUrl.replace('URI=','').replace('"','')
    #print(keyUrl)
    ts_lines = [origin_url + line.replace('\n','')   for line in ts if 'start=' in line]
    #print(len(ts_lines),ts_lines[0])
    d_ts_decrypt(key_url=keyUrl,ts_urls=ts_lines,folder = index)
    #return keyUrl,ts_lines

m3u8_files = [
J2h0dHBzOi8vMTI1ODcxMjE2Ny52b2QyLm15cWNsb3VkLmNvbS8yNTEyMWE2YXZvZHRyYW5zYmoxMjU4NzEyMTY3L2U4ZWE1MDA5Mzg3NzAyMzA2NDkzMTIwMDY3L2RybS92b2Rkcm0udG9rZW4uZFdsdVBURTBOREV4TlRNM09UTXpNRFl4TlRjM09UdGxlSFE5TWpGaVpHRTRZamhsWlRSaU9EazNaalE0TnpOaU5XRmpZbVUwTldNd01qTXpaV1UyTlRJNVpqa3dObUl5T1dZelpUTTNaakUxTkRnMlltVTJNRFF6TVRKalptRTBOemxpT1RVM09UazBORFV4WldWaU0yUTJPV1UzTVRneVlqWXlOR0l3Wm1Sa05XWTVaR1k1WkdVeU0yWmpaVGhoTlRBeFpHVTJNbUZrTXpSalpqRTFNVEJrTWpFellqRTJNMlpoTzNWcFpGOTBlWEJsUFRJN2RXbGtYMjl5YVdkcGJsOTFhV1JmZEhsd1pUMHlPM1ZwWkY5dmNtbG5hVzVmWVhWMGFGOTBlWEJsUFRJN2RXbGtYMkZ3Y0dsa1BURTBNREF3TURBd01EZzdZMmxrUFRVNE9USTJPRGs3ZEdWeWJWOXBaRDB4TURZeE1EazVOekU3ZG05a1gzUjVjR1U5TUR0d2JHRjBabTl5YlQwei52LmYzMDc0Mi5tM3U4P2V4cGVyPTAmc2lnbj00MjA1NGZmMTk5MzliYzE1ZDEzNTY2NDYyZDg2MzNmMiZ0PTY0MkJDQjdEJnVzPTYxNTE3Mzg0OTMyNjIyNjI0MDEnLA
]

i = 0
for mf in m3u8_files:
    ''''''
    i = i + 1
    deal(mf,str(i))
    #break

上面代码下载的文件,应该可以播放了;但是文件很碎,如果需要合成,建议使用ffmpeg命令;

首先需要将所有文件索引放到一个文件中;
通过以下批处理命令实现:

(for %i in ( *.ts ) do @echo file '%i') > list.txt

通过FFMPEG的合并视频的命令生成一个完整的视频;

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
相关文章
|
19天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
27天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
77 6
|
18天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
20天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
53 4
|
19天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
26 1
|
20天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
34 1
|
21天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
23天前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
24 2
|
23天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
38 1
|
23天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
38 1