Python 接口请求诡异问题求解 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yzql2018
V2EX    问与答

Python 接口请求诡异问题求解

  •  
  •   yzql2018 2023 年 8 月 5 日 1488 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Python 使用 requests 模拟接口请求,登录接口会返回一个 token ,将这个 token 放入第二个接口请求头 authorize 中即可返回数据。登录接口响应体的 content-type: text/html; charset= ,我使用以下代码解码:

    response_json = json.loads(response.text) token = response_json["accessToken"] print(token) 

    将得到的 token 放入第二个接口的请求头中,按道理应该可以返回 200 的,但实际返回 403 错误。也就是 token 没通过验证。

    诡异的事情来了,我在控制台将 token 输出并复制,然后在代码里将复制的 token 赋值给一个变量,放入第二个接口的请求头中,再次请求竟然返回 200 了。

    对比了原始响应的值和 Python 解码后的值完全一样,反复几次都是如此,只要是手动复制的字符串就没问题,放入代码解码后的 token 变量就会 403 。

    我都快怀疑人生了,各位大佬,有知道从哪个方面着手排除问题的吗?

    token 本身是 base64 编码的,一个实例如下:

    eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiSW5kaXZpZHVhbCIsInVzZXJJZCI6IjZSbU9OREZ6QVBBWlgxaTc1TmVDcXc9PSIsImVtYWlsIjoiRjlmNmhYYXlNNVNsRGZMMDFPWFdwNlVpazZ3bnc0bXhLdVowbm9IaXd0eU1FaXRDbVQ4Z2dPUC8zU1QzbzZHWCIsIm5iZiI6MTY5MTIxMzAwMSwiZXhwIjoxNjkxMjE5MDAxLCJpYXQiOjE2OTEyMTMwMDF9.I0gBdO4xM0CPIW0_ifVGnq7PmyDTjXQJeh8iYgqsJ1iOA0-WHNvswN81_pUWQFOVJ9hlP-YM5M5dsLyP7Oc2Xw 

    编码后的字符串会有几个特殊符号,点、-、_、/ 。

    11 条回复    2023-08-07 07:59:28 +08:00
    Trim21
        1
    Trim21  
       2023 年 8 月 5 日
    加个 time.sleep 试试,说不定是因为手动复制多了个延时...
    arischow
        2
    arischow  
       2023 年 8 月 5 日 via iPhone
    看 devtools ,把能成功返回的 200 的 request headers 都放到代码里的构造体,一个一个排除原因
    yzql2018
        3
    yzql2018  
    OP
       2023 年 8 月 5 日
    @arischow 怪我没说清楚,这些都是发生在本地 IDE 里的。所以可以排除 headers 的问题。就是将 Python 解码后字符串直接复制到代码定义一个变量可以返回 200 ,但是直接解码后的 token 变量放入第二个接口的请求头就诡异的返回 403 。诡异就诡异在这里,解码的跟我手动复制的是一个字符串啊,区别就是一个复制了一遍,一个解码后直接赋给一个变量。
    15855pm
        4
    15855pm  
       2023 年 8 月 5 日
    token = response_json["accessToken"]
    断点看一下这个变量是不是 str 类型呗,其实还有个思路是配置一下抓包,对比两次请求的差异就知道了
    hsfzxjy
        5
    hsfzxjy  
       2023 年 8 月 5 日 via Android
    建议把两次的二进制表示都打出来比较,你看到的不一定是你看到的
    yzql2018
        6
    yzql018  
    OP
       2023 年 8 月 5 日
    @hsfzxjy 输出了二进制比较,是一样的啊!
    yzql2018
        7
    yzql2018  
    OP
       2023 年 8 月 5 日
    @hsfzxjy 怀疑解码后的原始 token 有不可见字符,经过手动复制,去除了不可见字符。
    yzql2018
        8
    yzql2018  
    OP
       2023 年 8 月 5 日
    @15855pm 断点看过了,是 str 类型,抓包怎么抓,有 win7 上的抓包工具推荐吗?
    yzql2018
        9
    yzql2018  
    OP
       2023 年 8 月 5 日
    抓包也抓过了,用对比工具对比了一下两种情况的请求体,结果都一样。各位大哥,救救小弟啊!怎么会有这么诡异的问题啊!
    xinqianbobo
        10
    xinqianbobo  
       2023 年 8 月 6 日
    可以的话,贴点图更好判断发现问题
    跨域了?
    yzql2018
        11
    yzql2018  
    OP
       2023 年 8 月 7 日
    @xinqianbobo 没有啊,登录和后续接口都在一个域名下面,其他接口带 token 认证都 200 ,这个接口带 token 认证返回 403 。复制 token 认证返回 200 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1092 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:56 PVG 01:56 LAX 09:56 JFK 12:56
    Do have faith in what you're doing.
    ubao msn 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