一.抓包分析json,擷取加密方式
1.抓包擷取音頻界面
f12打開抓包工具,播放一個(非vip)視訊,點選“媒體”
單擊打開
可以複制URL,發現就是我們要的音頻。
複制“CKwRIJEEXn-cABa0TgCj-ek6”,搜尋,可以找到連結的來源
2.找到json檔案,分析加密
複制“/revision/play/v1/audio”,搜尋,找到我們需要的json檔案(找不到的話就重新整理浏覽器)
将json檔案在‘源代碼’裡打開,發現"xm-sign": z.getSign() 可能是加密的方式
點選播放另一視訊進入調試,點選getSign()函數,得
打上斷點運作
經過斷點運作分析 (運用單步運作進行分析):
t 始終為 himalaya-
n,e 為伺服器時間戳, 通過 https://www.ximalaya.com/revision/time 可得
r 為 目前時間的時間戳
l(100)為100以内的随機數
此時我們可以得知參數被加密後的格式為
{himalaya-伺服器時間戳} +(100以内随機數)+伺服器時間戳 +(100以内随機數)+目前時間戳
但是!!!!
注意還有下述操作,滑鼠放在a(e)上,出現白框,點選連結,如下:
a(e)函數
在6660行打斷點運作(合理使用‘運作’和‘單步運作’)
可以看出輸入為 {himalaya-伺服器時間戳},繼續運作看看輸出為啥
傳回"02d95bb6140a4626c9d447f2d3385e61",是32位數字,合理猜測是md5算法,找個md5線上轉換器驗證一手
是以,a函數就是md5算法
繼續運作,看看最終傳回給xm-sign的是啥
故可以得出結論, 參數被加密後的格式(最終版本)為:
himalaya-伺服器時間戳經過md5加密 +(100以内随機數)+伺服器時間戳 +(100以内随機數)+目前時間戳
二.python代碼實作
import requests
import json
import time
import random
import hashlib
url = 'https://www.ximalaya.com/revision/play/v1/audio?id=48241057&ptype=1'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
#伺服器時間戳
severtime = requests.get('https://www.ximalaya.com/revision/time',headers=headers).text
#現在時間戳
nowtime = str(round(time.time()*1000)) #round()傳回保留幾位小數的值,預設為整數 //time.time()傳回目前時間的時間戳//time.time()得10位數,目前時間戳為13位數
#求加密的參數
xm_sign = str(hashlib.md5('himalaya-{}'.format(severtime).encode()).hexdigest()) + '({})'.format(round(random.random()*100)) + severtime + '({})'.format(round(random.random()*100)) + nowtime
#print(xm_sign)
#更新請求頭參數
headers['xm-sign'] = xm_sign
#提取及解析音頻網址
resp = requests.get(url,headers=headers)
src_dic = json.loads(resp.text)
src = src_dic['data']['src']
#下載下傳音頻
with open(f'./video/1.m4a',mode='wb') as f:
f.write(requests.get(src,headers=headers).content)
三.總結
本文主要介紹的爬取喜馬拉雅過程中的參數解析,爬取音頻較為簡單,隻爬取一個音頻,之後可以替換音頻位址或者爬取多個音頻,可以使用異步的方法高效率爬取更多的音頻。沖!!!