一、背景
孩子喜欢看央视的《小小智慧树》,在iPad上只能用优酷客户端看仅有的几段网友上传的,孩子姥姥姥爷年纪大了,在线播放操作起来不方便,干脆下载到iPad上看吧。
二、在线观看视频过程分析
首先用Fiddler截了在线看视频的通讯过程,大概是这样的:
1,访问视频地址: http://tv.cntv.cn/video/C17195/VIDE100143519445,这是一个GET请求。
反馈的内容中,有一段动态生成的javascript代码,重点在下面代码中的“7903311a7bc2440a83e0d4767e8aebd1”,我们将在后面用到。
fo.addVariable("videoCenterId","7903311a7bc2440a83e0d4767e8aebd1");
2,获取视频列表,又一个GET请求,完整的URL是这样子:
http://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid=4cd2a3992a004ed189bedbd4c3797e52&tz=-8&from=000donghua
&url=http://tv.cntv.cn/video/C10406/VIDE100143558201&idl=32&idlr=32&modifyed=false
pid参数的值就是上一步中取到的id。url参数就是上一步访问的视频地址。
获取到的视频列表是通过json格式的数据,里面就是最终的视频下载地址,《小小智慧树》使用的是mp4文件格式。
3,分段下载视频,下载完成后,用其他工具合并成一个文件,我用BoilsoftVideoJoiner,不改变编码,仅合并文件。
三、下载在线视频代码
Python3.3.0下使用。代码放在了gist上:https://gist.github.com/4203743
支持命令行参数,比如在windows下运行:C:\Documents and Settings\codes\gist\4203743> python lrt.py 视频URL
四、新发现的问题
1,子站问题。上面2.2节获取视频列表的请求中有个from参数,动画子站的值是000donghua,体育子站的值是000sports,可能是在服务端生成播放器代码时写死的。
2,编码问题,cntv的动画子站用的是utf8编码,而体育子站用的是gbk编码,在对网页内容做搜索时要分别解码。
通过对url二级域名的比较,对这两个问题进行了野蛮的解决。
今天(2013-2-8)又发现了个子站,而且下载地址全部集成到一个页面中,只是分成不同的pid。在这里。