m3u8 视频下载
本帖最后由 wangbingbing 于 2020-5-25 09:35 编辑注释:正则表达式为初学阶段,多线程队列处于初学阶段
环境:python3 , PyCharm2020
增加一个exe工具,打开后,粘贴m3u8的地址回车就可以了,默认保存到当前目录download下
有的m3u8地址是加密的,正在研究中。。如果有大佬提供技术帮助,小白感激不尽。
只用于技术交流吧,OK资源网的目前都可以,别的网站的佛系{:1_907:}
链接: https://ww.lanzouj.com/icvvs8f
import os
import queue
import re
import threading
import urllib
import urllib.request
import random
from decimal import Decimal
from pip._vendor import requests
# 保存的 mp4 文件名
saveMp4Name="123.mp4"
# 保存本地地址
path="E:\\videodir"
if not os.path.exists(path):
os.mkdir(path)# 文件夹不存在,自动创建
# m3u8 地址
url = "https://iqiyi.cdn9-okzy.com/20200416/8987_cd3e4bfa/index.m3u8"
# 随机一个请求头,避免被干掉
my_headers = [
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
]
def getHttp(url_):
req = urllib.request.Request(url_)
req.add_header("User-Agent", randdom_header)
req.add_header("GET", url_)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
return html
randdom_header = random.choice(my_headers)
html=getHttp(url)
arr=re.findall(",\n(.*?).ts", html)
if len(arr)==0:
print(html)
print("正在解析真实地址...")
arr=html.split("\n")
for ii in arr:
if 'm3u8' in ii:
url=url.replace("index.m3u8",ii)
html2=getHttp(url)
arr = re.findall(",\n(.*?).ts", html2)
break
if len(arr)==0:
print("解析失败...")
exit()
print("共找到"+str(len(arr))+"个ts文件,开始下载...")
q=queue.Queue()# 使用队列
tmp = []
for i in arr:
q.put(i+".ts") # queue +1
tmp.append(i+".ts")
def download_ts(q):
while 1:
bai=Decimal(str(1-q.qsize()/len(arr))).quantize(Decimal('0.00'))
print("\r 进度:"+str(bai*100)+"%|100%", end="")
name = q.get()# 取出队列
newUrl = url.replace("index.m3u8", name)
r = requests.get(newUrl, None, stream=True)
# print(r.status_code) # 返回状态码
if r.status_code == 200:
open(path + '\\' + name, 'wb').write(r.content)
#print("\n"+newUrl + "————下载成功!")
else:
print("\n"+newUrl + "————下载失败!")
q.task_done()# queue -1
del r
try:
for i in range(20):# 20个线程
th=threading.Thread(target =download_ts ,args=(q,))
th.start()
except:
print ("Error: 无法启动线程")
q.join()
print('\n全部.ts下载完成,正在合并为.mp4')
os.chdir(path) # 修改当前工作目录
shell_str = '+'.join(tmp)
shell_str = 'copy /b ' + shell_str + ' ' + saveMp4Name
os.popen(shell_str).read() # 执行合并,不打印信息
# 删除ts和m3u8文件
# 如果此处控制台出现乱码,尝试 file Encodings 更改为 GBK
os.system('del /Q *.ts')
os.system('del /Q *.m3u8')
print('合并完成')
exit()
AnonymousHacker 发表于 2020-5-21 17:31
想问下咋用啊,在Termux上执行报错呢?
emmm,需要搭建环境,安装几个第三方的包。有时间我做成拿来即用的工具吧。 #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:20
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="http://127.0.0.1/hls.key"
#EXT-CUSTOM-YUNXIN:ntsversion=0,ntsprivatedata=fca627a6bd89e07823f864ff09e8bc27ef599872
#EXTINF:10.000000,
有加密的下载不了 可以啊!! 这个不错 想问下咋用啊,在Termux上执行报错呢? 可以用来下载钉钉直播回放的饰品,好东西,希望能搞个小程序出来 感谢分享{:301_1001:} 没看懂!!! 大哥给做个成品吧 或者出个使用方法正好我要下钉钉课 等现成工具吧,呵呵,谢谢!