yan12125 / iqiyi-hack

Scripts to hack iQiyi and Letv

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

怎么拼凑出乐视的视频下载链接?

redstoneleo opened this issue · comments

现在通过you-get获得的是ts的的视频分段,对于大一点的视频会有上百个分段,这一点不是很方便。
比如这个视频应该是MP4格式的,
http://www.le.com/ptv/vplay/1847799.html
我用webkit可以轻松地获得这种以http://api.le.com/mms/out/video/playJson 开头的请求,本视频的是
http://api.le.com/mms/out/video/playJson?id=1847799&platid=1&splatid=101&format=1&tkey=-2029658988&domain=www.le.com&dvtype=720p&accessyx=1&devid=04C6606C92DA5A8F696BEDB3FE4F8BC6E2BBCC27
里面的内容为

{
    "danmu" : "1", "firstlook" : "0", "isAlbumPay" : 0, "isTryLook" : "0", "paylist" : ["1080p"], "playstatus" : {
        "status" : "1"
    },
    "playurl" : 
    {
        "videoType" : 180001, "cid" : "2", "pid" : "84003", "vid" : "1847799", "title" : "\u5927\u5b85\u95e8\u0030\u0031", 
        "mid" : ",2113249,", "duration" : "2628", "pic" : "http://img1.c3.letv.com/mms/thumb/2012/12/14/0933728e1c47da37b4be8bee7794e0ac/0933728e1c47da37b4be8bee7794e0ac_2.jpg", 
        "filter" : 1, "download" : ["290009", "290005", "290003", "290001", "290002"], "total" : "0", 
        "nextvid" : "1847805", "domain" : ["http://play.g3proxy.lecloud.com", "http://bplay.g3proxy.lecloud.com", 
        "http://117.121.54.219"], "dispatch" : 
        {
            "1000" : ["/vod/v2/MTE3LzMxLzY4L2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0zMDE4MjE5ODAtYXZjLTQ4MDA0My1hYWMtMzIwMDItMjYyODA0MC0xNzExNDAzNjQtMzFiNWZkYmE2MWU2OWQwOWNlYmM0ZGM4NjE0OWI4ZGUtMTQyMDU5MzU5ODA3Ny5tcDQ=?b=520&mmsid=2113249&tm=1467545038&key=f852abb856528b93f854f2ea3ec211e5&platid=1&splatid=101&playid=0&tss=ios&vtype=13&cvid=49392381325&payff=0&pip=6c10daa64d2c55bc363f902c88c0b118", 
            "117/31/68/letv-uts/14/ver_00_22-301821980-avc-480043-aac-32002-2628040-171140364-31b5fdba61e69d09cebc4dc86149b8de-1420593598077.mp4"], 
            "350" : ["/vod/v2/MTI0LzI2LzgzL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0zMTE1OTIzMzYtYXZjLTIyOTgzMS1hYWMtMzIwMDItMjYyODA0MC04ODk0MTAxMy0xMjFhNThiYzMzODgzNWQ1MzI2Yjc4MmYwODQ4MTJmMy0xNDI1NzgyODE4MzA5Lm1wNA==?b=270&mmsid=2113249&tm=1467545038&key=5ecf63200b3579b19d1d0131c9d491ba&platid=1&splatid=101&playid=0&tss=ios&vtype=21&cvid=49392381325&payff=0&pip=6c10daa64d2c55bc363f902c88c0b118", 
            "124/26/83/letv-uts/14/ver_00_22-311592336-avc-229831-aac-32002-2628040-88941013-121a58bc338835d5326b782f084812f3-1425782818309.mp4"]
        }
    },
    "point" : {
        "skip" : [45, 2627]
    },
    "statuscode" : "1001", "trylook" : "0", "trylooktime" : 0, "watermark" : 
    {
        "imgs" : [
        {
            "lasttime" : "1800", "link" : "", "position" : "2", "url100" : "http://i1.letvimg.com/lc04_iscms/201601/12/15/22/47615b27e213449da27bfd356df13f38.png"
        },

        {
            "lasttime" : "1800", "link" : "", "position" : "1", "url100" : "http://i0.letvimg.com/lc04_iscms/201601/12/15/22/afd7ca79d3564037acd9606ce04069c2.png"
        }], "offset" : "3"
    }
}

这个似乎就是视频的相关信息了,请问要怎么拼凑出视频的MP4下载链接?

