gpt4 book ai didi

Python 相当于 curls --form : Create multipart form-data post request with data in "form" parameter

转载 作者:太空狗 更新时间:2023-10-30 02:45:22 25 4
gpt4 key购买 nike

我正在寻找与此 curl 命令等效的 python:

 curl --referer "https://myreferer" --insecure --form "myparam=1234" https://myurl

这会导致以下请求(取自 httpbin.org/post):

{
"args": {},
"data": "",
"files": {},
"form": {
"myparam": "1234"
},
"headers": {
"Accept": "*/*",
"Connection": "close",
"Content-Length": "142",
"Content-Type": "multipart/form-data; boundary=----------------------------29a1ce32cc53",
"Host": "httpbin.org",
"Referer": "https://speedport.ip/hcti_start_passwort.stm",
"User-Agent": "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3",
"X-Request-Id": "c67c4461-89d2-4c9f-a9f4-ebfe312c026c"
},
...

如您所见,数据“myparam”在“表单”参数中传递。

我尝试通过 pythons requests 模块构建这样的请求,并接近于此代码:

import requests
payload={'myparam':'1234'}
url="http://httpbin.org/post"
headers={'User-Agent': 'Mozilla 5.0','referer':'https://myreferer'}
r = requests.post(url, files=payload, headers=headers,verify=False)

但是请求库将数据放在"file"参数中。所以生成的请求看起来像这样:

{
"args": {},
"data": "",
"files": {
"pws": "1234"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "143",
"Content-Type": "multipart/form-data; boundary=a878ad29e28d47ffb00e0631319ed0e2",
"Host": "httpbin.org",
"Referer": "https://myreferer",
"User-Agent": "Mozilla 5.0",
"X-Request-Id": "60f5d65e-789a-47fe-bba3-dab88f9bbb65"
...

因此数据被传送到错误的位置,即在"file"参数内,这使得 Apache 因“501 未实现”响应而窒息。

有人可以建议如何在 Python 中执行这样的请求吗? (我知道我可以将 curl 作为子进程调用,但由于我想执行其中的许多请求,所以我希望有一个仅限 python 的解决方案(希望性能更高))。

而且,正如您可能已经注意到的,我还需要接受一个自签名证书并发送一个引用 header 。

如果有人能提出一个简单的方法来解决这个问题,我会很高兴。

谢谢!

编辑:我已经尝试使用 requests.post 命令的“data”-param,但这会导致不同的内容类型 header (application/x-www-form-urlencoded)。请注意 curl 请求的内容类型 header 。

编辑:我可能需要的是通过 requests.post 命令的 header 参数简单地发送正确的 Content-Type header 、multipart/form-data。但我还必须计算多部分/表单数据标题字符串的“边界”部分。我想一定有比手动构建标题和计算边界更简单的方法。

最佳答案

文件使用类文件对象导致multipart/form-data内容类型

让我们准备好通话所需的一切,从“常规”的东西开始:

>>> import requests
>>> data = {"myparam": "1234"}
>>> headers = {'User-Agent': 'Mozilla 5.0','referer':'https://myreferer'}

强制 requests 使用“multipart/form-data”的技巧是至少给它一个文件对象。

>>> from StringIO import StringIO
>>> buff = StringIO("")

buff 现在是类文件对象,我们可以将其作为 files 参数的值传入。

>>> req = requests.post(url, data=data, headers=headers, stream=True, files=buff)
>>> print req.text
{
"args": {},
"data": "",
"files": {},
"form": {
"myparam": "1234"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "130",
"Content-Type": "multipart/form-data; boundary=0b3bbec1f5c844a1b7377aacfe701f02",
"Host": "httpbin.org",
"Referer": "https://myreferer",
"User-Agent": "Mozilla 5.0",
"X-Request-Id": "988a0467-1c32-45aa-a75c-fba5aa8d632e"
},
"json": null,
"origin": "85.160.45.204",
"url": "http://httpbin.org/post"
}

如果您要使用自签名证书与 https 通信,请使用 verify=False:

>>> req = requests.post(url, data=data, headers=headers, stream=True, files=buff, verify=False)

requests.request 的帮助还指出,verify 的值可能是“A CA_BUNDLE 路径”,因此您可以明确确保服务器正在使用您期望的自签名证书。但我从未尝试过这个。

关于Python 相当于 curls --form : Create multipart form-data post request with data in "form" parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com