1. 前言
玩即刻看到喜欢的视频不能下载, 即使收藏也可能因为一些原因找不着, 心累啊
但作为一个ITer, 不会轻易被眼前的困难打倒, 有现成的就拿来用, 没有的话就自己造
2. 分析过程
手机抓包比较麻烦, 所以直接使用网页版登录
F12源码查看, 发现html标签中并没有url链接, 但是播放时, 会出现一堆xxxx.ts
请求, 那么这些请求哪来的呢
往上查找, 有一个xxxx.m3u8
的请求, 其响应的内容恰好包括.ts
请求的地址
参考https://www.jianshu.com/p/e97f6555a070, 大致了解了一下M3U8格式
于是接下来的重点是解析m3u8请求的响应内容
还好即刻内的m3u8没有加密链接, 只需要拼接即可
3. 效果图
Peek 2019-04-20 14-42.gif4. 源码
import PySimpleGUI as sg
import requests
import os
import uuid
def getMV(url):
if url.endswith('/'):
url = url[:-1]
baseUrl = url.rsplit('/', 1)[0]
resp = requests.get(url)
lines = resp.text.split('\n')
if not lines or lines[0] != '#EXTM3U':
return
filename = '{}.mp4'.format(uuid.uuid1())
if os.path.exists(filename):
os.remove(filename)
with open(file=filename, mode='wb+') as fp:
for line in lines:
if line.endswith('.ts'):
seg = baseUrl + '/' + line
resp = requests.get(seg)
if resp.status_code == 200:
fp.write(resp.content)
layout = [
[sg.Text('Input m3u8 urls here:')],
[sg.Multiline('', key='url', size=(80, 10))],
[sg.ProgressBar(100, size=(30, 20), key='progbar'), sg.Text('Downloading ...', key='mark')],
[sg.Submit(), sg.Cancel()],
]
window = sg.Window('Download m3u8').Layout(layout)
while True:
event, values = window.Read()
if event is None or event == 'Cancel':
break
urls = values['url'].split('\n')
count = len(urls)
if count == 0:
window.FindElement('mark').Update('No url found')
continue
base = 100 / count
for i in range(count):
url = urls[i].strip()
if url:
getMV(url=url)
window.FindElement('progbar').UpdateBar(base * (i + 1))
window.FindElement('mark').Update('Done')
window.Close()
网友评论