我正在寻找一个等效于此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”以“form”参数提供.
我试图通过pythons请求模块构建这样的请求,并接近这个代码:
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)
但是请求库将数据放入“files”参数中.因此生成的请求如下所示:
{
"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"
...
因此,数据在错误的位置传递,即在“files”参数内,这使得Apache阻塞了“501 Not Implemented”响应.
有人可以建议如何在Python中执行此类请求吗? (我知道我可以把curl作为一个子进程调用,但是因为我想做很多这些请求,所以我想要一个只有python的解决方案(希望更高效)).
而且,正如您可能已经注意到的,我还需要接受自签名证书并发送引用标头.
如果有人能提出一个解决这个问题的简单方法,我会很高兴.
谢谢!
编辑:我已经尝试使用requests.post命令的“data”-param,但这会产生不同的内容类型标题(application / x-www-form-urlencoded).请注意curl请求的内容类型标题.
编辑:我可能需要的是通过requests.post命令的headers param简单地发送正确的Content-Type头,multipart / form-data.但我还必须计算multipart / form-data标头字符串的“边界”部分.我想必须有一种更方便的方法,而不是手动构建标题和计算边界.