Python 接口请求诡异问题求解

2023-08-05 13:46:39 +08:00
 yzql2018

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

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

931 次点击
所在节点    问与答
11 条回复
Trim21
2023-08-05 13:49:38 +08:00
加个 time.sleep 试试,说不定是因为手动复制多了个延时...
arischow
2023-08-05 13:54:15 +08:00
看 devtools ,把能成功返回的 200 的 request headers 都放到代码里的构造体,一个一个排除原因
yzql2018
2023-08-05 14:07:00 +08:00
@arischow 怪我没说清楚,这些都是发生在本地 IDE 里的。所以可以排除 headers 的问题。就是将 Python 解码后字符串直接复制到代码定义一个变量可以返回 200 ,但是直接解码后的 token 变量放入第二个接口的请求头就诡异的返回 403 。诡异就诡异在这里,解码的跟我手动复制的是一个字符串啊,区别就是一个复制了一遍,一个解码后直接赋给一个变量。
15855pm
2023-08-05 14:19:16 +08:00
token = response_json["accessToken"]
断点看一下这个变量是不是 str 类型呗,其实还有个思路是配置一下抓包,对比两次请求的差异就知道了
hsfzxjy
2023-08-05 14:31:39 +08:00
建议把两次的二进制表示都打出来比较,你看到的不一定是你看到的
yzql2018
2023-08-05 15:48:08 +08:00
@hsfzxjy 输出了二进制比较,是一样的啊!
yzql2018
2023-08-05 15:51:11 +08:00
@hsfzxjy 怀疑解码后的原始 token 有不可见字符,经过手动复制,去除了不可见字符。
yzql2018
2023-08-05 15:56:49 +08:00
@15855pm 断点看过了,是 str 类型,抓包怎么抓,有 win7 上的抓包工具推荐吗?
yzql2018
2023-08-05 18:08:52 +08:00
抓包也抓过了,用对比工具对比了一下两种情况的请求体,结果都一样。各位大哥,救救小弟啊!怎么会有这么诡异的问题啊!
xinqianbobo
2023-08-06 21:34:19 +08:00
可以的话,贴点图更好判断发现问题
跨域了?
yzql2018
2023-08-07 07:59:28 +08:00
@xinqianbobo 没有啊,登录和后续接口都在一个域名下面,其他接口带 token 认证都 200 ,这个接口带 token 认证返回 403 。复制 token 认证返回 200 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/962613

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX