1. 前言
时间:2020-09-29
之所以记录时间,是不清楚这个方法能坚持多久。
其实不要在意是否过时,了解一下实现实现思路其实也不错。
主要思路:
- 从
localStorage
获取m3u8
地址; - 根据
m3u8
地址下载视频片段; - 最后合并视频片段。
工具环境:Windows7
、Chrome
、Python
、FFmpeg
。
2. 获取m3u8
地址
在浏览器打开一个腾讯视频,比如:https://v.qq.com/x/cover/zrxyhghf3n8xhxl/c0015a2c0pr.html
按F12
调出控制台,选择Application -> Local Storage -> https://v.qq.com
。
找到key
为 txp-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
。