ykdl
ykdl copied to clipboard
请求添加西瓜视频下载支持
在提交前,请确保您已经检查了以下内容!
- [x] 你确实可以在浏览器或移动端中观看视频,但不能使用
ykdl
下载。 - [x] 您的
ykdl
为最新版。 - [x] 您已经阅读并按 https://github.com/zhangn1985/ykdl/wiki 中的指引进行了操作。
- [x] 您的问题没有在 https://github.com/zhangn1985/ykdl/issues 报告,否则请在原有 issue 下报告。
- [x] 本问题确实关于
ykdl
,而不是其他项目。
请将错误输出粘贴在下面:
ykdl -i https://www.ixigua.com/i6785489916194193928/ --debug
DEBUG:common:video_host> www.ixigua.com
DEBUG:common:short_name> ixigua
DEBUG:common:> Try HTTP Redirection!
DEBUG:common:> NO HTTP Redirection
DEBUG:common:> Go Generalembed
DEBUG:html:get_content> URL: https://www.ixigua.com/i6785489916194193928/
DEBUG:html:get_content> Charset: utf-8
ERROR:YKDL:Playlist is not supported for GeneralEmbed ( 通用嵌入视频)with url: https://www.ixigua.com/i6785489916194193928/
如果您有其他附言,例如问题只在某个视频发生,或者是一般性讨论或者提出新功能,请在下面添加:
如题,you-get原版是支持的,但是只能支持到480p,如果可能最好连1080p一起支持上
现在的头条接口好像不能获取1080P.mp4,只能获取到720P 1080P是dash格式,加密过的
try:
isDash = 0 # 1:dash , 0:mp4
getToken = common.curl(
"https://www.ixigua.com/api/videov2/video_token?_signature=&vid=%s&isDash=%s&isLVideo=0"
% (vid, isDash)
)
getJson = common.loads(getToken)
authToken = getJson["data"]["AuthToken"]
pToken = getJson["data"]["BusinessToken"]
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:72.0) Gecko/20100101 Firefox/72.0",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Authorization": authToken,
"Origin": "https://www.ixigua.com",
"Connection": "keep-alive",
"Referer": "https://www.ixigua.com/",
}
params = (
("action", "GetPlayInfo"),
("video_id", vid),
("nobase64", "1"),
("ptoken", pToken),
("vfrom", "xgplayer"),
)
url = "https://vas.snssdk.com/video/openapi/v1/"
html = common.curl(url, {"method": "get", "header": headers, "params": params})
....
except:
url = "http://i.snssdk.com/video/urls/1/toutiao/mp4/%s?nobase64=1" % vid
html = common.curl(url)
可以用这个接口(使用iPhone的UA访问):https://api-hl.amemv.com/aweme/v1/play/?video_id=v02004140000boleciimac2vul5c8dr0&ratio=1080p&watermark=0&h265=0
可以用这个接口(使用iPhone的UA访问):https://api-hl.amemv.com/aweme/v1/play/?video_id=v02004140000boleciimac2vul5c8dr0&ratio=1080p&watermark=0&h265=0
额 这个接口还能用 ratio参数可用
但单独使用这个接口是有问题的,还得配合其他接口来获取正确的分辨率
https://aweme.snssdk.com/aweme/v1/play/?video_id=v020430e0000boa819feqk8cg329n6i0&line=0&ratio=720p&watermark=0
https://aweme.snssdk.com/aweme/v1/play/?video_id=v020430e0000boa819feqk8cg329n6i0&line=0&ratio=1080p&watermark=0
在名字中有xgplayer_encrypt的js中,于f = window.Module.UTF8ToString(p)
处可以获取到解密需要的key(f值)。
例如该视频的1080对应的视频流可以通过下面的命令解密,其中
-
5e2ae64a565305ff54ac43760002004b
是license接口返回的kid(也是视频文件本身的id,可以通过bento4的mp4dump工具查看到) -
824f9b328d264c10b148488fd5ccd40a
是f的值
mp4decrypt.exe --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a media-video-avc1.mp4 decrypt.mp4
mp4decrypt.exe文件可于此下载。
mp4decrypt 是 Bento4 中的一个工具,完整的 Binary Releases 下载地址 https://www.bento4.com/downloads/
Bento4 的 git repository https://github.com/axiomatic-systems/Bento4
mp4decrypt 是 Bento4 中的一个工具,完整的 Binary Releases 下载地址 https://www.bento4.com/downloads/
Bento4 的 git repository https://github.com/axiomatic-systems/Bento4
这你就naive了,在这里官方的并不能成功解密。
mp4decrypt 是 Bento4 中的一个工具,完整的 Binary Releases 下载地址 https://www.bento4.com/downloads/ Bento4 的 git repository https://github.com/axiomatic-systems/Bento4
这你就naive了,在这里官方的并不能成功解密。
这就是用的就是 Bento4 官方 Binary Releases 中的 mp4decrypt
另外,KID 也写在了 manifest 的</ContentProtection>
中
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT5.00S" type="static" mediaPresentationDuration="PT5M10.800S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
<Period>
<AdaptationSet segmentAlignment="true" maxWidth="854" maxHeight="480" mimeType="video/mp4" startWithSAP="1">
<Representation id="1" codecs="avc1.640032" width="1920" height="1080" frameRate="30" bandwidth="3207270" scanType="progressive">
<BaseURL>tos-cn-vd-0026/1e1c998b037141d594b0e11d887bcd85/media-video-avc1</BaseURL>
<SegmentBase indexRange="1347-2134">
<Initialization range="0-1346"></Initialization>
</SegmentBase>
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5e2ae64a-5653-05ff-54ac-43760002004b"></ContentProtection>
</Representation>
<Representation id="2" codecs="avc1.64001F" width="1280" height="720" frameRate="30" bandwidth="1793630" scanType="progressive">
<BaseURL>tos-cn-vd-0026/aa4cf1585af24c73ba0145c3c5696fe7/media-video-avc1</BaseURL>
<SegmentBase indexRange="1345-2132">
<Initialization range="0-1344"></Initialization>
</SegmentBase>
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5e2ae64a-5653-05ff-54ac-43760002004b"></ContentProtection>
</Representation>
<Representation id="3" codecs="avc1.64001E" width="640" height="360" frameRate="30" bandwidth="489857" scanType="progressive">
<BaseURL>tos-cn-vd-0026/f31e99f87ce0416e92b21bdbd75aff5e/media-video-avc1</BaseURL>
<SegmentBase indexRange="1347-2134">
<Initialization range="0-1346"></Initialization>
</SegmentBase>
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5e2ae64a-5653-05ff-54ac-43760002004b"></ContentProtection>
</Representation>
<Representation id="4" codecs="avc1.64001F" width="854" height="480" frameRate="30" bandwidth="781957" scanType="progressive">
<BaseURL>tos-cn-vd-0026/18f3b6f56a5946f5b78ec3eaac9293f9/media-video-avc1</BaseURL>
<SegmentBase indexRange="1347-2134">
<Initialization range="0-1346"></Initialization>
</SegmentBase>
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5e2ae64a-5653-05ff-54ac-43760002004b"></ContentProtection>
</Representation>
</AdaptationSet>
<AdaptationSet segmentAlignment="true" mimeType="audio/mp4" startWithSAP="1">
<Representation id="5" codecs="mp4a.40.2" bandwidth="72383">
<BaseURL>tos-cn-vd-0026/1e1c998b037141d594b0e11d887bcd85/media-audio-und-mp4a</BaseURL>
<SegmentBase indexRange="1187-1974">
<Initialization range="0-1186"></Initialization>
</SegmentBase>
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
<Representation id="6" codecs="mp4a.40.2" bandwidth="72383">
<BaseURL>tos-cn-vd-0026/aa4cf1585af24c73ba0145c3c5696fe7/media-audio-und-mp4a</BaseURL>
<SegmentBase indexRange="1187-1974">
<Initialization range="0-1186"></Initialization>
</SegmentBase>
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
<Representation id="7" codecs="mp4a.40.2" bandwidth="72383">
<BaseURL>tos-cn-vd-0026/f31e99f87ce0416e92b21bdbd75aff5e/media-audio-und-mp4a</BaseURL>
<SegmentBase indexRange="1187-1974">
<Initialization range="0-1186"></Initialization>
</SegmentBase>
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
<Representation id="8" codecs="mp4a.40.2" bandwidth="72383">
<BaseURL>tos-cn-vd-0026/18f3b6f56a5946f5b78ec3eaac9293f9/media-audio-und-mp4a</BaseURL>
<SegmentBase indexRange="1187-1974">
<Initialization range="0-1186"></Initialization>
</SegmentBase>
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
</Period>
</MPD>
mp4decrypt 是 Bento4 中的一个工具,完整的 Binary Releases 下载地址 https://www.bento4.com/downloads/ Bento4 的 git repository https://github.com/axiomatic-systems/Bento4
这你就naive了,在这里官方的并不能成功解密。
这就是用的就是 Bento4 官方 Binary Releases 中的 mp4decrypt
这就奇怪了,我用官方的解密出来的文件没有变化。 http://puui.qpic.cn/vshpic/0/UnPPXGE0dluWr0kALx3CzUSiM0vlKE56c0hR_i2Lkjr8HXwp_0/0
用我发的那个版本却是可以的,解密出来也是正常的。 http://puui.qpic.cn/vshpic/0/C2-fa6rTcRic1efztuIZFm2VygDRDUT-puueV_HJLg1nkpVv_0/0
环境是 win10 家庭版1809
经测试确认 Bento4 1.5.1-628 Binary Releases 中的 mp4decrypt 存在这个问题 http://puui.qpic.cn/vshpic/0/UnPPXGE0dluWr0kALx3CzUSiM0vlKE56c0hR_i2Lkjr8HXwp_0/0
sha1sum mp4decrypt.exe
11997148a8411e3ae6a3d8d4d131e7d6283de972 *mp4decrypt.exe
Bento4 最新版 1.5.1-629 Binary Releases 中的 mp4decrypt 不存在此问题
sha1sum mp4decrypt.exe
2b245ab77b54c9741cbd4ba947f8e034c345cbf9 *mp4decrypt.exe
@xhlove 另外,你只发了 Windows 版的 mp4decrypt.exe 没看到 @airdge 用的 Mac 吗?
能直接解析的 没必要用到解密工具 用上面那个抖音api就行了
一开始测试官网下载的mp4decrypt.exe发现不行,用其他来源(没有去验证是不是和官方的某一个版本一致)的可以,然后就只发了Windows这个版本。因为我也没法保证MAC的就能用,但是能保证我发出来的是可用的,这样做有什么问题吗? @mengmo
能直接解析的 没必要用到解密工具 用上面那个抖音api就行了
虽然是这样说,但是目前国内视频网站也在推进各类drm,这方面的探究是有必要的。比如最近优酷改m3u8链接的type绕过加密的方法就不太灵了。
一开始测试官网下载的mp4decrypt.exe发现不行,用其他来源(没有去验证是不是和官方的某一个版本一致)的可以,然后就只发了Windows这个版本。因为我也没法保证MAC的就能用,但是能保证我发出来的是可用的,这样做有什么问题吗? @mengmo
@xhlove 当然没问题,不过就只能使用 Windows 的人测试了。 而我又发了 Bento4 的官方下载链接就是方便使用其他系统的人测试
能直接解析的 没必要用到解密工具 用上面那个抖音api就行了
虽然是这样说,但是目前国内视频网站也在推进各类drm,这方面的探究是有必要的。比如最近优酷改m3u8链接的type绕过加密的方法就不太灵了。
附议。 多一种方法就多一重保险。 而且这不就是在探讨吗? @airdge
在名字中有xgplayer_encrypt的js中,于
f = window.Module.UTF8ToString(p)
处可以获取到解密需要的key(f值)。 例如该视频的1080对应的视频流可以通过下面的命令解密,其中
5e2ae64a565305ff54ac43760002004b
是license接口返回的kid(也是视频文件本身的id,可以通过bento4的mp4dump工具查看到)824f9b328d264c10b148488fd5ccd40a
是f的值mp4decrypt.exe --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a media-video-avc1.mp4 decrypt.mp4
mp4decrypt.exe文件可于此下载。
但如果像是《囧妈》这种只能在app播放的怎么办呢?
截至2020年2月1日4时(UTC+8),《囧妈》已经可以在PC端浏览器观看,但you-get似乎无法解析西瓜视频放映厅的视频
@toorich 基本是一样的,只是稍微有一点区别,研究下mp4decrypt.exe用法就知道了。
可用,mp4decrypt解密音视频后,用ffmpeg合并
$ ./mp4decrypt --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a 360en.mp4 360de.mp4
$ ./mp4decrypt --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a 1080en.mp4 1080de.mp4
$ ./mp4decrypt --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a aen.m4a ade.m4a
$ ffmpeg -i 1080de.mp4 -i ade.m4a -c copy 1080full.mp4
在名字中有xgplayer_encrypt的js中,于
f = window.Module.UTF8ToString(p)
处可以获取到解密需要的key(f值)。 例如该视频的1080对应的视频流可以通过下面的命令解密,其中
5e2ae64a565305ff54ac43760002004b
是license接口返回的kid(也是视频文件本身的id,可以通过bento4的mp4dump工具查看到)824f9b328d264c10b148488fd5ccd40a
是f的值mp4decrypt.exe --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a media-video-avc1.mp4 decrypt.mp4
mp4decrypt.exe文件可于此下载。
~但如果像是《囧妈》这种只能在app播放的怎么办呢?~ 截至2020年2月1日4时(UTC+8),《囧妈》已经可以在PC端浏览器观看,但you-get似乎无法解析西瓜视频放映厅的视频
https://www.ixigua.com/i6785164824050401799/
手机访问就行,这个不是大问题
在名字中有xgplayer_encrypt的js中,于
f = window.Module.UTF8ToString(p)
处可以获取到解密需要的key(f值)。 例如该视频的1080对应的视频流可以通过下面的命令解密,其中
5e2ae64a565305ff54ac43760002004b
是license接口返回的kid(也是视频文件本身的id,可以通过bento4的mp4dump工具查看到)824f9b328d264c10b148488fd5ccd40a
是f的值mp4decrypt.exe --key 5e2ae64a565305ff54ac43760002004b:824f9b328d264c10b148488fd5ccd40a media-video-avc1.mp4 decrypt.mp4
mp4decrypt.exe文件可于此下载。
~但如果像是《囧妈》这种只能在app播放的怎么办呢?~ 截至2020年2月1日4时(UTC+8),《囧妈》已经可以在PC端浏览器观看,但you-get似乎无法解析西瓜视频放映厅的视频
https://www.ixigua.com/i6785164824050401799/
手机访问就行,这个不是大问题
https://www.ixigua.com/cinema/album/85dS526nogC/ 《囧妈》这个我记得2020年1月30日(UTC+8)就已经能在 PC 浏览器上看了 而且到目前为止,我这儿获取到的播放链接一直就是未加密的
那个是25号时app分享的链接,只能手机UA访问,并且西瓜视频api解析出来的数据是加密的
tvid = '6785489916194193928'
vid = 'v02004140000boleciimac2vul5c8dr0'
isDash = 0
try:
acParams = (
("version_code", "8.2.1"),
("tma_jssdk_version", "1.29.1.1"),
("app_name", "video_article"),
("aid", "32"),
("ab_feature", "z1"),
("live_sdk_version", "1.3.0"),
("ac", "WIFI"),
("os_version", "12.2"),
("user_version", "4.2.1"),
("ssmix", "a"),
("device_platform", "iphone"),
("anti_addiction_model", "0"),
("ab_client", "a1,f2,f7,e1"),
("device_type", "iPhone SE"),
("itemID", tvid),
("prefix", "https://is.snssdk.com/video/app/article/full/"),
("category", "xg_search_inner"),
("commandID", "0"),
("aggrType", "1"),
("enter_type", "1"),
)
acUrl = "https://is-lq.snssdk.com/video/app/article/full/15/2/{0}/{0}/1/0/".format(
tvid
)
getAccess = common.curl(
acUrl,
{
"method": "get",
"params": acParams,
"useragent": "Video 4.2.1 rv:4.2.1.4 (iPhone; iOS 12.2; zh_CN) Cronet",
},
)
getJson = common.loads(getAccess)
authToken = getJson["data"]["play_auth_token"]
pToken = getJson["data"]["play_biz_token"]
except:
isDash = 1
getToken = common.curl(
"https://www.ixigua.com/api/videov2/video_token?_signature=&vid=%s&isDash=%s&isLVideo=0"
% (vid, isDash)
)
getJson = common.loads(getToken)
authToken = getJson["data"]["AuthToken"]
pToken = getJson["data"]["BusinessToken"]
第一个api可以直接获取到未加密的1080P.MP4 但对于一些加密限制视频(https://www.ixigua.com/i6785164824050401799/) 无法解析不到ptoken和Authorization
第二个api获取到的是加密1080p.mp4,配合抖音api跳转未加密1080p.mp4
补充 https://github.com/nilaoda/Blog/issues/17
现在的头条接口好像不能获取1080P.mp4,只能获取到720P 1080P是dash格式,加密过的
try: isDash = 0 # 1:dash , 0:mp4 getToken = common.curl( "https://www.ixigua.com/api/videov2/video_token?_signature=&vid=%s&isDash=%s&isLVideo=0" % (vid, isDash) ) getJson = common.loads(getToken) authToken = getJson["data"]["AuthToken"] pToken = getJson["data"]["BusinessToken"] headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:72.0) Gecko/20100101 Firefox/72.0", "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Authorization": authToken, "Origin": "https://www.ixigua.com", "Connection": "keep-alive", "Referer": "https://www.ixigua.com/", } params = ( ("action", "GetPlayInfo"), ("video_id", vid), ("nobase64", "1"), ("ptoken", pToken), ("vfrom", "xgplayer"), ) url = "https://vas.snssdk.com/video/openapi/v1/" html = common.curl(url, {"method": "get", "header": headers, "params": params}) .... except: url = "http://i.snssdk.com/video/urls/1/toutiao/mp4/%s?nobase64=1" % vid html = common.curl(url)
从《囧妈》的缓存内容来看应该是有办法能获取到整段视频的(但是也加密过)
现在的头条接口好像不能获取1080P.mp4,只能获取到720P 1080P是dash格式,加密过的
try: isDash = 0 # 1:dash , 0:mp4 getToken = common.curl( "https://www.ixigua.com/api/videov2/video_token?_signature=&vid=%s&isDash=%s&isLVideo=0" % (vid, isDash) ) getJson = common.loads(getToken) authToken = getJson["data"]["AuthToken"] pToken = getJson["data"]["BusinessToken"] headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:72.0) Gecko/20100101 Firefox/72.0", "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Authorization": authToken, "Origin": "https://www.ixigua.com", "Connection": "keep-alive", "Referer": "https://www.ixigua.com/", } params = ( ("action", "GetPlayInfo"), ("video_id", vid), ("nobase64", "1"), ("ptoken", pToken), ("vfrom", "xgplayer"), ) url = "https://vas.snssdk.com/video/openapi/v1/" html = common.curl(url, {"method": "get", "header": headers, "params": params}) .... except: url = "http://i.snssdk.com/video/urls/1/toutiao/mp4/%s?nobase64=1" % vid html = common.curl(url)
从《囧妈》的缓存内容来看应该是有办法能获取到整段视频的(但是也加密过)
部分加密视频好像是无法直接获取到1080p,不清楚有没其他api 配合抖音API可以解析1080P,不过要先确定该片源有没有1080P分辨率 从ptoken来看,信息是加密的
一般:{"exp":1580823937,"ver":"v1","ak":"bab42eac5b9e4a8eb25a91fc371ad533","sub":"pgc_1080p"}
囧妈:{"exp":1580653162,"ver":"v1","ak":"cfc067bb39feff592af82085b42e6dc3","sub":"ixiguaweb_dash_encrypt_1min"}
从数据上看,api返回获取不到数据
https://www.ixigua.com/cinema/album/7YryFjfa3PE/
https://aweme.snssdk.com/aweme/v1/play/?video_id=v02043ae0000bjhr6a4qs4su94hpa0e0&line=0&ratio=1080p&watermark=0
一部分影视数据,用抖音api获取不到的跳转链接
哪位知道无水印接口怎么搞的, 能搞到的都是 /video/tos/hxsy/tos-hxsy-ve- 接口, 无水印接口 /video/tos/cn/tos-cn-v- 搞不到啊
https://www.ixigua.com/cinema/album/7YryFjfa3PE/ https://aweme.snssdk.com/aweme/v1/play/?video_id=v02043ae0000bjhr6a4qs4su94hpa0e0&line=0&ratio=1080p&watermark=0
一部分影视数据,用抖音api获取不到的跳转链接
可能全部影视都不行了(悲)
可以用这个接口(使用iPhone的UA访问):https://api-hl.amemv.com/aweme/v1/play/?video_id=v02004140000boleciimac2vul5c8dr0&ratio=1080p&watermark=0&h265=0
抖音API貌似搞不到2K和4K分辨率的视频?测试视频:https://www.ixigua.com/6785489916194193928/
@hlyzh 你解决了吗
这个问题解决了吗