声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!
==此案例比较适合新手学习JS逆向==
本文出自微信公众号【Python三剑客】
作者:阿K
阅读时长:5min
留言:
文章输出我一直贯彻着即拿即用的方式为大家提高工作效率,持续涨薪。
没有精美的文案,没有动情可爱的故事情节,不想随波逐流,暂时只想努力输出好的文章,如果对大家有帮助希望大家能够点赞、收藏、分享一键三连!在此感谢各位读者!
目标(科)上(学)网 : https://www.pinterest.co.uk/pin/350788258477414986/
官方解释
M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。
通俗点可以理解为,一个视频文件拆分为多个.ts片段的视频文件,然后将所有的ts合成MP4文件就可以播放了。但是为什么有些在线或者m3u8的播放器会用不了呢?由于大部门的m3u8生成的结果不太一致,与该播放器的解密格式不一样,所以导致打开
。
用专门的m3u8播放器或浏览器插件
用winrar压缩软件合成
【前置条件】
那么最理想的是什么?
把下载后的视频用字节流的方式合成一个完整的mp4文件
市面上常见的加密方案是把m3u8的响应结果用AES、DES加密,混淆大家的视线,提高数据的安全度、可靠度。
抓包找到对应的m3u8文件
请求获取相应后的m3u8文件
处理对应的ts链接,并下载
将下载后的ts文件以字节流方式合成MP4文件
对头了文件都在里面
xxx.ts 替换 xxx.m3u8后缀
成败在此一举了
即拿即用(需要注意【科】上【学】网)
import re
import requests, os
project_path = os.path.abspath(os.path.dirname(__file__))
video_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'video'))
class VideoSynthesis:
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
self.m3u8_link = 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w.m3u8'
self.base_url = 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/'
def get_m3u8_link(self):
# 下载m3u8视频
m3u8_response = requests.get(url=self.m3u8_link, headers=self.header, verify=False)
print(m3u8_response.text)
return m3u8_response
def handle_m3u8_response(self, m3u8_response):
# 处理m3u8响应
ts_filename = re.findall('.*?EXTINF:.*?,\n(.*?)\n', m3u8_response.replace(' ', '').replace(r'\n', ''))
print(f'tslist: {ts_filename}')
ts_link_list = []
for item in ts_filename:
result_url = self.base_url + item
ts_link_list.append(result_url)
print(f'ts_link_list: {ts_link_list}')
return ts_link_list, ts_filename
def download_ts_video(self, ts_url_list, ts_filename):
# 通过ts链接下载ts文件
for i in range(len(ts_url_list)):
ts_url = ts_url_list[i]
ts_name = ts_filename[i]
try:
response = requests.get(ts_url, stream=True, verify=False)
except Exception as e:
print("异常请求:%s" % e.args)
return
# 在当前目录下创建个video文件夹
ts_path = project_path + r"\video\{}".format(ts_name)
with open(ts_path, "wb+") as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
print("TS文件下载完毕!!")
def heBingTsVideo(self):
# 视频合成
hebing_path = video_path + r"\m3u8_video.mp4"
print(hebing_path)
all_ts = os.listdir(video_path)
with open(hebing_path, 'wb+') as f:
for i in range(len(all_ts)):
ts_video_path = os.path.join(video_path, all_ts[i])
f.write(open(ts_video_path, 'rb').read())
print("合并完成!!")
def run(self):
m3u8_response = self.get_m3u8_link()
ts_link_list, ts_filename = self.handle_m3u8_response(m3u8_response)
# ts_link_list = ['https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00000.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00001.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00002.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00003.ts']
# ts_filename = ['493e6bb3f832caf2bef872d648698ff4_hls480w00000.ts', '493e6bb3f832caf2bef872d648698ff4_hls480w00001.ts' ,'493e6bb3f832caf2bef872d648698ff4_hls480w00002.ts', '493e6bb3f832caf2bef872d648698ff4_hls480w00003.ts']
self.download_ts_video(ts_link_list, ts_filename)
self.heBingTsVideo()
if __name__ == '__main__':
video_synthesis = VideoSynthesis()
video_synthesis.run()