即刻视频下载

1. 前言

玩即刻看到喜欢的视频不能下载, 即使收藏也可能因为一些原因找不着, 心累啊
但作为一个ITer, 不会轻易被眼前的困难打倒, 有现成的就拿来用, 没有的话就自己造

2. 分析过程

手机抓包比较麻烦, 所以直接使用网页版登录
F12源码查看, 发现html标签中并没有url链接, 但是播放时, 会出现一堆xxxx.ts请求, 那么这些请求哪来的呢
往上查找, 有一个xxxx.m3u8的请求, 其响应的内容恰好包括.ts请求的地址

image.png

参考https://www.jianshu.com/p/e97f6555a070, 大致了解了一下M3U8格式
于是接下来的重点是解析m3u8请求的响应内容

还好即刻内的m3u8没有加密链接, 只需要拼接即可

3. 效果图

Peek 2019-04-20 14-42.gif

4. 源码

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()

推荐阅读更多精彩内容