[ Python ] requests 问题 json query 语句 post 传输问题

2022-08-15 09:36:36 +08:00
 luboyan

问题描述:

遇到一个网页提交的数据是 json 格式,但是里面传入的参数一个是 json query 的查询语句,一个是用户名,使用 Fiddle 可以重发看获取到返回结果,用 python 提交就不行,应该是 json 在传输的过程中没有被正确识别,求大佬指教。

代码表述:

网页端原传入参数为

{"query":"\n    query Profile($usernameOrAddress: String!) {\n  profile(usernameOrAddress: $usernameOrAddress) {\n    id\n    username\n    pfp {\n      ...FullBareAsset\n    }\n    decagon {\n      ...FullBareAsset\n    }\n    banner {\n      ...FullBareAsset\n    }\n    bio\n    twitterUsername\n    discordUsername\n    showListings\n    addresses\n    followedByCount\n    followingCount\n  }\n}\n    \n    fragment FullBareAsset on BareAsset {\n  id\n  provider\n  contract\n  tokenId\n  mediaUrl\n  previewStorageKey\n  previewMimeType\n  previewAspectRatio\n  storageKey\n  mimeType\n  tokenUrl\n  name\n  multimediaUrl\n  aspectRatio\n  metadata\n}\n    ","variables":{"usernameOrAddress":"Datdz172"}}


第一种尝试,直接传入字典-结果是乱码(正确应该是 json 格式的数据)

k = {"query":"\n    query Profile($usernameOrAddress: String!) {\n  profile(usernameOrAddress: $usernameOrAddress) {\n    id\n    username\n    pfp {\n      ...FullBareAsset\n    }\n    decagon {\n      ...FullBareAsset\n    }\n    banner {\n      ...FullBareAsset\n    }\n    bio\n    twitterUsername\n    discordUsername\n    showListings\n    addresses\n    followedByCount\n    followingCount\n  }\n}\n    \n    fragment FullBareAsset on BareAsset {\n  id\n  provider\n  contract\n  tokenId\n  mediaUrl\n  previewStorageKey\n  previewMimeType\n  previewAspectRatio\n  storageKey\n  mimeType\n  tokenUrl\n  name\n  multimediaUrl\n  aspectRatio\n  metadata\n}\n    ","variables":{"usernameOrAddress":"Datdz172"}}
response = requests.post(APIurl, proxies=proxies, json=k, headers=header, verify=False)

第二种尝试,直接传入字典,但是把双引号修改单引号,并把\n 去除-结果是乱码(正确应该是 json 格式的数据)

第三种尝试,对原传入内容进行 json.dumps 格式化,但是把双引号修改单引号,-结果是 POST body missing (正确应该是 json 格式的数据)

905 次点击
所在节点    问与答
6 条回复
fkdtz
2022-08-15 10:41:06 +08:00
猜测第一种请求方式是对的,不过返回的是加密后的内容比如 AES ,你需要找到密钥解密。
luboyan
2022-08-15 10:45:13 +08:00
@fkdtz 如果是加密的用 fiddle 重发请求应该是获取不到明文数据把
Trim21
2022-08-15 10:45:36 +08:00
这是 graphql 吧?
Trim21
2022-08-15 10:48:27 +08:00
我猜你第一种方法是对的,但是 requests 判断相应编码出错了。你看看 Fiddle 的响应头和 requests 的响应编码能不能对得上。
luboyan
2022-08-15 10:56:22 +08:00
@Trim21 是的,厉害啊大佬,我去看看
luboyan
2022-08-15 12:43:25 +08:00
破案了,不管是方法一还是二,都可以解决,和 graphql 关系也不大,是因为请求头使用了网页端的
Accept-Encoding: gzip, deflate, br
默认采用了 br 压缩,只要修改成
Accept-Encoding:deflate
就可以正确读取到数据,谢谢大佬们的指点。

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

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

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

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

© 2021 V2EX