Skip to content
This repository has been archived by the owner on Mar 8, 2023. It is now read-only.

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

Closed
Justsoos opened this issue Feb 10, 2018 · 19 comments · Fixed by #73
Closed

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

Justsoos opened this issue Feb 10, 2018 · 19 comments · Fixed by #73

Comments

@Justsoos
Copy link
Contributor

Justsoos commented Feb 10, 2018

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
Copy link
Owner

不确定是不是 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
Copy link

mengmo commented Feb 11, 2018

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

@Justsoos
Copy link
Contributor Author

Justsoos commented Feb 11, 2018

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
Copy link
Contributor Author

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

@Justsoos
Copy link
Contributor Author

Justsoos commented Feb 11, 2018

最终我是这么解决的:
封装一个名字叫 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
Copy link
Owner

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

@Justsoos
Copy link
Contributor Author

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

@Justsoos
Copy link
Contributor Author

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

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

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

@iawia002
Copy link
Owner

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

@Justsoos
Copy link
Contributor Author

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

@mengmo
Copy link

mengmo commented Feb 12, 2018

@Justsoos
Copy link
Contributor Author

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

@Justsoos
Copy link
Contributor Author

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

@Justsoos
Copy link
Contributor Author

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

@mengmo
Copy link

mengmo commented Feb 12, 2018

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

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

@mengmo
Copy link

mengmo commented Feb 12, 2018

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

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

@Justsoos
Copy link
Contributor Author

Justsoos commented Mar 4, 2018

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

@Justsoos
Copy link
Contributor Author

Justsoos commented Mar 4, 2018

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

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

@Justsoos
Copy link
Contributor Author

Justsoos commented Mar 13, 2018

更新:用 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 更新了,估计也没问题。#89

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants