sscanf int 取地址_斗鱼直播间真实rtmp地址获取(含工具类下载)

背景图片斗鱼直播间比赛截图

最近在看英雄联盟比赛的时候,就在思考如何取直播的真实rtmp播放地址,放到类似于(potplayer播放器)中,或者自己也可以写一个app来玩一下,所以便有了本篇的内容。

1:工具类下载

搜索关键字:"斗鱼直播间真实rtmp地址获取"下载工具

链接: https://pan.baidu.com/s/1lU3PVi3YRiYioFECy7bvog 提取码: snbz

下载下来是一个可执行的exe文件

f72027c2872c01655ca639f74e284490.png

鼠标双击即可运行,然后输入房间号(房间号通常为1~7位纯数字,浏览器地址栏中看到的房间号不一定是真实rid),如。

2041347bd44e0c1b6c62d4e9634bf7f9.png

可以看到直播间地址为:http://tx2play1.douyucdn.cn/live/3857053rcp0Jiusv.flv?uuid=

说明:

后面内容的是python实现的具体方法,如果是仅需要一个可用工具的,那么到这里就结束了,后面不必再阅读

2:python获取斗鱼直播间真实rtmp地址

之前一篇文章介绍过《最经典的Python爬虫(图片)案例》,我们从各大网站爬取了大量的图片,其实后来一想爬取视频其实用python是很容实现的

但为了快速实现,避免重复造轮子,我在网上查了一下,找到bilibili的视频教学文章:如下

【python爬虫】斗鱼直播间真实地址rtmp爬取 代码下载链接: https:// pan.baidu.com/s/1Wmc5OS qGHnCw9u75FkGdrA 提取码: yj44

说明:在运行该模块的时候需要保证python有以下模块( requests,bs4 ,BeautifulSoup,re正则,json, execjs,time),你可以使用pip install 升级安装,因为我的是新电脑,当前我安装的pip最新版本为:

f59b92bcd7d19397fcdce6eebd5f3017.png

最后在终端下输入:python .py1.py,运行程序结果如下:

d721e79d8ee4c3a43edb94328b2fd399.png

可以看到成功获取到了斗鱼直播的分类信息,但是却拿不到rtmp地址,我看了一下视频的发布日期: 2020-05-06 22:11:10,时间不久,可能是斗鱼升级了的原因导致,但也给了我思路,那只能自己来实现了,下面简单说一下实现:

其实代码很少,关键点就这些:

1.url = ' https:// playweb.douyucdn.cn/lap i/live/hlsH5Preview/ ' + self.rid
2.url = ' https:// m.douyu.com/api/room/ra testream '
3.return " http:// tx2play1.douyucdn.cn/li ve/ {}.flv?uuid=".format(key)

首先打开斗鱼官网,F12进入到调试模式,

53210f77b8ef7108b992b28c49013a25.png

通过抓包我们能找到一些数据,如关键请求接口

a0a51e5783f8ea91d34b19dd2baa1c15.png

通过这个接口我们可以查看到 xTraceWhiteList的一个Response,大概根据意思,好像是接口白名单,

0da8e588f2a6b9b27bb3cd69e8119ebd.png

如图中黑色标记出来,那么它的值就是: http://m.douyu.com/api/room/ratestream

而这个正是我们需要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())

修改以后再次运行可以成功拿到直播间地址

c338d0b11631e22a5b0f862194a47f1b.png

然后就可以用播放器(电脑的pc,android,ios)打开,后面我会单独在Android专栏中更新android直播的解决方案,会关联到本篇内容,敬请期待

说明:未来斗鱼升级可能会同样导致本代码不可用,(本文发布日期为:2020-09-05)这点请知;关于如何在各个接口和控制台中寻找一些关键的点,也需要一定的技术积累,具体可以自行百度参考,或者系统的学习python相关知识,本篇内容仅共学习参考.

以上内容便是,斗鱼直播间真实rtmp地址获取(含工具类下载)全部内容

请尊重劳动成果,注意文中版权声明人工智能专栏不定时更新,欢迎点击关注我知乎。也可以同时关注Android专栏文艺语录专栏,本内容作者sunst,技术上有问题请沟通qyddai@gmail.com

作者:sunst 发布日期:2020-09-05 21:11 修改日期:2020-09-08 15:19
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值