您将如何在 python Requests 或 urllib2 甚至 pycurl 中实现此 curl 命令?

How would you implement this curl command in python Requests or urllib2 or even pycurl?

如何在 python Requests 或 urllib2 甚至 pycurl 中实现这个 curl 命令?我查看了 Whosebug 和其他地方的大量示例,这些示例接近我正在寻找的内容,但没有一个示例显示同时使用 username/password 和令牌进行身份验证(双因素身份验证)的示例。我正在尝试使用双因素身份验证登录网站,然后使用 cookie 请求 json 数据。
所以我有一个登录表单,需要发布 "urserId"、"password" 和 "token"(我相信该站点正在使用 Google 身份验证器令牌)。这是可以满足我需要的工作 curl 命令,我想将这两个命令的作用翻译成 python.

curl -X POST  -H "Accept: Application/json" -H "Content-Type: application/json" http://example.com/rest/auth/login -d '{"userId":"myuserid", "password":"mypa$word", "token":"321"}'

curl http://example.com/rest/search?q=e43f6f3bd6a0f0c0415accfh285f6a00b55552666b7s --cookie 'connect.sid=s%3BJAUAVY68925VclAlLZCV.Gy902343-x%20343seMBMsQodfdo-35'

我尝试了许多不同的组合,包括以下使用请求的组合:

payload = {"userId":"myuserid", "password":"mypa$word", "token":"321"}
headers={'Accept': 'Application/json','Content-Type': 'application/json'}

with requests.session() as c:
    c.post('http://example.com/rest/auth/login', headers=headers, data=payload )
    cookies=c.cookies.get_dict()
    c.get('http://example.com/rest/global/config', cookies=cookies)

不幸的是,它产生了一个响应 [400],它告诉我我没有正确使用凭据。

来自 requests docs:

There are many times that you want to send data that is not form-encoded. If you pass in a string instead of a dict, that data will be posted directly.

即您发布的内容不是 application/json,而是(我假设)application/x-www-form-urlencoded,而您的请求 headers 是在撒谎 :)

试试 data=json.dumps(payload)