抱歉Github似乎沒有通知有新issue

domaindispatch的網址相連,會得到一個新的JSON,裡面的location就是mp4的網址。詳細可見https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/leeco.py

如果用youtube-dl,可用這個命令得到mp4的網址:

youtube-dl -g -f "best[format_id^=http]" "http://www.le.com/ptv/vplay/1847799.html"

@yan12125 非常感谢,可行!!!

有3个问题请教下,希望多多指教!谢谢!

  1. 因为我希望下载最高清晰度的视频,然后看到youtube-dl的说明书:By default youtube-dl tries to download the best available quality ,所以我想按照我的需要没必要加-f这个参数了,那么我要的命令行就变成
    youtube-dl --get-filename --get-url "http://www.le.com/ptv/vplay/1847799.html"
    但是运行后发现吐出好多好多奇奇怪怪的字符,不知道是什么原因,请问我这里要下载乐视最高清晰度的视频必须像你那样加-f这个参数吗?我看其他网站(比如优酷)无需-f这个参数依然正常,只是乐视少了这个参数就出问题,也不知道是什么原因

2.其实我通过youtube-dl要获得的是最高清晰度的视频名称(包含扩展名)和视频下载链接,对于视频名称希望其中不包含视频id,比如我要的视频名称是“大宅门01.mp4”而不是“大宅门01-1847799.mp4”
我现在用的是下面的命令来获取
youtube-dl --get-filename --get-url -o '%(title)s.%(ext)s' "http://v.youku.com/v_show/id_XMzEwNDE3Njg4.html?tpa=dW5pb25faWQ9MTAzNjY3XzEwMDAwMV8wMV8wMQ"
我看你对youtube-dl这个工具比较熟悉,不知道还有没有比我这个更好的获取方式?

3.我通过下面的python代码来使用youtube-dl这个工具的
`import youtube_dl

ydl_opts = {'forcetitle': True,'forceurl': True,
'skip_download': True, 'quiet': True}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(
['http://v.youku.com/v_show/id_XMzEwNDE3Njg4.html?tpa=dW5pb25faWQ9MTAzNjY3XzEwMDAwMV8wMV8wMQ'])`
但是这种方法似乎会直接把结果输出到控制台了,请问这种方式下有没有什么办法可以将这个代码产生的结果赋给一个python变量什么的?因为我最终还是希望在python代码里使用这个解析结果

  1. 樂視的最高畫質是M3U8的格式。樂視對M3U8加密,而youtube-dl印出的是解密後的M3U8內容。如果需要MP4的HTTP連結,需要-f "best[format_id^=http]",但這樣就不是最高畫質了。
  2. 這是正確的用法
  3. 可用extract_info(),例如:
import json
import youtube_dl

ydl_opts = {'quiet': True}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    data = ydl.extract_info('http://v.youku.com/v_show/id_XMzEwNDE3Njg4.html?tpa=dW5pb25faWQ9MTAzNjY3XzEwMDAwMV8wMV8wMQ', download=False)
    print(json.dumps(data, indent=True))

谢谢啦,后面我通过下面的代码调用youtube-dl,不知道是什么原因行不通,你能否看出是什么原因?

import subprocess
url = 'http://www.le.com/ptv/vplay/1847799.html'
output = subprocess.check_output([r"C:\Users\i\AppData\Local\Programs\Python\Python35-32\Scripts\youtube-dl.exe", '-g', '-f', '"best[format_id^=http]"', url])

可能是參數問題:'"best[format_id^=http]"',只需要'best[format_id^=http]'或"best[format_id^=http]"即可。

哇哈哈,好棒耶,真的搞定了,谢谢你!

不客氣不客氣~

嘿嘿,你们**人普遍做事情都认真负责~

謝謝 :)

http://www.le.com/ptv/vplay/2061436.html?ch=baiduald_ffdy
这是个vip视频,youtube-dl现在只能下载开头10分钟那一段了。
如果不能完整下载,建议去掉这种半成品解析结果

youtube-dl一般會盡量符合瀏覽器的行為。如果瀏覽器播放前10分鐘,youtube-dl就會下載前10分鐘。一種可行的方案是判斷一個影片是否需要VIP才能觀看完整內容,然後再讓使用者決定要不要下載。可否請你在https://github.com/rg3/youtube-dl/issues 開一個新的issue?

谢谢,已经报告了ytdl-org/youtube-dl#12448