V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bczhc
V2EX  ›  程序员

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

  •  
  •   bczhc · 2 天前 · 2060 次点击

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