我覺得網(wǎng)上的一些資料大多是直接給出處理的結果,而不注重分析過程,對我們程序員來說,其過程更重要,工作中碰到的問題是多種多樣的,不可能每個碰到的問題都能從網(wǎng)上直接找到答案,我也覺得作為程序員直接去找答案的做法本身有問題.應該提高主動去分析解決問題的能力.下面是對這類問題的一個相對通用的分析方法.
1.URL分析
http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso
打開這個url的頁面源碼,找到下面這些內(nèi)容:
var COVER_INFO = {
title :"獨家首發(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)的位置基本可以判斷這個字符串唯一代表了一個合集(或者叫專輯). 不管它有沒有用,先大概看一下,把URL中覺得有用的東西過一遍.
騰訊視頻播放地址的url有幾種模式,上面是其中一種,其它的幾種模式對解析其地址沒什么太大關系,這里就以這種為例了.這個url中最關鍵的就是最后面接的一個參數(shù)vid(videoID)=g00118pmaso.
2. 抓包
這里首先要說一點,平時做web應用或者后臺接口,要有習慣去抓包,并且對抓到的包進行一些簡單的分析,這是一個很好的習慣,有時候會學到一些意想不到的東西.
最簡單的抓包方式就是直接用瀏覽器自帶的工具了,我平時用的chrome,F12 - Network中就有當前頁面發(fā)送出去的http報文,另外還有個小技巧,因為瀏覽器會有緩存,按Ctrl+F5刷新頁面,就會強制從服務端獲取內(nèi)容而不用緩存,有時候需要這樣做,具體的原理可以去看看http協(xié)議中的Cache-Control頭部. 用瀏覽器抓包還有個不太方便的地方,當頁面跳轉時,前面抓的包就沒有了,抓的永遠是當前頁面相關的報文.所以我平時用的比較多的是fiddler,一個免費的抓包工具,非常方便.
回到正題, 我們從瀏覽器輸入鏈接http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso, 抓到了很多http包,我這里給出一部分的截圖
標出來的部分請求是關鍵請求, 我自己在分析的時候,是從下往上分析的,
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,這個好理解,vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B,這個看起來又像是一個比較關鍵的參數(shù),level=3(后面xml中對應的level),platform=1(平臺,web、client、iphone...?暫時也是未知),br=351(bitrate=351?大概是碼率的意思,后面xml中的br=351),fmt=fhd(大概意思是format=flvHD?實際上這里是后面id為10309對應的format name),sp=0(后面xml中對應的sp).
這里有一大堆的參數(shù),有很多都是未知,這個時候別慌,整個鏈接直接下載肯定是可以下載到視頻的,現(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ù)暫時先別管。這里有幾個關鍵的地方,vkey從哪里來的?br和fmt從那里獲。縱id后面的p309.1哪里來的?還有就是ip地址來源未知。分析到這里,繼續(xù)往上找到另一個比較關鍵的請求。
http://vv.video.qq.com/getkey
分析玩上面的視頻地址鏈接的組成,很容易就找到了這個請求,getkey。它是一個post請求,查看其發(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,同時還發(fā)現(xiàn)了和上面鏈接對應的level和sp兩個參數(shù),上面一個鏈接中的一個參數(shù),不過這個參數(shù)也非必要,暫時不管。
URLDecode后為:
format=10309(這里實際上是后面的format id)&otype=xml&vt=210&vid=g00118pmaso
&ran=0.9477521511726081&charge=0&filename=g00118pmaso.p309.1.mp4&platform=11
同樣,在代碼中試,看那幾個參數(shù)是必要的,經(jīng)試驗,發(fā)現(xiàn)format,type,vid,filename是必要的。
繼續(xù)網(wǎng)上分析第三個url,http://vv.video.qq.com/getinfo
也是一個POST請求,參數(shù)是:
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD&
platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433
返回的結果如下:
<?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>
看到這個后,比較興奮,想要的東西基本上在這里可以找到了。再回過來分析一下這個請求所帶的參數(shù)
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD
&platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433
otype返回格式,pid看起來又像是個比較重要的參數(shù)(未知),platform(上面是1,這里又來了個11,不明白),vid和上面一樣,charge(應該是付費信息,0表示不付費,來源未知),speed(未知),ran和上面一樣應該是個0-1之間的隨機數(shù)。用httpclient模仿這個請求,令人興奮的是只需要vids和otype就能返回該xml(不需要再去找pid了)。
再整理一下:
1.先通過http://vv.video.qq.com/getinfo POST請求添加參數(shù)otype,vid就能獲得上面的xml。
2.根據(jù)這個xml中的內(nèi)容發(fā)送http://vv.video.qq.com/getkey POST請求,參數(shù)列表為format,type,vid,filename。
其中format的id和name有個對應關系,10309-fhd、10303-sd、10302-hd。這里填寫的為id。例如:format=10309
filename由幾部分組成g00118pmaso.p309.1.mp4 最前面一部分是vid,如果格式id為10309,則后面加上p309.1,最后是格式mp4。例如我我要下載格式id為10303的視頻,那拼出來應該是g00118pmaso.p303.1.mp4。
type為xml,vid為每個視頻唯一的id,這里是g00118pmaso。
3.根據(jù)以上信息拼接視頻的真實地址
首先是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一一對應,不能用p309的key和g00118pmaso.p303.1.mp4拼接。
然后就是vkey,根據(jù)filename獲得的vkey進行拼接。
接著type=mp4,fmt和format id對應,例如10309對應的是fhd。
對于format id為10309的視頻,最后拼出來的結果是http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?type=mp4
&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B&fmt=fhd
注意這里把一些不必要的參數(shù)去掉了。
3. 若通過抓包的方式無法分析出來真實地址,則需要反編譯swf,找到拼接視頻地址的代碼,還原其過程。
騰訊的視頻地址分析還算順利,因為不需要反編譯swf