需要访问一下 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 中的…
手动替换为?
,请求也成功。这太离谱了……火狐这个小小省略号坑让我排查了有一会儿了,根本看不出啊
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.