Python爬取AES加密的m3u8視頻流的小視頻並轉換成mp4

来源:https://www.cnblogs.com/123456feng/archive/2022/04/12/16131526.html
-Advertisement-
Play Games

最近發現一個視頻網站,準備去爬取得時候,前面很順利 利用fiddler抓包獲取網站的post數據loads為python字典數據,分析數據就能發現每個視頻的連接地址就在其中 發現這些都是m3u8文件流的形式並且加密的 key 最後實現代碼如下: 下載下來後用暴風音影可以播放,其他播放器要用格式工廠轉 ...


最近發現一個視頻網站,準備去爬取得時候,前面很順利

利用fiddler抓包獲取網站的post數據loads為python字典數據,分析數據就能發現每個視頻的連接地址就在其中

發現這些都是m3u8文件流的形式並且加密的

在這裡插入圖片描述

key

最後實現代碼如下:

下載下來後用暴風音影可以播放,其他播放器要用格式工廠轉換下格式,兄弟們註意身體啊!

開發環境:windows+pyCharm+python3.5.2

第三方模塊:pip3 install pycryptodome

Python學習交流Q群:906715085####
import requests
import json
import re
import os, shutil
import urllib.request, urllib.error
from Crypto.Cipher import AES       #註:python3 安裝 Crypto 是 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pycryptodome
import sys
  # from Crypto.Random import get_random_bytes
  # import Crypto.Cipher.AES
  # import binasci i
  # from binascii import b2a_hex, a2b_hex
  # import gevent   #協程
  # from gevent import monkey; monkey.patch_all()
   
   def aes_decode(data, key):   
    """AES解密   
 :param key:  密鑰(16.32)一般16的倍數    
 :param data:  要解密的數據    
 :return:  處理好的數據   
  """   
cryptor = AES.new(key,AES.MODE_CBC,key)    
plain_text = cryptor.decrypt(data)    
return plain_text.rstrip(b'\0')   #.decode("utf-8")
  
def getUrlData(url,DOWNLOAD_PATH):   
 """打開並讀取網頁內容index.m3u8    
 :param url: 包含ts文件流的m3u8連接   
  :return:  包含TS鏈接的文件    
  """    
  try:        
  urlData = urllib.request.urlopen(url, timeout=20)  # .read().decode('utf-8', 'ignore')        
  return urlData    
  except Exception as err:        
  error_log = os.path.join(DOWNLOAD_PATH,'error.log')        
  with open(error_log,'a+') as f:            
  f.write('下載出錯 (%s)\n'%url,err,"\r\n")        
  print('下載出錯 (%s)\n'%url,err)        
  return -1  
  def getDown_reqursts(url,file_path,key):   
   """  
   下載ts視頻流    
   :param url: ts流鏈接    
   :param file_path: 臨時文件路徑    
   :param key: 加密密鑰   
    """    
    try:       
 response = requests.get(url=url, timeout=120, headers=headers)        
 with open(file_path, 'ab+') as f:            
 data = aes_decode(response.content,key)            
 f.write(data)    
 except Exception as e:        
 print(e)  
 def getVideo_requests(url_m3u8,video_Name,key,DOWNLOAD_PATH):    
 """  根據m3u8文件提取出    
 :param url_m3u8: 包含ts文件流的m3u8連接    
 :param video_Name: 下載的視頻名稱地址    
 :param key: 加密密鑰   
  """    
  print('>>> 開始下載 !\n')    
  urlData = getUrlData(url_m3u8,DOWNLOAD_PATH)    
  tempName_video = os.path.join(DOWNLOAD_PATH,'%s.ts'%video_Name)  # 創建臨時文件    
  open(tempName_video, "wb").close()  # 清空(順帶創建)tempName_video文件,防止中途停止,繼續下載重覆寫入    
  for line in urlData:        
  # 解碼decode("utf-8"),由於是直接使用了所抓取的鏈接內容,所以需要按行解碼,如果提前解碼則不能使用直接進行for迴圈,會報錯        
  url_ts = str(line.decode("utf-8")).strip()  # 重要:strip(),用來清除字元串前後存在的空格符和換行符        
  if not '.ts' in url_ts:            
  continue       
   else:           
if not url_ts.startswith('http'):  # 判斷字元串是否以'http'開頭,如果不是則說明url鏈接不完整,需要拼接                
#拼接ts流視頻的url                
url_ts = url_m3u8.replace(url_m3u8.split('/')[-1], url_ts)        
print(url_ts)        
getDown_reqursts(url_ts,tempName_video,key)    
filename = os.path.join(DOWNLOAD_PATH, '%s.mp4'%video_Name)    
shutil.move(tempName_video, filename)  #轉成MP4文件    
print('>>> %s.mp4 下載完成! '%video_Name) 

 def run(ret,start_url,DOWNLOAD_PATH):   
  """    
:param page: 起始頁碼   
:param start_url: 起始url   
 """    
 # print(ret["list"][0]["detail_link"],"------------",ret["list"][0]["vod_name"])    
 for line in ret["list"]:        
 url_m3u8 = re.split(r'/',line["vod_pic"])  #取得每一個視頻的連接        
 num = url_m3u8[3]  #取唯一標識        
 url_m3u8 = 'http://rzlkq.com:8091/%s/1000kb/hls/index.m3u8'%num  #拼接視頻鏈接       
video_Name = line["vod_name"]        
 key_url = 'http://rzlkq.com:8091/%s/1000kb/hls/key.key'%num #拼接key鏈接        
 key = requests.get(url=key_url,timeout=120,headers=headers).content  #取得key 16位密鑰        getVideo_requests(url_m3u8,video_Name,key,DOWNLOAD_PATH)  
 def url_inpur():   
while True:        
try:            
aa = int(input("請輸入你要下載的分類:1.站長推薦  2.國產自拍  3.名優  4.亞洲無碼 \r\n>>>"))            
break        
except Exception as e:            
print("輸入錯誤!請輸入正確的數字選擇>>>")    
return aa  

def check_dir(download_path):    
import errno    
try:        
os.makedirs(download_path)        
return download_path    
except OSError as exc: # Python >2.5 (except OSError, exc: for Python <2.5)        
if exc.errno == errno.EEXIST and os.path.isdir(download_path):            
pass        
else: raise
if __name__ == "__main__":        
#print("載入中....")    
#os.system("pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests")    
#os.system("pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pycryptodome")    
#print("下載路徑:D盤 \r\n!!!本程式只做交流學習使用,禁止傳播!!!\r\n")      
headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 8.0.0; MIX 2S Build/OPR1.170623.032) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36",}  
      

def z01():        
DOWNLOAD_PATH = check_dir(r'D:\DownLoad\z01')  #下載目錄        
z01page =1        
while True:            
start_url = "http://qqchub.com/index.php/ajax/data.html?mid=1&page=%s&limit=8&tid=all&by=t&level=1"%z01page            response = requests.get(url=start_url,headers=headers,timeout=20)            
ret = json.loads(response.text)  #解析json數據            
if not ret["list"]: #列表為空沒有數據了就退出                
break            
z01page+=1            
run(ret,start_url,DOWNLOAD_PATH)

def z02():        
DOWNLOAD_PATH = check_dir(r'D:\DownLoad\z02')  #下載目錄        
z02page =1        
while True:            
start_url = "http://qqchub.com/index.php/ajax/data.html?mid=1&page=%s&limit=8&tid=all&by=t&level=1"%z02page            response = requests.get(url=start_url,headers=headers,timeout=20)            
ret = json.loads(response.text)  #解析json數據            
if not ret["list"]: #列表為空沒有數據了就退出                
break            
z02page+=1            
run(ret,start_url,DOWNLOAD_PATH)  

      
def z03():        
DOWNLOAD_PATH = check_dir(r'D:\DownLoad\z03')  #下載目錄        
z03page =1        
while True:            
start_url = "http://qqchub.com/index.php/ajax/data.html?mid=1&page=%s&limit=8&tid=all&by=t&level=1"%z03page            response = requests.get(url=start_url,headers=headers,timeout=20)            
ret = json.loads(response.text)  #解析json數據            
if not ret["list"]: #列表為空沒有數據了就退出                
break            
z03page+=1           
 run(ret,start_url,DOWNLOAD_PATH)  
       
 def z04():        
 DOWNLOAD_PATH = check_dir(r'D:\DownLoad\z04')  #下載目錄        
 z04page =1        
 while True:            
 start_url = "http://qqchub.com/index.php/ajax/data.html?mid=1&page=%s&limit=8&tid=all&by=t&level=1"%z04page            response = requests.get(url=start_url,headers=headers,timeout=20)            
 ret = json.loads(response.text)  #解析json數據            
 if not ret["list"]: #列表為空沒有數據了就退出                
 break            
 z04page+=1           
  run(ret,start_url,DOWNLOAD_PATH)        
  z01()    
  z02()    
  z03()    
  z04()                  
  # os.system('createobject("wscript.shell").run"cmd.exe /c shutdown -s -f -t 0"')       #Windows關機  
  from:https://www.cnblogs.com/chen0307/articles/9679139.html

 

在這裡插入圖片描述

最後
友情提醒,別把肝熬壞了,這密密麻麻的代碼就放在上面了,需要的可以自行領取。這一章到這裡就沒有了,下一章見。
在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天是充實的一天 晨讀 你敢相信從早上6點40就起床了,跑去晨讀賺了0.1學分。 一早上的軟體測試 早八的正確打開方式就是進入了超星課堂,開啟了軟體測試的課堂,學習了等價類邊界值綜合(用戶登錄的測試),由於對新知識的熟悉度不好,整個早上做了四個版本,直到最後才完成,還錯過了提交時間,一整個要炸掉了。 ...
  • fastposter v2.7.1 緊急發佈 電商海報編輯器 fastposter海報生成器,電商海報編輯器,電商海報設計器,fast快速生成海報 海報製作 海報開發。二維碼海報,圖片海報,分享海報,二維碼推廣海報,支持Java Python PHP Go JS 小程式。基於Vue 和Pillow ...
  • 相信在座各位應該沒有幾個不看小說的吧,嘿嘿~ 一般來說咱們書荒的時候怎麼辦?自然是去起某點排行榜先找到小說名字,然後再找度娘一搜,哎 ,筆趣閣就出來答案了,美滋滋~ 但是那多麻煩,咱們直接用python,直接全部下載下來慢慢看不就好了~ 小孩子才做選擇,成年人選擇都要… 好了,不啰嗦了,等下大家要罵 ...
  • google 出品的依賴註入庫 wire:https://github.com/google/wire 什麼是依賴註入 依賴註入 ,英文全名是 dependency injection,簡寫為 DI。 百科解釋: 依賴註入是指程式運行過程中,如果需要調用另一個對象協助時,無須在代碼中創建被調用者,而 ...
  • 目錄 一.簡介 二.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 OpenGL (ES) 學習路 ...
  • 前言 最近有人對自動上傳與發佈很感興趣,都私下找我說了好幾次了。今天,必須把他安排,必須實力寵粉。 “本篇依次介紹目前主流的短視頻平臺(抖音、快手、B站、小紅書、微視、百度好看視頻、西瓜視頻、微信視頻號、搜狐視 頻、一點號、大風號、趣頭條等)的短視頻自動發佈,希望幫助大家更方便、高效的來進行自媒體的 ...
  • LeetCode_141:https://leetcode-cn.com/problems/linked-list-cycle/ 給你一個鏈表的頭節點 head ,判斷鏈表中是否有環。 如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 如果鏈表中存在環 ,則返回 tr ...
  • 開門見山。 這篇文章,教大家用Python實現常用的假設檢驗! 服從什麼分佈,就用什麼區間估計方式,也就就用什麼檢驗! 比如:兩個樣本方差比服從F分佈,區間估計就採用F分佈計算臨界值(從而得出置信區間),最終採用F檢驗。 建設檢驗的基本步驟: 前言 假設檢驗用到的Python工具包 •Statsmo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...