火狐字段中的省略号给我踩了个坑……记一次访问 B 站 API 的神奇操作 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
bczhc
V2EX    程序员

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

  •  
  •   bczhc 131 天前 2684 次点击
    这是一个创建于 131 天前的主题,其中的信息可能已经有所发展或是发生改变。

    火狐字段中的省略号给我踩了个坑……记一次访问 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  
       131 天前
    哈哈哈哈这多一个少一个字符都不会刚好替换成功吧,今天点背,买张彩票吧
    guanzhangzhang
        2
    guanzhangzhang  
       131 天前   1
    不是先 chrome 里类似 copy as a curl bash 吗
    macaodoll
        3
    macaodoll  
       131 天前   1
    这是自己的问题啊,省略号很无辜
    wyntalgeer
        4
    wyntalgeer  
       131 天前
    过长压缩常规操作,这不仅是浏览器的坑
    bczhc
        5
    bczhc  
    OP
       131 天前   1
    其实重点不是这个省略号,而是这个省略号仅仅被 JB HTTP 错误地替换成问号之后,Bilibili API 反而调用成功。此时的 SESSDATA 依然是一个不完整的、没有展开完的值。
    7gugu
        6
    7gugu  
       131 天前
    Firefox 这个就是个坑,很容易踩,而且他们还不屑于去修
    BN5MDKFM
        7
    BN5MDKFM  
       131 天前
    B 站是不是躺枪了
    liaohongxing
        8
    liaohongxing  
       131 天前
    为什么不用右键菜单复制值呢,非要去全选?
    renmu
        9
    renmu  
       131 天前 via Android
    火狐这个真的挺坑的
    tammy
        10
    tammy  
       131 天前   1
    @liaohongxing 我也想问,毕竟如果从右到左的环境手动选择还可能还会有控制符的问题
    3dward
        11
    3dward  
       131 天前 via Android
    这是 HTTP header 规范,严格控制的话,是需要转换。
    也就是说 Bilibili HTTP server 实现是 strict 模式。
    而 cookie 里的包含省略号的这部分信息后端没有严格校验,估计是可选信息
    MrKrabs
        12
    MrKrabs  
       130 天前   1
    被 rust 做局了
    sunnysab
        13
    sunnysab  
       130 天前
    我也被这个省略号坑过……调了半天才找到原因
    liuidetmks
        14
    liuidetmks  
       130 天前
    曾经直接复制 cookie 总是不通,拷贝为 curl ,然后读取就好了
    LZWDRWEB
        15
    LZWDRWEB  
       130 天前
    我去,这思路
    nuII
        16
    nuII  
       130 天前
    +1 ,上过一次当之后就不再自己手动选中再 ctrl c 了,只用右键的复制功能
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2803 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:55 PVG 22:55 LAX 07:55 JFK 10:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86