V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yzql2018
V2EX  ›  问与答

Python 接口请求诡异问题求解

  •  
  •   yzql2018 · 2023-08-05 13:46:39 +08:00 · 935 次点击
    这是一个创建于 511 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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