记一次回放下载

提取企业微信直播回放中的视频

背景:行里希姐做了一次在线直播,如果没有赶上直播的话,虽然后面可以看回放但不知道什么时候回放功能就停掉了。所以还是把视频下载下来落袋为安。

思路:抓包,从里面提取视频地址进行下载。

步骤:

一、在手机上安装抓包工具(HTTP Catcher),开启后它会建立VPN通道,从中对流量包进行抓取。

二、手机访问回放功能,开始播放视频。

三、播放一段时间后进入HTTP Catcher,查看抓取记录。

  1. 记录中发现在建立连接后,首先从服务器获取了m3u8的播放列表。
  2. 主机名:125xxxx.vod2.myqcloud.com

四、发现后端端口对Get的远程主机是没有限制的。即Access-Control-Allow-Origin为*。说明我们可在本地get获取。

五、预览该m3u8文件,从中发现整个回放视频是被分割成多个ts文件。那么我们需要获取这些ts文件的完整地址。

因此,需要把该m3u8文件下至本地,使用Python拼接字符串,获取每一个ts地址。再用urlib进行下载。

#!/usr/bin/env python
# coding=utf-8
import re
import os
import urllib.request

def get_each_uris(base_url):
    # reading playlist
    swap = open('swap', 'w', encoding='UTF-8')
    with open('playlist_eof.m3u8', 'r', encoding='UTF-8') as f:
        try:
            for line in f.readlines():
                g = re.search('\d*[_]\d*[_]\d*\.ts', line)
                #g = re.search('\d*[_]\d*[_]\d9\.ts', line)
                if g:
                    swap.writelines(g.group()+'\n')
        finally:
            swap.close()

    # remove duplicate lines, and get each full URIs
    lines_seen = set()
    out_file = open('out.txt', 'w', encoding='UTF-8')
    with open('swap', 'r', encoding='UTF-8') as s:
        try:
            for line in s:
                line = line.strip('\n')
                if line not in lines_seen:
                    out_file.write(base_url+line + '\n')
                    lines_seen.add(line)
                    urllib.request.urlretrieve(base_url + line, './'+line[-5:].replace('_','0'))  # _1.ts -> 01.ts
        finally:
            out_file.close()

    try:
        os.remove('swap')
    finally:
        pass

if __name__ == '__main__':
    base_url = 'http://1253731777.vod2.myqcloud.com/cd68bb45vodbj1253731777/5b9e68735285890799212385326/'
    get_each_uris(base_url)

⚠️注意:

  1. Python3中引入urllib包需要:import urllib.request
  2. 如果本地内存较小<16G 在脚本中正则需要手动修改。即
  3. #g = re.search(‘\d*[_]\d*[_]\dx\.ts’, line),dx由d0手动修改至d1\d2\…\d9

改进:

  1. 本脚本没有模拟浏览器request header
  2. 没有使用Threading并行下载
  3. 下载得到的ts视频,需要先合并成一个完整的大视频,再手动转码至mp4。
  4. 视频合并:cd到ts文件到目录,cat *.ts > all.ts。注意ts命名顺序:01.ts, 02.ts, 10.ts…. 89.ts。一定要注意顺序

ffmpeg:Mac上使用其对ts文件进行转码mp4

  1. 安装。brew install ffmpeg
  2. cd到ts文件的目录。ffmpeg -y -i all.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc all.mp4

成果:

对企业微信回放中对视频下载到了本地,并且转换成mp4格式。

如果需要压缩,Mac可使用HandBrake进行压缩🗜️。