• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bczhc
V2EX  ›  程序员

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

  •  
  •   bczhc · Jun 4, 2025 · 3968 views
    This topic created in 521 days ago, the information mentioned may be changed or developed.

    火狐字段中的省略号给我踩了个坑……记一次访问 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 值,好家伙,一个字符差异,如下图:

    image

    再到火狐里一看,因为我是直接选择复制的,谁知它给我折叠出一个省略号,导致直接复制下了省略号,不完整的信息导致了 Ruby HTTP 请求失败。

    image

    然而真正造成这个问题迷惑性的还是得是 IntelliJ HTTP Client 。我复制下来 Cookie 中的省略号不属于 ASCII ,而 JB 的 HTTP 在请求时会直接把非 ASCII 替换为一个?,示例如下,前者为 JB HTTP 的请求写法,后者为 mitmproxy 的抓包内容:

    image

    image

    这就造成了上方比较中一个英文问号的差异。然而最最神奇的是,在…被 JB HTTP 替换为?后,此 B 站 API 反而阴差阳错地能被请求成功了。我把 Ruby 中的…手动替换为?,请求也成功。这太离谱了……火狐这个小小省略号坑让我排查了有一会儿了,根本看不出啊。当然最根本的解决操作还是得要在火狐里右键选“Copy Value”而不是直接复制。

    16 replies  •  2025-06-05 15:07:55 +08:00
    edward1987
    edward1987
    Jun 4, 2025
    1
    哈哈哈哈这多一个少一个字符都不会刚好替换成功吧,今天点背,买张彩票吧🐶
    guanzhangzhang
    guanzhangzhang
    Jun 4, 2025❤️1
    2
    不是先 chrome 里类似 copy as a curl bash 吗
    macaodoll
    macaodoll
    Jun 4, 2025❤️1
    3
    这是自己的问题啊,省略号很无辜
    wyntalgeer
    wyntalgeer
    Jun 4, 2025
    4
    过长压缩常规操作,这不仅是浏览器的坑
    bczhc
    bczhc
    OP
    Jun 4, 2025❤️1
    5
    其实重点不是这个省略号,而是这个省略号仅仅被 JB HTTP 错误地替换成问号之后,Bilibili API 反而调用成功。此时的 SESSDATA 依然是一个不完整的、没有展开完的值。
    7gugu
    7gugu
    Jun 4, 2025
    6
    Firefox 这个就是个坑,很容易踩,而且他们还不屑于去修
    BN5MDKFM
    BN5MDKFM
    Jun 4, 2025
    7
    B 站是不是躺枪了
    liaohongxing
    liaohongxing
    Jun 4, 2025
    8
    为什么不用右键菜单复制值呢,非要去全选?
    renmu
    renmu
    Jun 4, 2025 via Android
    9
    火狐这个真的挺坑的
    tammy
    tammy
    Jun 4, 2025❤️1
    10
    @liaohongxing 我也想问,毕竟如果从右到左的环境手动选择还可能还会有控制符的问题
    3dward
    3dward
    Jun 4, 2025 via Android
    11
    这是 HTTP header 规范,严格控制的话,是需要转换。
    也就是说 Bilibili HTTP server 实现是 strict 模式。
    而 cookie 里的包含省略号的这部分信息后端没有严格校验,估计是可选信息
    MrKrabs
    MrKrabs
    Jun 5, 2025❤️1
    12
    被 rust 做局了
    sunnysab
    sunnysab
    Jun 5, 2025
    13
    我也被这个省略号坑过……调了半天才找到原因
    liuidetmks
    liuidetmks
    Jun 5, 2025
    14
    曾经直接复制 cookie 总是不通,拷贝为 curl ,然后读取就好了
    LZWDRWEB
    LZWDRWEB
    Jun 5, 2025
    15
    我去,这思路
    nuII
    nuII
    Jun 5, 2025
    16
    +1 ,上过一次当之后就不再自己手动选中再 ctrl c 了,只用右键的复制功能
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1686 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 10:36 · PVG 18:36 · LAX 02:36 · JFK 05:36
    ♥ Do have faith in what you're doing.