分享

Python3 通过m3u8连接获取完整媒体文件(附全网视频VIP观看方法)

 高阶渔夫 2020-09-22

全网VIP观看视频API:

https:///jx.php?url=

将自己想要看的视频URL复制黏贴在该API地址后就能观看了,但是缺点是不能将视频下载下来。

抓包分析后发现视频资源是被分段成.TS格式的文件,且所有的.TS格式文件的URL被放入了m3u8格式的文件中。

于是编写以下代码用于下载媒体文件。

【!】用前须知:需要抓包获得视频m3u8文件的URL

代码目标:

实现输入M3U8下载连接,自动下载并合并媒体文件。

以下为全部代码。

import os
import requests
headers = {
   'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) "
                 "AppleWebKit/537.36 (KHTML, like Gecko) "
                 "Chrome/72.0.3626.109 Safari/537.36",
}

def get_url_content():
   '''获取m3u8文件的内容并放入内存'''
   m3u8_target = input('输入m3u8对应URL:').strip()
   target = '/'.join(m3u8_target.split('/')[:-1])
   # print(target)
   m3u8_res = requests.get(m3u8_target,headers)
   if m3u8_res.status_code != 200:
      print('URL不能正常访问', m3u8_res.status_code)
   m3u8_content = m3u8_res.content.decode('utf8')
   return m3u8_content,target


def read_m3u8(m3u8_content):
   '''获取m3u8中的下载连接'''
   media_url_list = []
   lines_list = m3u8_content.strip().split('\r\n')
   if len(lines_list) < 3:
      lines_list = m3u8_content.strip().split('\n')
   if '#EXTM3U' not in m3u8_content:
      raise BaseException('非M3U8连接')
   for index,line in enumerate(lines_list):
      # print(index,line)
      if '#EXTINF' in line:
         media_url_list.append(lines_list[index+1])
   return media_url_list


def download_media(url_list,target,dir_path):
   '''下载媒体文件'''
   for index,url in enumerate(url_list):
      try:
         res = requests.get(url,headers)
      except requests.exceptions.MissingSchema:  #捕获不完整URL的异常
         target_url =target+'/'+url
         res = requests.get(target_url,headers)
      media_file_path = dir_path+'full_media.mp4'
      if res.status_code != 200:
         print('下载URL连接访问失败')
         break
      with open(media_file_path,'ab')as f:
         f.write(res.content)
      print('下载进度:%.1f%%' % ((index + 1) / len(url_list) * 100))
   flag = False
   if index == len(url_list) - 1:
      flag = True
   return flag


def main():
   file_name = input("输入媒体名称:")
   dir_path = mkdir(file_name)       #创建媒体名命名的文件夹
   m3u8_content,target = get_url_content()
   media_url_list = read_m3u8(m3u8_content)
   flag = download_media(media_url_list,target, dir_path) #  用于校验是否成功下载媒体文件
   if flag:
      print('媒体下载完成')
   else:
      print('媒体下载失败')
   print("*"*16)
def mkdir(path):
   path = path.strip().rstrip('\\')
   is_exists = os.path.exists(path)
   if not is_exists:      # 校验目录是否存在
      os.makedirs(path)
      print('创建媒体目录')
   else:
      print('媒体目录已经存在')
   return path+'/'
if __name__ == '__main__':
   print('''
   使用方法:
   推荐全网视频解析api:https:///jx.php?url=
   抓包获取m3u8的URL地址后复制使用
   ''')
   while True:
      main()

代码兼容了对于M3U8文件中是否包含完整URL的情况。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多