Java - Download Youtube Video by parser url_encoded_fmt_stream_map

最近為了要下載youtube上的影片,想說雖然可以透過網路上提供的工具下載,但還是嫌有

點麻煩,不過其實在使用上已經很方便了!如下面的一個link:

http://www.youtube.com/watch?v=XXXX您只要在domain name的youtube前加上link,變成

http://www.linkyoutube.com/watch?v=XXXX就可以連到一個網頁幫您下載video!說真的很

方便,當然你也可以透過安裝Google Chrome的plugin來下載等等。

不過,身為資訊人還真的有好奇到該怎麼去用程式下載,後來google了一下,發現這一兩年

youtube將download video的link做了一些處理(如:encode、需額外多加參數等),現在雖然透

過videoID可以去request得到一個get_video_info(網路上很多範例),但重點來了,很多人提到

url_encoded_fmt_stream_map所帶出一長串值有下載的link,但實際看了一下發現超長,後來才

知道裡面包含了很多種format(表示有好幾種下載的video format),而我要下載的video就提供了

五種,如下:

這就是url_encoded_fmt_stream_map 帶出的value,但我有先經過Java URLDecoder處理,在

這邊列出一部分!

quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=43&fallback_host=tc.v16.cache3.googlevideo.com&type=video/webm; codecs=vp8.0_vorbis&signature=OOXXOOXXOOXX&itag=43,quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=18&fallback_host=tc.v8.cache6.googlevideo.com&type=video/mp4; codecs=avc1.42001E_mp4a.40.2&signature=OOXXOOXXOOXX&itag=18

請注意!當你每次request得到一份新的url_encoded_fmt_stream_map都會有不一樣的參數編排,

說真的確實有點麻煩,像上面的例子是以quality=開頭,我測試了一下發現一共有將近六種

編排

分別是:

fallback_host=XXXX.....,fallback_host=OOOO.....

url=XXXX....,url=OOOO....

sig=XXXX....,sig=OOOO....

itag=XXXX....,itag=OOOO....

quality=XXXX....,quality=OOOO....

type=XXXX....,type=OOOO....

請注意這些參數的開頭所代表的就是一個format的video下載資訊,另外一部的video會以逗號做

分隔,上面六種的模式都一樣。

上面的一長串value我標藍色的部分在url的地方所帶出的link就是有效的下載連結,但還需要

額外加上signature=ooxx。

重點來了,除了基本的參數名需要特別加上外(下面有提到),參數名sparams內的值有時會額

外多出一些參數,這個也必須在download url加上,否則光是基本的參數加上還是無法下載!

sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire%2Cpcm2fr

就曾出現pcm2fr的參數名,導致雖然串接了基本參數及signature但連結還是失效!!

如此轉貼在chrome就可以進行線上播放,但如果連結有問題就會沒內容,得到403的回應!

額外補充如下:

1. signature=ooxx原本是叫sig=ooxx,在這邊轉貼出來的我已先透過程式轉換了

2. 由於有將近六種的格式編排,建議將這些value挑一種format存進HashMap內,到時再重新

    串起download url,要注意的基本參數名大概是下列這一些:

    String names[] = {"ip", "sver", "ipbits", "mt", "mv", "ratebypass", "source", "ms"
                               , "itag", "fexp", "sparams", "expire" , "upn", "key", "id", "signature"};

最後得到的就會是:
http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&sver=3&ipbits=0&mt=1386166496&mv=m&ratebypass=yes&source=youtube&ms=au&itag=18&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&expire=1386189082&upn=VSm8Q2j_vT4&key=yt5&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&signature=OOXXOOXX

要注意參數的名稱一定要對,還有不要重複!

3.  type=video/webm; codecs=vp8.0_vorbi,這一段的參數原本_是, ,也記得先將它replace掉,

    以免影響逗點的分割!


大致上應該就是這一些,主要是針對url_encoded_fmt_stream_map做說明,但難免youtube會再

更改url的編排與編碼方式!又或者有我沒發現的新編排,至少目前應該是可行的!

留言

  1. 請問這個方式現在依然可行嗎?

    回覆刪除
    回覆
    1. 您好, 小弟我上一陣子有使用,但發現有些影音檔是無法下載的,由於串出來的URL被視為無效的連結,因此並不是百分之百可以達到下載的目的!頂多60 ~ 70%,也許有些情況可能有漏考慮到!orz

      刪除

張貼留言