luboyan
V2EX  ›  问与答

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

  •  
  •   luboyan · Aug 15, 2022 · 1550 views
    This topic created in 1365 days ago, the information mentioned may be changed or developed.

    问题描述:

    遇到一个网页提交的数据是 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 replies    2022-08-15 12:43:25 +08:00
    fkdtz
        1
    fkdtz  
       Aug 15, 2022
    猜测第一种请求方式是对的,不过返回的是加密后的内容比如 AES ,你需要找到密钥解密。
    luboyan
        2
    luboyan  
    OP
       Aug 15, 2022
    @fkdtz 如果是加密的用 fiddle 重发请求应该是获取不到明文数据把
    Trim21
        3
    Trim21  
       Aug 15, 2022 via Android
    这是 graphql 吧?
    Trim21
        4
    Trim21  
       Aug 15, 2022 via Android
    我猜你第一种方法是对的,但是 requests 判断相应编码出错了。你看看 Fiddle 的响应头和 requests 的响应编码能不能对得上。
    luboyan
        5
    luboyan  
    OP
       Aug 15, 2022
    @Trim21 是的,厉害啊大佬,我去看看
    luboyan
        6
    luboyan  
    OP
       Aug 15, 2022
    破案了,不管是方法一还是二,都可以解决,和 graphql 关系也不大,是因为请求头使用了网页端的
    Accept-Encoding: gzip, deflate, br
    默认采用了 br 压缩,只要修改成
    Accept-Encoding:deflate
    就可以正确读取到数据,谢谢大佬们的指点。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1023 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 22:11 · PVG 06:11 · LAX 15:11 · JFK 18:11
    ♥ Do have faith in what you're doing.