这篇文章里主要介绍我的FlvDownloader2.0中采用的Flv探测算法,欢迎提出意见和建议。
在我前面的文章中已经提到,由于各大flv的网站都对自己的flv地址进行了加密,要获取flv的下载地址并不是很容易。常用的Flv地址探测算法有如下两种:
- 分析网页的html代码和加密算法,得出实际 flv地址
- 通过ie访问原始播放网页,截取httprequest和httpresponse头信息并分析,从而flv实际地址。
第一种方法的优点就是解析速度快,并且可以很容易的分析出相关的flv信息(如分段的flv视频,整个专辑的所有视频地址)。然而这种方式没有什么通用性,并且需要对flash、html。javascript等比较熟悉。分析的过程也比较复杂和费时间。一旦网站的加密算法变化,还需要重新写解析算法。
第二种方法有一定的通用性,并且一般可以直接通过request头的url地址就能判断出flv的地址。网上的大多数flv探测程序都是这种思路。但不足之处在于:
- 一旦对大量网页进行批量解析,解析过程相对慢。
- 如果网页的视频被分割为多个,只能解析到第一个的地址。
我的flvdownloader的flv地址探测算法综合了这两种方式:
- 首先通过内嵌的隐藏浏览器访问访问网页
- 捕获浏览器访问网页过程中产生的Http请求和应答信息,并分析出flv视频地址。
- 经过上述两个步骤,可以获取第一个flv视频的实际地址,然后根据各网站的特点和第一个flv视频地址分析出被分割的其它的flv视频地址,并对flv网站发出请求验证分析结果。
- 为了方便的捕获http请求和应答,我采用的方法是建立一个代理服务器,浏览器通过代理服务器访问网页,这样代理服务器可以很容易的获取所有http信息。
整个探测过程中包括如下几个角色:
- FlvDetector: Fvl地址探测者,主要负责发出flv探测请求,并负责分析处理探测结果。
- Explorer: 浏览器,用以访问实际播放网页,产生flv请求。
- HttpProxy: Http代理服务器,用来截取浏览器的http请求和应答信息,将结果返回给FlvDetector分析。
- FlvServer: Flv视频网站
具体的流程如下:
- FlvDetector调用Explorer访问视频所在的网页。
- Explorer通过代理服务器HttpProxy发起Http请求
- HttpProxy将Explorer的请求转发给FlvServer
- FlvServer向HttpProxy发出应答
- HttpProxy将应答转发给Explorer
- 结果3、4两步后,HttpProxy已经知道Explorer的所有信息,将这些信息发给FlvDetector。
- FlvDetector分析Http头信息,获取第一个flv视频地址,并根据所访问的视频网站的视频特点分析出其它关联视频,将分析出来的视频地址直接发给Flvserver验证。
- FlvServer返回验证结果。
经过上述几步后,就已经获取到所有的flv地址了。其中第7步是需要根据不同的网站进行不同的分析的,因为已经获取了第一个视频的地址,只要继续抓一下包分析是很容易获取分割为多段的其它视频地址的。因此第7步的分析过程比直接分析网页代码是要简单的多的,一般直接分析http头信息和对网站抓包分析一下就行了。但由于不同的网站解析算法均不同,因此我的FlvDownloader中只写了优酷的分析算法(由于网速的原因,我一般只去优酷)。并开放其分析接口,使用者可以自己写其它的网站的解析算法来替换我的算法,使得FlvDownloader能更好地工作。