火狐字段中的省略号给我踩了个坑……记一次访问 B 站 API 的神奇操作

112 天前
 bczhc

火狐字段中的省略号给我踩了个坑……记一次访问 B 站 API 的神奇操作

需要访问一下 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”而不是直接复制。

2653 次点击
所在节点    程序员
16 条回复
edward1987
112 天前
哈哈哈哈这多一个少一个字符都不会刚好替换成功吧,今天点背,买张彩票吧🐶
guanzhangzhang
112 天前
不是先 chrome 里类似 copy as a curl bash 吗
macaodoll
112 天前
这是自己的问题啊,省略号很无辜
wyntalgeer
112 天前
过长压缩常规操作,这不仅是浏览器的坑
bczhc
112 天前
其实重点不是这个省略号,而是这个省略号仅仅被 JB HTTP 错误地替换成问号之后,Bilibili API 反而调用成功。此时的 SESSDATA 依然是一个不完整的、没有展开完的值。
7gugu
112 天前
Firefox 这个就是个坑,很容易踩,而且他们还不屑于去修
BN5MDKFM
112 天前
B 站是不是躺枪了
liaohongxing
112 天前
为什么不用右键菜单复制值呢,非要去全选?
renmu
112 天前
火狐这个真的挺坑的
tammy
112 天前
@liaohongxing 我也想问,毕竟如果从右到左的环境手动选择还可能还会有控制符的问题
3dward
112 天前
这是 HTTP header 规范,严格控制的话,是需要转换。
也就是说 Bilibili HTTP server 实现是 strict 模式。
而 cookie 里的包含省略号的这部分信息后端没有严格校验,估计是可选信息
MrKrabs
111 天前
被 rust 做局了
sunnysab
111 天前
我也被这个省略号坑过……调了半天才找到原因
liuidetmks
111 天前
曾经直接复制 cookie 总是不通,拷贝为 curl ,然后读取就好了
LZWDRWEB
111 天前
我去,这思路
nuII
111 天前
+1 ,上过一次当之后就不再自己手动选中再 ctrl c 了,只用右键的复制功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1136336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX