iawia002 / Lulu

[Unmaintained] A simple and clean video/music/image downloader 👾
MIT License
817 stars 141 forks source link

是不是bilibili 对流作了反盗播设置?一直是ffmpeg: HTTP error 453 #54

Closed Justsoos closed 6 years ago

Justsoos commented 6 years ago

mpv "http://cn-hljheb2-cu-v-04.acgvideo.com/vg2/upgcxcode/11/47/29864711/29864711-1-64.flv?expires=1518294600&platform=pc&ssig=sA5Ce3OVkFbqX7lY8mQIWA&oi=2937407610&nfa=NdlCs+CQJ65YLKw7GGjUmA==&dynamic=1&hfa=2018253305&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=" Warning: option --sub-paths was replaced with --sub-file-paths and might be removed in the future. Driver 'opengl' has been replaced with 'gpu'! Driver 'opengl' has been replaced with 'gpu'! cplayer: Playing: http://cn-hljheb2-cu-v-04.acgvideo.com/vg2/upgcxcode/11/47/29864711/29864711-1-64.flv?expires=1518294600&platform=pc&ssig=sA5Ce3OVkFbqX7lY8mQIWA&oi=2937407610&nfa=NdlCs+CQJ65YLKw7GGjUmA==&dynamic=1&hfa=2018253305&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI= ffmpeg: http: HTTP error 453 stream: Failed to open http://cn-hljheb2-cu-v-04.acgvideo.com/vg2/upgcxcode/11/47/29864711/29864711-1-64.flv?expires=1518294600&platform=pc&ssig=sA5Ce3OVkFbqX7lY8mQIWA&oi=2937407610&nfa=NdlCs+CQJ65YLKw7GGjUmA==&dynamic=1&hfa=2018253305&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=. cplayer: cplayer: cplayer: Exiting... (Errors when loading file)

无论取出来流地址单独用mpv还是vlc播放,或者用 lulu -p mpv 都无法播放。其他网站都没问题。 ffmpeg: http: HTTP error 453 这个东东很奇怪啊。 但用 lulu 下载bilibili流没问题。

iawia002 commented 6 years ago

不确定是不是 b 站要校验 headers,你可以单独拿 ffmpeg 加 headers 来试一下

-headers "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"

类似这样的,Referer 最好也加上

mengmo commented 6 years ago

没记错的话,B站是要求Referer但不校验User-Agent的 记得在手机上抓包B站客户端UA是类似于这样的Lavf57.83.100

Justsoos commented 6 years ago

curl -v -O --user-agent "[Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36]" --referer "https://www.bilibili.com" "流地址" 用 curl 测了,上面带user agent 和referer 这个方式可以下载。

作了一系列测试:

第一: 换成 user-agent Lavf57.83.100curl/7.47.0 返回 HTTP/1.1 459 错误。但是 user-agent 强制留空也可以!也就是 @iawia002 说的情况。必须要带一个正常浏览器的user agent,或者干脆空置,用curl 和其他UA会被禁止

UA换成 UCWEB7.0.2.37/28/999 HTTPie/0.9.2 竟然也可以,看来B站对浏览器检查不见得是挺多样,而是对 curl 等 UA 作了敏感瓷封禁!

第二: referer 改成 bilibili.com 或者 www.bilibili.com 返回错误 HTTP/1.1 454 ,用 http://bilibili.com 就能通过。看来B站技术也是用^http://来正则的.

不带 referer,则返回错误 453,也就是首贴和 @mengmo 说的情况,必须要一个 http://开头的包含 bilibili.com 地址的referer。

Justsoos commented 6 years ago

mpv --no-ytdl --http-header-fields="referer: https://www.bilibili.com" "流地址" 用这个命令搞定 mpv 了。 B站看来在token失效情况下,可能出403 error,也可能出473 error。看来mpv 的UA目前还没被封。

Justsoos commented 6 years ago

最终我是这么解决的: 封装一个名字叫 bb 的bash 脚本:

#!/bin/bash
mpv --no-ytdl --quiet --user-agent "[]" --http-header-fields="referer: https://www.bilibili.com" $@

然后用 lulu -p 来调用,就可以用了: lulu -p bb B站页面地址

iawia002 commented 6 years ago

其实可以写到 lulu 里面,调用 Player 的时候多加个参数

Justsoos commented 6 years ago

但这些参数是 播放器 本身的参数啊,预先不知道用户使用那些播放器,每个播放器都不一样。 如果用 ffmpeg 在前面套一下,把参数做到 ffmpeg 里,看似解决了问题,但很多播放器的流控就做不了了。 这事儿麻烦就麻烦在这了。

Justsoos commented 6 years ago

哈,无意中,解决了youku 直接播放问题(没有这个脚本,播放中切换不同流时会中断): 设置脚本yykk:

#!/bin/bash
mpv --quiet --no-ytdl --user-agent "[]" --http-header-fields="referer: http://movie.youku.com" $@

如下即可全本播放: lulu -p yykk 优酷页面

iawia002 commented 6 years ago

我没仔细看过调用播放器的代码,我还是觉得这个应该写到 lulu 里,不行就先只适配 mpv

Justsoos commented 6 years ago

作适配也是可行的,只要先判断一下播放器的名字,判断一下refer,把参数塞进去。 另外说一下,mpv 的开发可能英文有点奇怪,是--referrer

mengmo commented 6 years ago

@Justsoos Referrer 还是 Referer?

Justsoos commented 6 years ago

mpv 选项名字是前面这个双写 r 的,但 RFC 和参数里是没有双写 r 的。 我还特意去求证了一下,原来 RFC 里是笔误,但最早成为标准后,也就只好如此了。

Justsoos commented 6 years ago

哈哈,我还以为你发的疑问句,后来才发现是个链接文章 @mengmo

Justsoos commented 6 years ago

再补充一下,mpv user-agent 也有点奇怪,用空参数 "",或者空格" ",B站都会返回错误。 最后只好用了个"[ ]",反而没问题了。 但用 curl 的同样空 UA 就不会返回错误。 另外用 curl 习惯了,一直是 --referer

mengmo commented 6 years ago

刚看了下nginxlog""" " nginx记录的都是"",而这样"-"的记录在nginxlog里才是表示留空。 看来还是触发了B站UA黑名单机制

curl --user-agent ""的记录是正常的"-"

mengmo commented 6 years ago

查了一下,上边的结果意味着:mpv --user-agent ""的效果并不是UA留空,而是请求头里压根儿就没有User-Agent这一段

刚又抓了一下包,我手机上装的B站客户端User-Agent Mozilla/5.0 BiliDroid/1.12.0 (bbcallen@gmail.com) 也不知道什么时候改的?

Justsoos commented 6 years ago

其他各种 UA 都不行了,你这个还可用 Mozilla/5.0 BiliDroid/1.12.0 (bbcallen@gmail.com)。B站这么疯狂的改来改去,真是带宽压力好大吧。

Justsoos commented 6 years ago

哈哈哈,我发现了,还是我这个方法可用,其他方法都不行了。B站真是疯狂折腾啊

#!/bin/bash mpv --no-ytdl --quiet --user-agent "[]" --http-header-fields="referer: https://www.bilibili.com" $@

Justsoos commented 6 years ago

更新:用 you-get 解出来的b站流地址,用下面脚本,mpv 基本都可以播

#!/bin/bash
mpv --quiet --no-ytdl --user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0" --referrer="https://www.bilibili.com/" $@

等 lulu 更新了,估计也没问题。https://github.com/iawia002/Lulu/issues/89