天天看點

python爬取喜馬拉雅音頻,json參數解析

作者:繁漪

一.抓包分析json,擷取加密方式

1.抓包擷取音頻界面

f12打開抓包工具,播放一個(非vip)視訊,點選“媒體”

python爬取喜馬拉雅音頻,json參數解析

單擊打開

python爬取喜馬拉雅音頻,json參數解析

可以複制URL,發現就是我們要的音頻。

複制“CKwRIJEEXn-cABa0TgCj-ek6”,搜尋,可以找到連結的來源

python爬取喜馬拉雅音頻,json參數解析

python爬取喜馬拉雅音頻,json參數解析

2.找到json檔案,分析加密

python爬取喜馬拉雅音頻,json參數解析

複制“/revision/play/v1/audio”,搜尋,找到我們需要的json檔案(找不到的話就重新整理浏覽器)

python爬取喜馬拉雅音頻,json參數解析

将json檔案在‘源代碼’裡打開,發現"xm-sign": z.getSign() 可能是加密的方式

python爬取喜馬拉雅音頻,json參數解析

點選播放另一視訊進入調試,點選getSign()函數,得

python爬取喜馬拉雅音頻,json參數解析

python爬取喜馬拉雅音頻,json參數解析

打上斷點運作

python爬取喜馬拉雅音頻,json參數解析

經過斷點運作分析 (運用單步運作進行分析):

t 始終為 himalaya-

n,e 為伺服器時間戳, 通過 https://www.ximalaya.com/revision/time 可得

r 為 目前時間的時間戳

l(100)為100以内的随機數

此時我們可以得知參數被加密後的格式為

{himalaya-伺服器時間戳} +(100以内随機數)+伺服器時間戳 +(100以内随機數)+目前時間戳

​但是!!!!

注意還有下述操作,滑鼠放在a(e)上,出現白框,點選連結,如下:

python爬取喜馬拉雅音頻,json參數解析

python爬取喜馬拉雅音頻,json參數解析

a(e)函數

在6660行打斷點運作(合理使用‘運作’和‘單步運作’)

python爬取喜馬拉雅音頻,json參數解析

可以看出輸入為 {himalaya-伺服器時間戳},繼續運作看看輸出為啥

python爬取喜馬拉雅音頻,json參數解析

傳回"02d95bb6140a4626c9d447f2d3385e61",是32位數字,合理猜測是md5算法,找個md5線上轉換器驗證一手

python爬取喜馬拉雅音頻,json參數解析

是以,a函數就是md5算法

繼續運作,看看最終傳回給xm-sign的是啥

python爬取喜馬拉雅音頻,json參數解析

故可以得出結論, 參數被加密後的格式(最終版本)為:

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)           

三.總結

本文主要介紹的爬取喜馬拉雅過程中的參數解析,爬取音頻較為簡單,隻爬取一個音頻,之後可以替換音頻位址或者爬取多個音頻,可以使用異步的方法高效率爬取更多的音頻。沖!!!