腾讯视频下载

1. 前言

时间:2020-09-29

之所以记录时间,是不清楚这个方法能坚持多久。

其实不要在意是否过时,了解一下实现实现思路其实也不错。

主要思路:

  1. localStorage获取m3u8地址;
  2. 根据m3u8地址下载视频片段;
  3. 最后合并视频片段。

工具环境:Windows7ChromePythonFFmpeg

2. 获取m3u8地址

在浏览器打开一个腾讯视频,比如:https://v.qq.com/x/cover/zrxyhghf3n8xhxl/c0015a2c0pr.html

F12调出控制台,选择Application -> Local Storage -> https://v.qq.com

找到keytxp-playtime 的键值对,把value复制下来。

打开json.cn,或者其他json代码格式化工具,把value格式化一下。然后把其中vurl字段的值复制出来。

"vurl": "https://apd-e19c84a777c8dfa2bbd059d6d6098e81.v.smtcdns.com/moviets.tc.qq.com/AxgUAcRtOW8JOGWpYJjFYCyzBlipZVlnZsUc6ncVEzXc/uwMROfz2r5zAoaQXGdGnC2df644E7D3uP8M8pmtgwsRK9nEL/q-i0deOYXXT4rILj_36CDNsb7OeQKA1ktihOdWqtn1Kmy2plJFPNin1ZdFmXyQ85DOQra-1d7rDfhVJDTVpGfNaqaqhWz5nHmuiflMH5sJ1ugUP62ixP4pIgIN3JFcHXGTXKOC90GCHU-yIe8SjDFu4SvC-OnCe97bIKYLGyF9c/p0016v94qse.321002.ts.m3u8?ver=4"

这个vurl就是m3u8地址,这是有时效性的,不知道多久,反正在第二天试了一下,是不能用的。

3. 下载片段

新建一个python文件,代码如下:

# -*- coding:utf-8 -*-
import os
import requests
import datetime


def LoadVideo(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
    }
    download_path = os.getcwd() + "\download"
    if not os.path.exists(download_path):
        os.mkdir(download_path)
    # 新建日期文件夹
    download_path = os.path.join(download_path, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))
    os.mkdir(download_path)
    # 获取第一层M3U8文件内容
    all_content = requests.get(url).text
    if "#EXTM3U" not in all_content:
        raise BaseException("非M3U8的链接")
    if "EXT-X-STREAM-INF" in all_content:  # 第一层
        file_line = all_content.split("\n")
        for line in file_line:
            if '.m3u8' in line:
                # 拼出第二层m3u8的URL
                url = url.rsplit("/", 1)[0] + "/" + line
                all_content = requests.get(url, headers=headers).text
    file_line = all_content.split("\n")
    file_index = 0
    for index, line in enumerate(file_line):  # 第二层
        if "#EXT-X-KEY" in line:  # 找解密Key
            method_pos = line.find("METHOD")
            comma_pos = line.find(",")
            method = line[method_pos:comma_pos].split('=')[1]
            uri_pos = line.find("URI")
            quotation_mark_pos = line.rfind('"')
            key_path = line[uri_pos:quotation_mark_pos].split('"')[1]
            key_url = url.rsplit("/", 1)[0] + "/" + key_path  # 拼出key解密密钥URL
            res = requests.get(key_url)
            key = res.content
        # 找ts地址并下载
        if "EXTINF" in line:
            unknow = False
            # 拼出ts片段的URL
            pd_url = url.rsplit("/", 1)[0] + "/" + file_line[index + 1]
            file_index = file_index + 1;
            res = requests.get(pd_url)
            c_fule_name = str(file_index)
            with open(os.path.join(download_path, c_fule_name + ".mp4"), 'ab') as file:
                file.write(res.content)
                file.flush()


if __name__ == '__main__':
    url = 'https://apd-e19c84a777c8dfa2bbd059d6d6098e81.v.smtcdns.com/moviets.tc.qq.com/AxgUAcRtOW8JOGWpYJjFYCyzBlipZVlnZsUc6ncVEzXc/uwMROfz2r5zAoaQXGdGnC2df644E7D3uP8M8pmtgwsRK9nEL/q-i0deOYXXT4rILj_36CDNsb7OeQKA1ktihOdWqtn1Kmy2plJFPNin1ZdFmXyQ85DOQra-1d7rDfhVJDTVpGfNaqaqhWz5nHmuiflMH5sJ1ugUP62ixP4pIgIN3JFcHXGTXKOC90GCHU-yIe8SjDFu4SvC-OnCe97bIKYLGyF9c/p0016v94qse.321002.ts.m3u8?ver=4'
    LoadVideo(url)

执行上面的python文件,会在同目录下创建download/当前时间文件夹,然后所有片段都在这里1.mp4 ~ 274.mp4

3.合并片段

在片段所在目录新建一个脚本merge.bat,代码如下:

@echo off

echo "start..."

REM dir
set "dir=%cd%"
set "ext=.mp4"
REM ext
set "str=0000000000"
set "code=(for /r "%dir%" %%i in ("*%ext%"^) do @(set "n=%str%%%~ni" ^& call echo %%n:~-10%%?%%i ^)^) ^| sort"
for /f "tokens=2 delims=?" %%a in ('%code%') do (
    echo file '%%~nxa'>> mylist.txt
)

:: Concatenate Files
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

echo "end..."

pause

运行之后,变会得到片段合并后的视频文件output.mp4


文章作者: 叶遮沉阳
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶遮沉阳 !
  目录