m3u8視頻解析異常如何解決,關于咪咕視頻的m3u8再次解析

 2023-12-25 阅读 26 评论 0

摘要:軟件和源碼 前言 之前寫過一片文章: 關于突破咪咕視頻付費限制的研究, 但是后來我發現評論說已經不能用了,我知道肯定是api修改了,寫這種東西就是這樣,不一定什么時候就變化了,然后就用不了了,我懶得繼續維護了,但是為啥我現

軟件和源碼

前言

之前寫過一片文章: 關于突破咪咕視頻付費限制的研究, 但是后來我發現評論說已經不能用了,我知道肯定是api修改了,寫這種東西就是這樣,不一定什么時候就變化了,然后就用不了了,我懶得繼續維護了,但是為啥我現在又發了這篇文章呢?因為我用到了我之前寫的軟件(也是想水一片文章),所以花點時間研究了一下這次更新后的api
這次我會詳細說明過程,有興趣的可以研究研究。

這次修改后除了付費的看不了,其它功能和原來的軟件功能一樣,付費的看不了可能是因為后臺加入cookie認證,因為我發現訪問是404。

接口

接口還是和之前的一樣 https://webapi.miguvideo.com/gateway/playurl/v3/play/playurl?contId=608807416&rateType=3&startPlay=true
返回:

urlInfo": {
"urlType": "tourist",
"url": "http://h5live.gslb.cmvideo.cn/migu/kailu/20200324/cctv4meihd/50/index.m3u8?msisdn=202107310205404d3783e723ed4d848d9320848e0d6def&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731020540&Channel_ID=0116_25000000-99000-100300010010001&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731020540&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgsph5&puData=30420c934501c1ee12542c78a90a8e16",
"mediaType": "12",
"usageCode": "50",
"codeRate": "75",
"mediaSize": 0,
"rateDesc": "標清 540P",
"contId": null,

訪問這個 url 發現返回的是空白,所有問題就是出在這里,正常的情況下這里應該返回一個 m3u8鏈接地址(在加入crossdomain=www參數后,不是標準m3u8串流格式,而是以文本形式返回的,我原來的軟件中加入了crossdomain=www)。
所以關鍵就是解決這個問題

m3u8視頻解析異常如何解決,用瀏覽器打開https://www.miguvideo.com/mgs/website/prd/detail.html?cid=608807416 通過 瀏覽器的 開發者工具 抓包這個url 應該為 https://gslbmgsplive.miguvideo.com/migu/kailu/20200324/cctv4meihd/51/index.m3u8?msisdn=0a4020443d8d2dc2a981f89b864a9eba&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731020939&Channel_ID=0132_10010001005&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731020939&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgspwww&puData=f9178e1694798e5c9aaf409e856cdad8&ddCalcu=8fd9ea13d78c816e5186e9940749f8aea59c&crossdomain=www
在這里插入圖片描述

我采用在其他瀏覽器打開這個 url 發現依然可以返回m3u8鏈接地址,這就說明不是 cookie 驗證,那么就應該檢查請求頭中的差距或者請求參數上的差距。

將瀏覽器抓包的這個 url 與我們通過接口獲得的 url 參數進行對比發現:我們抓包得到的 url 多了一個參數 ddCalcu, 我們需要知道這個是如何產生的:
在這里插入圖片描述

遇到這種情況,肯定選擇 pcPlayer.js, 而不選 帶 vue(vue是js的一個框架),這種邏輯不可能在框架里。 進入后格式化js(點擊左下角的**{}**),然后搜索 ddCalcu :
在這里插入圖片描述

一下子就找到了這個函數,簡單閱讀其邏輯得知 參數ddCalcu 是由其它幾個參數 經過這個算法得到的,到此問題幾乎已經解決了,剩下的就是用 python 仿寫這部分邏輯了。

python 仿寫:

from urllib import parsedef ddCalcu(url):new_url = parse.urlparse(url)para = dict(parse.parse_qsl(new_url.query))userid = para.get("userid","")timestamp = para.get("timestamp","")ProgramID = para.get("ProgramID","")Channel_ID = para.get("Channel_ID","")puData = para.get("puData","")t = userid if userid else "eeeeeeeee" r = timestamp if timestamp else "tttttttttttttt"n = ProgramID if ProgramID else "ccccccccc"a = Channel_ID if Channel_ID else "nnnnnnnnnnnnnnnn"o = puData if puData else ""if not o:return urls = list("2624")u = list(t)[int(s[0])] or "e"l = list(r)[int(s[1])] or "t"c = list(n)[int(s[2])] or "c"f = list(a)[len(a)-int(s[3])] or "n"d = list(o)h = []p = 0while p*2 < len(d):h.append(d[len(d)-p-1])if p < len(d) - p -1:h.append(o[p])if p == 1:h.append(u)if p == 2:h.append(l)if p == 3:h.append(c)if p == 4:h.append(f)p += 1v = "".join(h)return url + "&ddCalcu=" + vif __name__ == '__main__':url = "http://h5live.gslb.cmvideo.cn/migu/kailu/20200324/cctv4meihd/50/index.m3u8?msisdn=20210731022935c8b943821c7c432faed138160dd0b77f&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731022935&Channel_ID=0116_25000000-99000-100300010010001&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731022935&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgsph5&puData=4484cda45d696504453b9dc809dd5599"new_url = ddCalcu(url)print(new_url)

下載一個咪咕視頻,將從接口獲得的 url地址 付給這個 url變量, 然后執行python 腳本,返回新的url, 用postman 測試一下:

在這里插入圖片描述
發現已經可以正常返回 m3u8 url 了,問題解決, 剩下的就是將這部分邏輯整合回我原先寫的軟件里面,我就不詳細說了。

其它

python 仿寫部分:

a = Channel_ID if Channel_ID else "nnnnnnnnnnnnnnnn"

也可以這樣寫:

a = Channel_ID or "nnnnnnnnnnnnnnnn"

只不過我之前發現了 python 中有所謂的等價三元運算符的if else這種寫法,所以想用這種寫法練練手。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196478.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息