我覺得網(wǎng)上的一些資料大多是直接給出處理的結(jié)果,而不注重分析過程,對(duì)我們程序員來(lái)說(shuō),其過程更重要,工作中碰到的問題是多種多樣的,不可能每個(gè)碰到的問題都能從網(wǎng)上直接找到答案,我也覺得作為程序員直接去找答案的做法本身有問題.應(yīng)該提高主動(dòng)去分析解決問題的能力.下面是對(duì)這類問題的一個(gè)相對(duì)通用的分析方法.
1.URL分析
http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso
打開這個(gè)url的頁(yè)面源碼,找到下面這些內(nèi)容:
var COVER_INFO = {
title :"獨(dú)家首發(fā)",
id :"g9jgclyhpp5sp7p",
isPrev :false,
pic :"http://i.gtimg.cn/qqlive/img/jpgcache/files/qqvideo/g/g9jgclyhpp5sp7p_h.jpg",
typeid:22,
videoReName :false,
sourceid:0,
isEurope:false,
useTextVideoList:false,
columnid:0,
hasRecommend:true,
specialTemp:false,
varietyDate:"",
copyright:5
};
在源碼中搜索g9jgclyhpp5sp7p字符串,從其出現(xiàn)的位置基本可以判斷這個(gè)字符串唯一代表了一個(gè)合集(或者叫專輯). 不管它有沒有用,先大概看一下,把URL中覺得有用的東西過一遍.
騰訊視頻播放地址的url有幾種模式,上面是其中一種,其它的幾種模式對(duì)解析其地址沒什么太大關(guān)系,這里就以這種為例了.這個(gè)url中最關(guān)鍵的就是最后面接的一個(gè)參數(shù)vid(videoID)=g00118pmaso.
2. 抓包
這里首先要說(shuō)一點(diǎn),平時(shí)做web應(yīng)用或者后臺(tái)接口,要有習(xí)慣去抓包,并且對(duì)抓到的包進(jìn)行一些簡(jiǎn)單的分析,這是一個(gè)很好的習(xí)慣,有時(shí)候會(huì)學(xué)到一些意想不到的東西.
最簡(jiǎn)單的抓包方式就是直接用瀏覽器自帶的工具了,我平時(shí)用的chrome,F12 - Network中就有當(dāng)前頁(yè)面發(fā)送出去的http報(bào)文,另外還有個(gè)小技巧,因?yàn)闉g覽器會(huì)有緩存,按Ctrl+F5刷新頁(yè)面,就會(huì)強(qiáng)制從服務(wù)端獲取內(nèi)容而不用緩存,有時(shí)候需要這樣做,具體的原理可以去看看http協(xié)議中的Cache-Control頭部. 用瀏覽器抓包還有個(gè)不太方便的地方,當(dāng)頁(yè)面跳轉(zhuǎn)時(shí),前面抓的包就沒有了,抓的永遠(yuǎn)是當(dāng)前頁(yè)面相關(guān)的報(bào)文.所以我平時(shí)用的比較多的是fiddler,一個(gè)免費(fèi)的抓包工具,非常方便.
回到正題, 我們從瀏覽器輸入鏈接http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso, 抓到了很多http包,我這里給出一部分的截圖
標(biāo)出來(lái)的部分請(qǐng)求是關(guān)鍵請(qǐng)求, 我自己在分析的時(shí)候,是從下往上分析的,
1)首先找到視頻的下載地址
http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?sdtfrom=v10&type=mp4
&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B
&level=3&platform=1&br=351&fmt=fhd&sp=0
這里繼續(xù)分析url,g00118pmaso上面講到了,是vid,但是后面多出了.p309.1. 繼續(xù)往下看sdtfrom=v10(未知),type=mp4,這個(gè)好理解,vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B,這個(gè)看起來(lái)又像是一個(gè)比較關(guān)鍵的參數(shù),level=3(后面xml中對(duì)應(yīng)的level),platform=1(平臺(tái),web、client、iphone...?暫時(shí)也是未知),br=351(bitrate=351?大概是碼率的意思,后面xml中的br=351),fmt=fhd(大概意思是format=flvHD?實(shí)際上這里是后面id為10309對(duì)應(yīng)的format name),sp=0(后面xml中對(duì)應(yīng)的sp).
這里有一大堆的參數(shù),有很多都是未知,這個(gè)時(shí)候別慌,整個(gè)鏈接直接下載肯定是可以下載到視頻的,現(xiàn)在要做的是,去掉其中一些參數(shù),看是否能下載.
http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?type=mp4
&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B
&br=351&fmt=fhd最后發(fā)現(xiàn),保留這些參數(shù),能正常下載到視頻。所以其它參數(shù)暫時(shí)先別管。這里有幾個(gè)關(guān)鍵的地方,vkey從哪里來(lái)的?br和fmt從那里獲?vid后面的p309.1哪里來(lái)的?還有就是ip地址來(lái)源未知。分析到這里,繼續(xù)往上找到另一個(gè)比較關(guān)鍵的請(qǐng)求。
http://vv.video.qq.com/getkey
分析玩上面的視頻地址鏈接的組成,很容易就找到了這個(gè)請(qǐng)求,getkey。它是一個(gè)post請(qǐng)求,查看其發(fā)送的參數(shù)format=10309&otype=xml&vt=210&vid=g00118pmaso&ran=0%2E9477521511726081
&charge=0&filename=g00118pmaso%2Ep309%2E1%2Emp4&platform=11
http response中的內(nèi)容如下:
<?xml version="1.0" encoding="utf-8" standalone="no" ?> <root><br>360602.1875</br><ct>604800</ct><key>95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B</key><level>3</level><levelvalid>1</levelvalid><s>o</s><sp>0</sp><sr>0</sr></root>
在這里我們找到了key,同時(shí)還發(fā)現(xiàn)了和上面鏈接對(duì)應(yīng)的level和sp兩個(gè)參數(shù),上面一個(gè)鏈接中的一個(gè)參數(shù),不過這個(gè)參數(shù)也非必要,暫時(shí)不管。
URLDecode后為:
format=10309(這里實(shí)際上是后面的format id)&otype=xml&vt=210&vid=g00118pmaso
&ran=0.9477521511726081&charge=0&filename=g00118pmaso.p309.1.mp4&platform=11
同樣,在代碼中試,看那幾個(gè)參數(shù)是必要的,經(jīng)試驗(yàn),發(fā)現(xiàn)format,type,vid,filename是必要的。
繼續(xù)網(wǎng)上分析第三個(gè)url,http://vv.video.qq.com/getinfo
也是一個(gè)POST請(qǐng)求,參數(shù)是:
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD&
platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433
返回的結(jié)果如下:
<?xml version="1.0" encoding="utf-8" standalone="no" ?> <root> <fl> <cnt>5</cnt> <fi> <br>64</br> <id>1</id> <name>flv</name> <sl>0</sl> </fi> <fi> <br>550</br> <id>10301</id> <name>shd</name> <sl>0</sl> </fi> <fi> <br>230</br> <id>10302</id> <name>hd</name> <sl>0</sl> </fi> <fi> <br>64</br> <id>10303</id> <name>sd</name> <sl>0</sl> </fi> <fi> <br>900</br> <id>10309</id> <name>fhd</name> <sl>1</sl> </fi> </fl> <hs>0</hs> <ls>0</ls> <preview>276</preview> <s>o</s> <tm>1361366724</tm> <vl> <cnt>1</cnt> <vi> <br>351</br> <ch>0</ch> <cl> <ci> <cd>276.480011</cd> <cmd5>beace783957b52f460006604229b57cf</cmd5> <cs>99699295</cs> <idx>1</idx> <keyid>g00118pmaso.10309.1</keyid> </ci> <fc>1</fc> </cl> <fmd5>4ebecd94d64f46666d4e43826c120b5f</fmd5> <fn>g00118pmaso.p309.mp4</fn> <fs>99699378</fs> <fst>5</fst> <lnk>g00118pmaso</lnk> <logo>1</logo> <pl> <cnt>2</cnt> <pd> <c>10</c> <cd>2</cd> <fmt>40001</fmt> <fn>q1</fn> <h>45</h> <r>10</r> <url>http://video.qpic.cn/video_caps/0/</url> <w>80</w> </pd> <pd> <c>5</c> <cd>2</cd> <fmt>40002</fmt> <fn>q2</fn> <h>90</h> <r>5</r> <url>http://video.qpic.cn/video_caps/0/</url> <w>160</w> </pd> </pl> <share>1</share> <st>2</st> <td>276.48</td> <ti>因你而在</ti> <type>3585</type> <ul> <ui> <dt>2</dt> <dtc>10</dtc> <url>http://101.71.72.2/music.qqvideo.tc.qq.com/</url> <vt>210</vt> </ui> <ui> <dt>2</dt> <dtc>10</dtc> <url>http://113.207.98.27/music.qqvideo.tc.qq.com/</url> <vt>210</vt> </ui> <ui> <dt>2</dt> <dtc>10</dtc> <url>http://video.store.qq.com/</url> <vt>0</vt> </ui> </ul> <vh>1080</vh> <vid>g00118pmaso</vid> <videotype>0</videotype> <vw>1920</vw> </vi> </vl> </root>
看到這個(gè)后,比較興奮,想要的東西基本上在這里可以找到了。再回過來(lái)分析一下這個(gè)請(qǐng)求所帶的參數(shù)
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD
&platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433
otype返回格式,pid看起來(lái)又像是個(gè)比較重要的參數(shù)(未知),platform(上面是1,這里又來(lái)了個(gè)11,不明白),vid和上面一樣,charge(應(yīng)該是付費(fèi)信息,0表示不付費(fèi),來(lái)源未知),speed(未知),ran和上面一樣應(yīng)該是個(gè)0-1之間的隨機(jī)數(shù)。用httpclient模仿這個(gè)請(qǐng)求,令人興奮的是只需要vids和otype就能返回該xml(不需要再去找pid了)。
再整理一下:
1.先通過http://vv.video.qq.com/getinfo POST請(qǐng)求添加參數(shù)otype,vid就能獲得上面的xml。
2.根據(jù)這個(gè)xml中的內(nèi)容發(fā)送http://vv.video.qq.com/getkey POST請(qǐng)求,參數(shù)列表為format,type,vid,filename。
其中format的id和name有個(gè)對(duì)應(yīng)關(guān)系,10309-fhd、10303-sd、10302-hd。這里填寫的為id。例如:format=10309
filename由幾部分組成g00118pmaso.p309.1.mp4 最前面一部分是vid,如果格式id為10309,則后面加上p309.1,最后是格式mp4。例如我我要下載格式id為10303的視頻,那拼出來(lái)應(yīng)該是g00118pmaso.p303.1.mp4。
type為xml,vid為每個(gè)視頻唯一的id,這里是g00118pmaso。
3.根據(jù)以上信息拼接視頻的真實(shí)地址
首先是xml中的地址http://101.71.72.2/music.qqvideo.tc.qq.com
緊跟著拼上filename,這里例如g00118pmaso.p309.1.mp4、g00118pmaso.p303.1.mp4、g00118pmaso.p302.1.mp4、g00118pmaso.p301.1.mp4。注意filename要和vkey一一對(duì)應(yīng),不能用p309的key和g00118pmaso.p303.1.mp4拼接。
然后就是vkey,根據(jù)filename獲得的vkey進(jìn)行拼接。
接著type=mp4,fmt和format id對(duì)應(yīng),例如10309對(duì)應(yīng)的是fhd。
對(duì)于format id為10309的視頻,最后拼出來(lái)的結(jié)果是http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?type=mp4
&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B&fmt=fhd
注意這里把一些不必要的參數(shù)去掉了。
3. 若通過抓包的方式無(wú)法分析出來(lái)真實(shí)地址,則需要反編譯swf,找到拼接視頻地址的代碼,還原其過程。
騰訊的視頻地址分析還算順利,因?yàn)椴恍枰淳幾gswf