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

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

  •  
  •   luboyan · 2022-08-15 09:36:36 +08:00 · 910 次点击
    这是一个创建于 835 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述:

    遇到一个网页提交的数据是 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"}}
    

    vaayFO.md.png
    vadfCF.md.png

    第一种尝试,直接传入字典-结果是乱码(正确应该是 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)
    

    vaaz7V.md.png

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

    vaa6YD.md.png

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

    vada4S.md.png

    6 条回复    2022-08-15 12:43:25 +08:00
    fkdtz
        1
    fkdtz  
       2022-08-15 10:41:06 +08:00
    猜测第一种请求方式是对的,不过返回的是加密后的内容比如 AES ,你需要找到密钥解密。
    luboyan
        2
    luboyan  
    OP
       2022-08-15 10:45:13 +08:00
    @fkdtz 如果是加密的用 fiddle 重发请求应该是获取不到明文数据把
    Trim21
        3
    Trim21  
       2022-08-15 10:45:36 +08:00 via Android
    这是 graphql 吧?
    Trim21
        4
    Trim21  
       2022-08-15 10:48:27 +08:00 via Android
    我猜你第一种方法是对的,但是 requests 判断相应编码出错了。你看看 Fiddle 的响应头和 requests 的响应编码能不能对得上。
    luboyan
        5
    luboyan  
    OP
       2022-08-15 10:56:22 +08:00
    @Trim21 是的,厉害啊大佬,我去看看
    luboyan
        6
    luboyan  
    OP
       2022-08-15 12:43:25 +08:00
    破案了,不管是方法一还是二,都可以解决,和 graphql 关系也不大,是因为请求头使用了网页端的
    Accept-Encoding: gzip, deflate, br
    默认采用了 br 压缩,只要修改成
    Accept-Encoding:deflate
    就可以正确读取到数据,谢谢大佬们的指点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5625 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:03 · PVG 14:03 · LAX 22:03 · JFK 01:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.