python 直播源地址_斗鱼直播间真实rtmp地址获取(含工具类下载)
背景圖片斗魚直播間比賽截圖
最近在看英雄聯盟比賽的時候,就在思考如何取直播的真實rtmp播放地址,放到類似于(potplayer播放器)中,或者自己也可以寫一個app來玩一下,所以便有了本篇的內容。
1:工具類下載
搜索關鍵字:"斗魚直播間真實rtmp地址獲取"下載工具
下載下來是一個可執行的exe文件
鼠標雙擊即可運行,然后輸入房間號(房間號通常為1~7位純數字,瀏覽器地址欄中看到的房間號不一定是真實rid),如。
說明:后面內容的是python實現的具體方法,如果是僅需要一個可用工具的,那么到這里就結束了,后面不必再閱讀
2:python獲取斗魚直播間真實rtmp地址
之前一篇文章介紹過《最經典的Python爬蟲(圖片)案例》,我們從各大網站爬取了大量的圖片,其實后來一想爬取視頻其實用python是很容實現的
但為了快速實現,避免重復造輪子,我在網上查了一下,找到bilibili的視頻教學文章:如下
說明:在運行該模塊的時候需要保證python有以下模塊( requests,bs4 ,BeautifulSoup,re正則,json, execjs,time),你可以使用pip install 升級安裝,因為我的是新電腦,當前我安裝的pip最新版本為:
最后在終端下輸入:python .\py1.py,運行程序結果如下:
可以看到成功獲取到了斗魚直播的分類信息,但是卻拿不到rtmp地址,我看了一下視頻的發布日期: 2020-05-06 22:11:10,時間不久,可能是斗魚升級了的原因導致,但也給了我思路,那只能自己來實現了,下面簡單說一下實現:
其實代碼很少,關鍵點就這些:
首先打開斗魚官網,F12進入到調試模式,
通過抓包我們能找到一些數據,如關鍵請求接口
通過這個接口我們可以查看到 xTraceWhiteList的一個Response,大概根據意思,好像是接口白名單,
而這個正是我們需要url請求的,至于http://tx2play1.douyucdn.cn/live/{}.flv?這個拼接的url就和bilibili那個視頻里面是一樣的
完整的參數
{"error":0,"msg":"操作成功","data":{"jsonpErrorOn":"1","httpErrorResponseFilter":"請先登錄,您已關注了這個直播間","fpsPerformOn":"0","serviceErrorOn":"1","jsonpPerfomOn":"1","componentPerformOn":"1","socketErrorOn":"0","servicePerformOn":"1","performOn":"1","epicErrorOn":"1","httpThreshold":"5000","threshold.abnormal":"120000","reportLength":"10","fmpOn":"0","httpErrorOn":"1","componentErrorOn":"1","jsErrorStackFilter":"sc.58mingtian.cn,<img src="" alt="斗魚直播">,chrome-extension,$","httpPerformOn":"1","cookiePre":"acf_","socketPerformOn":"0","probability":"0.003","epicPerformOn":"1","resourceErrorOn":"1","perform":"1","dbg":"false","schemasErrorOn":"1","url":"https://mapm.douyucdn.cn/wapm/collect","pagePerformOn":"1","jsErrorOn":"1","threshold.slowPage":"2000","xTraceWhiteList":"/japi/task,/japi/carnival,m.douyu.com/api/room/ratestream,lapi/athena/,/wgapi/livenc/liveweb/","threshold.slowAjax":"500","reportTime":"5","client_code":"web"},"redirectUrl":null}
最后是完成源碼DouYu.py參考:
# 獲取斗魚直播間的真實流媒體地址,默認最高畫質。
import requests
import re
import execjs
import time
import hashlib
class DouYu:
def __init__(self, rid):
# 房間號通常為1~7位純數字,瀏覽器地址欄中看到的房間號不一定是真實rid.
self.did = '10000000000000000000000000001501'
self.t10 = str(int(time.time()))
self.t13 = str(int((time.time() * 1000)))
self.s = requests.Session()
self.res = self.s.get('https://m.douyu.com/' + str(rid)).text
result = re.search(r'rid":(\d{1,7}),"vipId', self.res)
if result:
self.rid = result.group(1)
else:
print('房間號錯誤')
@staticmethod
def md5(data):
return hashlib.md5(data.encode('utf-8')).hexdigest()
def get_pre(self):
url = 'https://playweb.douyucdn.cn/lapi/live/hlsH5Preview/' + self.rid
data = {
'rid': self.rid,
'did': self.did
}
auth = DouYu.md5(self.rid + self.t13)
headers = {
'rid': self.rid,
'time': self.t13,
'auth': auth
}
res = self.s.post(url, headers=headers, data=data).json()
error = res['error']
data = res['data']
key = ''
if data:
rtmp_live = data['rtmp_live']
key = re.search(r'(\d{1,7}[0-9a-zA-Z]+)_?\d{0,4}(/playlist|.m3u8)', rtmp_live).group(1)
return error, key
def get_js(self):
result = re.search(r'(function ub98484234.*)\s(var.*)', self.res).group()
func_ub9 = re.sub(r'eval.*;}', 'strc;}', result)
js = execjs.compile(func_ub9)
res = js.call('ub98484234')
v = re.search(r'v=(\d+)', res).group(1)
rb = DouYu.md5(self.rid + self.did + self.t10 + v)
func_sign = re.sub(r'return rt;}\);?', 'return rt;}', res)
func_sign = func_sign.replace('(function (', 'function sign(')
func_sign = func_sign.replace('CryptoJS.MD5(cb).toString()', '"' + rb + '"')
js = execjs.compile(func_sign)
params = js.call('sign', self.rid, self.did, self.t10)
params += '&ver=219032101&rid={}&rate=-1'.format(self.rid)
url = 'https://m.douyu.com/api/room/ratestream'
res = self.s.post(url, params=params).text
key = re.search(r'(\d{1,7}[0-9a-zA-Z]+)_?\d{0,4}(.m3u8|/playlist)', res).group(1)
return key
def get_real_url(self):
error, key = self.get_pre()
if error == 0:
pass
elif error == 102:
print('房間不存在')
elif error == 104:
print('房間未開播')
else:
key = self.get_js()
return "http://tx2play1.douyucdn.cn/live/{}.flv?uuid=".format(key)
if __name__ == '__main__':
r = input('[知乎Bgwan提示]請輸入斗魚直播間號:\n')
s = DouYu(r)
print(s.get_real_url())
修改以后再次運行可以成功拿到直播間地址
然后就可以用播放器(電腦的pc,android,ios)打開,后面我會單獨在Android專欄中更新android直播的解決方案,會關聯到本篇內容,敬請期待
說明:未來斗魚升級可能會同樣導致本代碼不可用,(本文發布日期為:2020-09-05)這點請知;關于如何在各個接口和控制臺中尋找一些關鍵的點,也需要一定的技術積累,具體可以自行百度參考,或者系統的學習python相關知識,本篇內容僅共學習參考.
以上內容便是,斗魚直播間真實rtmp地址獲取(含工具類下載)全部內容
請尊重勞動成果,注意文中作者:sunst 發布日期:2020-09-05 21:11 修改日期:2020-09-08 15:19
總結
以上是生活随笔為你收集整理的python 直播源地址_斗鱼直播间真实rtmp地址获取(含工具类下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu ssh 免密码登陆
- 下一篇: 安卓APP_ 布局(1)—— Linea