wangbingbing 发表于 2020-5-21 17:04

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



wangbingbing 发表于 2020-5-21 17:40

AnonymousHacker 发表于 2020-5-21 17:31
想问下咋用啊,在Termux上执行报错呢?

emmm,需要搭建环境,安装几个第三方的包。有时间我做成拿来即用的工具吧。

爱你52 发表于 2020-7-26 20:36

#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,

有加密的下载不了

BBoy蓝牙 发表于 2020-5-21 17:20

可以啊!!

Bravesoul 发表于 2020-5-21 17:30

这个不错

AnonymousHacker 发表于 2020-5-21 17:31

想问下咋用啊,在Termux上执行报错呢?

fly5cc 发表于 2020-5-21 17:47

可以用来下载钉钉直播回放的饰品,好东西,希望能搞个小程序出来

hj170520 发表于 2020-5-21 18:13

感谢分享{:301_1001:}

来看看啊 发表于 2020-5-21 18:15

没看懂!!!

l3210199 发表于 2020-5-21 18:18

大哥给做个成品吧 或者出个使用方法正好我要下钉钉课

sq127135 发表于 2020-5-21 18:20

等现成工具吧,呵呵,谢谢!
页: [1] 2 3 4
查看完整版本: m3u8 视频下载