我們一般都在優酷裡看一些好玩的視頻,有時候看到精彩的就想下載到本地儲存起來留作紀念,在win下可以用維棠等軟體下載,但苦了用linux的孩子們。儘管chrome和firefox的一些外掛程式可以下載,但有時候下載下來是分段的視頻,還要手動用ffmpeg合成一個視頻太繁瑣,而且用外掛程式下載要點擊好多次滑鼠,太不符合linuxer的性格了哈~於是我用python3寫了一個youkuDown.py,代碼如下:
import reimport urllib.requestimport jsonimport timeimport randomimport sysdef getVideoInfo(url):ruleTitle=re.compile('<title>(.*)</title>')ruleId=re.compile('http://v.youku.com/v_show/id_(.*).html')videoTitle=ruleTitle.findall(urllib.request.urlopen(url).read().decode('utf8'))videoId=ruleId.findall(url)return videoTitle[0],videoId[0]def getTrueLink(videoid):data=urllib.request.urlopen('http://v.youku.com/player/getPlayList/VideoIDS/'+videoid)info=json.loads(data.read().decode('utf8'))segs=info['data'][0]['segs']types=segs.keys()seed=info['data'][0]['seed']source=list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890")mixed=''while source:seed=(seed*211+30031)&0xFFFFindex=seed*len(source)>>16c=source.pop(index)mixed+=cids=info['data'][0]['streamfileids']['flv'].split('*')[:-1]vid=''.join(mixed[int(i)] for i in ids)sid='%s%s%s'%(int(time.time()*1000),random.randint(1000,1999),random.randint(1000,9999))urls=[]for s in segs['flv']:no='%02x'%int(s['no'])url='http://f.youku.com/player/getFlvPath/sid/%s_%s/st/flv/fileid/%s%s%s?K=%s&ts=%s'%(sid,no,vid[:8],no.upper(),vid[10:],s['k'],s['seconds'])urls.append(url)return urlsdef down2file(urls,filename):f=open(filename,'wb')fileNum=len(urls)count=0for url in urls:count+=1print('downloading file %d/%d'%(count,fileNum))req=urllib.request.Request(url,headers={'Referer':'http://www.youku.com'})data=urllib.request.urlopen(req).read()f.write(data)f.close()print('download '+filename+' OK!')def youkuDown(link):videotitle,videoid=getVideoInfo(link)urls=getTrueLink(videoid)down2file(urls,videotitle+'.flv')if __name__=='__main__':if len(sys.argv)<2:print('Example Usage: python3 youkuDown.py http://v.youku.com/v_show/id_XNjUzNDQwMzIw.html')print('')exit() youkuDown(sys.argv[1])
簡單說明一下,因為優酷視頻的真實連結是動態變化的,而每個視頻的ID是不變的,比如在連結http://v.youku.com/v_show/id_XNjUzNDQwMzIw.html中,“XNjUzNDQwMzIw”就是視頻的唯一ID標識,通過這個ID可以通過GET方式請求“http://v.youku.com/player/getPlayList/VideoIDS/”+ID產生的新連結,得到json格式的視頻資訊,然後組裝成視頻的真實連結,這個真實連結也是有時效性的,而且向這個真實連結發起請求的時候必須把頭的Referer設為www.youku.com騙過伺服器才能下載,所以我沒有像以前一樣用os.system('wget '+url)這樣搞起。還有,優酷對大的視頻是分段的,所以得到的真實url我存在一個List裡面,下載的時候會顯示出共有幾段以及即時下載了多少段。下面是我的使用舉例:
儲存到本地的視頻播放情況:
在linux下想下載優酷視頻的盆友們enjoy it~~同時祝大家新年愉快~~哈哈哈
轉載請註明: