斗鱼直播应该火了好一阵了,和每一个互联网新兴业务一样,人气激增到国家都专门为其制定管理政策了。对流行节拍有意而为之的后知后觉,让我近一两个月才关注了几个主播。女主播看脸蛋,也插科打诨来几个污段子,才美兼备的自是不多。男主播的话,就看他套路其他女主播的真人秀,或视频或夜店。
只是直播时间都太晚,看几次就觉得严重影响睡眠,能自动录播就好了。
网页里的播放器自然是用Flash开发的,P2P式的NetStream。如果找到主播房间号对应的NetStream传输地址就可以使用第三方软件去下载视频流了。虽然播放器的主程序是加密传输到本地后载入内存的,但毕竟Loader真正开始加载的时候,该解密的都解了。播放器外部代码还做了混淆,但主程序因为加密放下戒备,真Dump下来的话,可读性极高。
开源的FFDEC出现以后,SWF Decompiler和As3 Sorcerer都再没用过。直播开始后,FFDEC去Dump浏览器进程中的Flash文件,大小1.5M左右的就是解密后的播放器主程序。反编译可以看见代码本身包含调试信息,只要当前页面的URL中包含dydebug的字样,播放器就会调用浏览器的console.log输出不同阶段的中间结果,这当中就包含了NetStream流的地址,形如:
NetConnection连接状态: NetConnection.Connect.Success Param.RtmpUrl =http://hdl3.douyucdn.cn/live Param.LiveID=602624rWYVytrxHL_550.flv?wsAuth=00f153fe25aa13a9e735f72774ae495a&token=web-0-602624-bb8f0c410da443bc88baa2c53e8d76c0&logo=0&expire=0
组合RtmpUrl和LiveID就得到了视频地址,直接粘贴到浏览器地址栏就下载视频到本地了。
正好新装了Visual Studio 2015,就写了个下载地址解析的工具,距离上一次使用C#写点什么已经四五年了。Anyway,webBrowser控件很方便,可以自动调用IE引擎打开附加dydebug的直播地址。由于console是浏览器自定义的调试模块,webBrowser作为一个控件需要自行实现一个console供Flash调用。其实也就是在页面加载完毕后,添加一段javascript,声明一个window.console.log,内部调用external.log就能传递消息调试信息给C#代码了。
解析程序是Windows 10的VS2015编译的,其他系统可能要安装.net运行时才能正常运行。输入房间号后,视网络状况,一分钟内可以解析出直播地址并放入剪贴板。
斗鱼直播地址解析程序下载:douyu
更多实现细节可参考主窗口的代码,为了运行清爽,webBrowser控件会隐藏,视频页面加载时会静音。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; namespace douyu { [System.Runtime.InteropServices.ComVisible(true)] public partial class Form1 : Form { [System.Runtime.InteropServices.DllImport("winmm.dll")] public static extern int waveOutGetVolume(IntPtr h, out uint dwVolume); [System.Runtime.InteropServices.DllImport("winmm.dll")] public static extern int waveOutSetVolume(IntPtr h, uint dwVolume); public Form1() { InitializeComponent(); browser.ObjectForScripting = this; } public void log(String msg) { if(msg.Contains("NetConnection.Connect.Success")) { Match res = Regex.Match(msg, "RtmpUrl =(.+?) "); String rtmpurl = res.Groups[1].Value; res = Regex.Match(msg, "LiveID=(.+)"); String liveid = res.Groups[1].Value; String url_address = rtmpurl + "/" + liveid; /* considering the relocation (Thanks to lipinghao) */ HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url_address); myReq.AllowAutoRedirect = false; WebResponse response = myReq.GetResponse(); if (response.Headers["Location"]!=null) { url_address = response.Headers["Location"]; } Clipboard.SetDataObject(url_address); resultbox.Text = url_address; urlpath.Text = "下载地址已经复制到剪贴板"; } } private uint _savedVolume; private void button_parse_Click(object sender, EventArgs e) { waveOutGetVolume(IntPtr.Zero, out _savedVolume); browser.Navigate("http://www.douyu.com/" + urlpath.Text + "?dydebug"); waveOutSetVolume(IntPtr.Zero, 0); } private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { HtmlElement head = browser.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = browser.Document.CreateElement("script"); scriptEl.SetAttribute("text", "function hook_console() { window.console = new Object(); window.console.log = function(param){external.log(param)}}"); head.AppendChild(scriptEl); browser.Document.InvokeScript("hook_console"); } } }
清晰度是720P能不能上1080的呢
那可能要修改cookie,这个下载软件没涉及这一点
貌似又被封杀了,博主重新看看~
博主,现在解析出的地址都变成了“http://hdla.douyucdn.cn/live/757104rR01yRRCT2.flv?wsAuth=3eb216b756ce4a3093f318fdaafe65f6&token=web-51598843-757104-a4768e9e0817666a5456c7642592bd62&logo=0&expire=0”这个形式!最奇怪的是,用博主的解析器解析出来的地址通过ffmpeg还是能下载的,但是,我通过Fiddler直接抓到的地址却不能下载,对比了两地址的形式是一样的!
他们改了一下认证方式,之前wsSecret改成了wsAuth,感觉从固定私钥变成了每次分配一个临时token了。之前用迅雷就可以直接下载链接,现在它对请求来源协议也做了认证,恐怕只能ffmpeg下载了,wget,迅雷暂时都不行。Fiddler抓到的地址是什么样的?
一般通过打开“http://staticlive.douyutv.com/common/share/play.swf?room_id=房间号”这个然后通过Fiddler抓到的就是最高画质的地址了,但是最近几天,某些大主播的这个地址无法打开,Fiddler中显示被加密了!其它一般没有问题~
抓到最高画质的链接是以下这样的:
http://hdl3.douyucdn.cn/live/10903rAtFfCeMXG5.flv?wsAuth=7adb632bff0c482dd0038f82e3b19748&token=web-51598843-10903-85134f6dc9503e54e6ef223bd103dab4&logo=0&expire=0
http://117.27.245.74/hdl3.douyucdn.cn/live/10903rAtFfCeMXG5.flv?wsAuth=7adb632bff0c482dd0038f82e3b19748&token=web-51598843-10903-85134f6dc9503e54e6ef223bd103dab4&logo=0&expire=0
但是,都不能下载,因为Fiddler要抓取到它们,首先得在网页上打开这个房间的网址,然后就好像这个下载地址已经被激活了一次那样,就废掉了!用博主提供的那个解析器不需要在网上打开就能获取下载地址,这个地址貌似没有被激活,通过ffmpeg就能下载~但是只要一旦下载,同样的地址你再立刻用ffmpeg也不行,必须重新用解析器获取多一次。
手机端抓到的是以下形式:
http://hlsa.douyutv.com/live/719630r5sIyLB08f_550/playlist.m3u8?wsSecret=452a6e2324f09b6b977cbf30f4434905&wsTime=1468412636
http://hls3.douyutv.com/live/10903rAtFfCeMXG5_550/playlist.m3u8?wsSecret=0816a676348473d415bf2468f69c5d98&wsTime=1468414344
但是画质都只能是540p,而且用ffmpeg下载4分钟左右就会断!
等我这两天再试试看
确实像你抓包的结果一样,播放器会先计算出来第一个url,访问第一url后通过302重定向到第二个url。第二url就是真实下载地址,访问一次后token就失效。我这里手动访问第一个url后,重定向的url和你的结果有区别,会多出来几个参数,形式如下:
http://122.228.24.102/hdl3.douyucdn.cn/live/602624rWYVytrxHL_900.flv?wsAuth=7440536cfa5a6307c7d5e4d434ce9853&token=web-0-602624-ba87c7083d8965474f76225ac7995084&logo=0&expire=0&wshc_tag=0&
wsts_tag=578a39e0&wsid_tag=de4095d3&wsiphost=ipdbm
其中wsts_tag应该是一个时间戳,访问一次就失效,但你手动增加这个参数值,就能获得下一个可用的下载地址。
我已经更新了下载工具的代码,现在程序会自动跟随重定向,将真实下载地址打印出来,但不去访问。获得的地址用迅雷即可下载。
手机端的不好直接写程序,没有测试,但是直接手机播放也是会断的,除非是高级会员才有持续的高清,普通用户都是播几分钟就被强制切换到普清,大概也是播放token有时效性吧。这样除非逆向清楚地址计算方法,不然单靠外在的观察数据包形式很难自行预测持续的可用地址
貌似现在都不能用了,我想请问楼主,要是可以我只是想在UWP中播放,UWP不支持Flash,有没有其他的办法?
刚刚试了一下,输入房间号能正常获得下载地址,然后用迅雷下载就可以。
UWP什么东西,windows客户端吗,如果你能看到房间号的话,输入这个下载工具还是可以一样获取下载地址啊。
UWP中没有WebBrowser控件 我可以用WebView吗
用webBrowser实际上是调用IE来渲染显示指定的网页(Flash加载视频时可以泄露视频流媒体的地址出来)。没做过UWP的开发,但WebView既然不能加载Flash,也就没办法用我的方法泄露视频地址了。
如果一定要用WebView的,可以访问房间页面后解析页面中的m3u文件,取得视频片段的分片地址,形如817683.ts,817684.ts…然后逐个播放或下载
楼主可以告诉我怎么获得m3u文件吗?
直接查看页面源文件,搜m3u啊~
博主你好,用嗅探软件找到播放地址后我把它放到播放器中,但播放一段时间后就不能播放了,怎么解决这个问题?
那恐怕就得隔一会儿重新获取一次下载地址了,等我有空试试看是不是链接有时效性
https://github.com/soimort/you-get/
这个项目用python写的,斗鱼,其他很多视频站都能抓,你们也去看看。而且模板的脚本很简单,很容易扩展到所有直播和视频站。
少写了两句: you-get命令行直接带mpv,vlc,就能播放(或者下载)直播流,不用再提取url,很方便,本地软件解压,比html5效率还要高30%以上。gpu利用率非常高。
这个you-get看着不错,等我试下回来报告~
这个you-get真是太好用了~感谢推荐
另外, https://github.com/rg3/youtube-dl 也支持解析斗鱼,国外网站多些。都是python写的
这个比上一个看起来更灵活一些~试试看,这类脚本只要经常有人维护就好~网站总在变
请问如何使用这一个?我是电脑白痴。下载了.EXE就不知道接下来应该如何了,能请教吗?
不知道还能不能用了~你输入房间号,然后点按钮,就会显示视频地址了,并且自动复制到你的剪贴板了。
不过现在已经有更全面好用的工具you-get,就是上面留言的说到的
确实很好用啊,斗鱼技术再强大,也搞不过开源团队。哈哈
请问下dump flash 用的是什么软件
ffdec
这个exe不能用,能更新下吗
dydebug的接口已经封了~所以这个方法不能用了,但是评论区看到有you-get工具,更通用的解决方案
you-get的已经不能用了
douyu.com/lapi/live/getPlay/ 这个请求的生成sign的密匙已经变了,不了解as3看了dump出来的flash,目前还没找到是怎么生成的,楼主可以看看能不找到