需要访问一下 B 站点赞 API ,按惯例,浏览器进 B 站按 F12 ,记下 Cookie ,带上 Cookie 就去 Ruby 里写脚本。
可程序怎么都获取不了信息,返回登录错误。然而,把同样的 Cookie 和 URL 在 IntelliJ HTTP Client (以下简称为 JB HTTP )里再执行一遍,竟可以访问,类似如下:
# @no-cookie-jar
GET https://api.bilibili.com/x/msgfeed/like
Content-Type: application/json
Cookie: XXXXXX
我检查再三,没发现任何问题。同样的 Cookie 和 URL 字段,在代码中访问不了,在 JB 家的 HTTP 客户端中可以访问,大家能猜猜会是什么导致的么?
………………………………………………
好了,最终无法,只能使用 mitmproxy 抓下包,倒要看看到底问题出在哪里。把 mitmproxy 里的 Cookie 记下,拆分再重新排序(因为 IntelliJ HTTP Client 貌似把 Cookie 顺序重排了),之后比较 Ruby 和 IntelliJ 请求的 Cookie 值,好家伙,一个字符差异,如下图:
再到火狐里一看,因为我是直接选择复制的,谁知它给我折叠出一个省略号,导致直接复制下了省略号,不完整的信息导致了 Ruby HTTP 请求失败。
然而真正造成这个问题迷惑性的还是得是 IntelliJ HTTP Client 。我复制下来 Cookie 中的省略号不属于 ASCII ,而 JB 的 HTTP 在请求时会直接把非 ASCII 替换为一个?
,示例如下,前者为 JB HTTP 的请求写法,后者为 mitmproxy 的抓包内容:
这就造成了上方比较中一个英文问号的差异。然而最最神奇的是,在…
被 JB HTTP 替换为?
后,此 B 站 API 反而阴差阳错地能被请求成功了。我把 Ruby 中的…
手动替换为?
,请求也成功。这太离谱了……火狐这个小小省略号坑让我排查了有一会儿了,根本看不出啊。当然最根本的解决操作还是得要在火狐里右键选“Copy Value”而不是直接复制。
![]() |
1
edward1987 2 天前
哈哈哈哈这多一个少一个字符都不会刚好替换成功吧,今天点背,买张彩票吧🐶
|
![]() |
2
guanzhangzhang 2 天前 ![]() |
3
macaodoll 2 天前 ![]() 这是自己的问题啊,省略号很无辜
|
![]() |
4
wyntalgeer 2 天前
过长压缩常规操作,这不仅是浏览器的坑
|
5
bczhc OP ![]() 其实重点不是这个省略号,而是这个省略号仅仅被 JB HTTP 错误地替换成问号之后,Bilibili API 反而调用成功。此时的 SESSDATA 依然是一个不完整的、没有展开完的值。
|
![]() |
6
7gugu 2 天前
Firefox 这个就是个坑,很容易踩,而且他们还不屑于去修
|
![]() |
7
BN5MDKFM 2 天前
B 站是不是躺枪了
|
8
liaohongxing 2 天前
为什么不用右键菜单复制值呢,非要去全选?
|
9
renmu 2 天前 via Android
火狐这个真的挺坑的
|
![]() |
10
tammy 1 天前 ![]() @liaohongxing 我也想问,毕竟如果从右到左的环境手动选择还可能还会有控制符的问题
|
11
3dward 1 天前 via Android
这是 HTTP header 规范,严格控制的话,是需要转换。
也就是说 Bilibili HTTP server 实现是 strict 模式。 而 cookie 里的包含省略号的这部分信息后端没有严格校验,估计是可选信息 |
12
MrKrabs 1 天前 ![]() 被 rust 做局了
|
![]() |
13
sunnysab 1 天前
我也被这个省略号坑过……调了半天才找到原因
|
14
liuidetmks 1 天前
曾经直接复制 cookie 总是不通,拷贝为 curl ,然后读取就好了
|
![]() |
15
LZWDRWEB 1 天前
我去,这思路
|
16
nuII 1 天前
+1 ,上过一次当之后就不再自己手动选中再 ctrl c 了,只用右键的复制功能
|