如何将curl数据库转换成python请求?

2024-10-02 18:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有curl命令:

curl 'https://example.com/submit' \
    -H 'Accept: */*' \
    -H 'Referer: http://www.example.com/go/' \
    -H 'Origin: http://www.example.com' \
    -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' \
    -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryFkQeCsmEXjVI5SJ0' \
    --data-binary $'------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\nContent-Disposition: form-data; name="firstName"\r\n\r\Oleg\r\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\nContent-Disposition: form-data; name="campaignCode"\r\n\r\n\r\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\nContent-Disposition: form-data; name="validation"\r\n\r\n{"firstName":"required"}\r\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0--\r\n' \
    --compressed

有:

^{pr2}$

但是我转换成python代码的版本不起作用 在

import requests

headers = {
    'Accept': '*/*',
    'Referer': 'http://www.example.com/go',
    'Origin': 'http://www.example.com',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryFkQeCsmEXjVI5SJ0'
}

data = '$------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="firstName"\\r\\n\\r\\Oleg\\r\\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="campaignCode"\\r\\n\\r\\n\\r\\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="validation"\\r\\n\\r\\n{"firstName":"required"}\\r\\n------WebKitFormBoundaryFkQeCsmEXjVI5SJ0--\\r\\n'

response = requests.post('https://example.com/submit', headers=headers,
                         data=data)

也许我遗漏了什么?如何转换--data-binary $?在

curl命令返回:{"success":true,"count":1},而pycode返回:{"success":false,"count":1}

也有错误:

  1. data字符串响应中没有$,字符串响应{"success":false,"count":0}

  2. 使用bytes代替str表示data


更新:

这个curl命令可以在linux上与curl7.58.0一起使用,但是在windows上-cmd命令返回的错误与pycode中没有$相同


Tags: name命令formcomhttpdataexamplewww
2条回答

问题是你的两个命令没有发送相同的数据。在

假设您在bash或类似的shell中运行它,$' -blahblah…'并不表示字符串'$ -blahblah…',它表示环境变量' -blahblah…'的内容(如果有),或者字符串{}的内容。因为几乎可以肯定没有具有该名称的变量,所以您只需获得不带前导$的字符串。在

但是在Python中,您将$作为数据的一部分。这意味着您在第一个多部分边界之前有一个额外的条目$。在

要解决这个问题,就不要这么做。而不是这样:

data = '$   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="firstName"\\r\\n\\r\\Oleg\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="campaignCode"\\r\\n\\r\\n\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="validation"\\r\\n\\r\\n{"firstName":"required"}\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0 \\r\\n'

…这样做:

^{pr2}$

“curl”版本捕获包的有效负载:

MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "  WebKitFormBoundaryFkQeCsmEXjVI5SJ0"
    [Type: multipart/form-data]
    First boundary:    WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="firstName"\r\n
        Data (6 bytes)
            Data: 0d5c4f6c6567
            [Length: 6]
    Boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="campaignCode"\r\n\r\n
    Boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="validation"\r\n\r\n
        Data (24 bytes)
            Data: 7b2266697273744e616d65223a227265717569726564227d
            [Length: 24]
    Last boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0 \r\n

“python”版本捕获包的有效负载:

^{pr2}$

第一个条目似乎无法正常识别。在

您应该从python代码中的变量头data中删除{}。在

data = '   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="firstName"\\r\\n\\r\\Oleg\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="campaignCode"\\r\\n\\r\\n\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\\r\\nContent-Disposition: form-data; name="validation"\\r\\n\\r\\n{"firstName":"required"}\\r\\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0 \\r\\n'

然后,新的python版本的捕获包的有效负载:

MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "  WebKitFormBoundaryFkQeCsmEXjVI5SJ0"
    [Type: multipart/form-data]
    First boundary:    WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="firstName"\r\n
        Data (6 bytes)
            Data: 0d5c4f6c6567
            [Length: 6]
    Boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="campaignCode"\r\n\r\n
    Boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0\r\n
    Encapsulated multipart part: 
        Content-Disposition: form-data; name="validation"\r\n\r\n
        Data (24 bytes)
            Data: 7b2266697273744e616d65223a227265717569726564227d
            [Length: 24]
    Last boundary: \r\n   WebKitFormBoundaryFkQeCsmEXjVI5SJ0 \r\n

这和“卷曲”版本相同。在

相关问题 更多 >