軟件和源碼
之前寫過一片文章: 關于突破咪咕視頻付費限制的研究, 但是后來我發現評論說已經不能用了,我知道肯定是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×tamp=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×tamp=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×tamp=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這種寫法,所以想用這種寫法練練手。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态