Closed Justsoos closed 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
最好也加上
没记错的话,B站
是要求Referer
但不校验User-Agent
的
记得在手机上抓包B站客户端
的UA
是类似于这样的Lavf57.83.100
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.100
和 curl/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。
mpv --no-ytdl --http-header-fields="referer: https://www.bilibili.com" "流地址"
用这个命令搞定 mpv 了。
B站看来在token失效情况下,可能出403 error,也可能出473 error。看来mpv 的UA目前还没被封。
最终我是这么解决的: 封装一个名字叫 bb 的bash 脚本:
#!/bin/bash
mpv --no-ytdl --quiet --user-agent "[]" --http-header-fields="referer: https://www.bilibili.com" $@
然后用 lulu -p 来调用,就可以用了:
lulu -p bb B站页面地址
其实可以写到 lulu 里面,调用 Player 的时候多加个参数
但这些参数是 播放器 本身的参数啊,预先不知道用户使用那些播放器,每个播放器都不一样。 如果用 ffmpeg 在前面套一下,把参数做到 ffmpeg 里,看似解决了问题,但很多播放器的流控就做不了了。 这事儿麻烦就麻烦在这了。
哈,无意中,解决了youku 直接播放问题(没有这个脚本,播放中切换不同流时会中断): 设置脚本yykk:
#!/bin/bash
mpv --quiet --no-ytdl --user-agent "[]" --http-header-fields="referer: http://movie.youku.com" $@
如下即可全本播放:
lulu -p yykk 优酷页面
我没仔细看过调用播放器的代码,我还是觉得这个应该写到 lulu 里,不行就先只适配 mpv
作适配也是可行的,只要先判断一下播放器的名字,判断一下refer,把参数塞进去。
另外说一下,mpv 的开发可能英文有点奇怪,是--referrer
@Justsoos Referrer 还是 Referer?
mpv 选项名字是前面这个双写 r 的,但 RFC 和参数里是没有双写 r 的。 我还特意去求证了一下,原来 RFC 里是笔误,但最早成为标准后,也就只好如此了。
哈哈,我还以为你发的疑问句,后来才发现是个链接文章 @mengmo
再补充一下,mpv user-agent 也有点奇怪,用空参数 "",或者空格" ",B站都会返回错误。
最后只好用了个"[ ]",反而没问题了。
但用 curl 的同样空 UA 就不会返回错误。
另外用 curl 习惯了,一直是 --referer
刚看了下nginx
的log
,""
和" "
nginx
记录的都是""
,而这样"-"
的记录在nginx
的log
里才是表示留空。
看来还是触发了B站
的UA
黑名单机制
curl --user-agent ""
的记录是正常的"-"
查了一下,上边的结果意味着:mpv --user-agent ""
的效果并不是UA留空
,而是请求头里压根儿就没有User-Agent
这一段
刚又抓了一下包,我手机上装的B站客户端
的User-Agent
Mozilla/5.0 BiliDroid/1.12.0 (bbcallen@gmail.com)
也不知道什么时候改的?
其他各种 UA 都不行了,你这个还可用 Mozilla/5.0 BiliDroid/1.12.0 (bbcallen@gmail.com)
。B站这么疯狂的改来改去,真是带宽压力好大吧。
哈哈哈,我发现了,还是我这个方法可用,其他方法都不行了。B站真是疯狂折腾啊
#!/bin/bash mpv --no-ytdl --quiet --user-agent "[]" --http-header-fields="referer: https://www.bilibili.com" $@
更新:用 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
无论取出来流地址单独用mpv还是vlc播放,或者用 lulu -p mpv 都无法播放。其他网站都没问题。
ffmpeg: http: HTTP error 453
这个东东很奇怪啊。 但用 lulu 下载bilibili流没问题。