我正在尝试使用 Requests 库通过 post 请求发送 cookie,但我不确定如何根据其文档实际设置 cookie。该脚本用于维基百科,需要发送的 cookie 具有以下形式:
enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly
但是,
requests
文档快速入门将此作为唯一的示例:
cookies = dict(cookies_are='working')
如何使用这个库对像上面这样的 cookie 进行编码?我需要用python的标准cookie库制作它,然后将其与POST请求一起发送吗?
最新版本的 Requests 将为您从简单的字典构建 CookieJars。
import requests
cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
r = requests.post('http://wikipedia.org', cookies=cookies)
享受:)
只是为了扩展之前的答案,如果您将两个请求链接在一起并希望将从第一个请求返回的 cookie 发送到第二个请求(例如,跨请求保持会话活动),您可以这样做:
import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
如果您想将 cookie 传递给浏览器,则必须附加到要发回的标头中。如果您使用 wsgi:
import requests
...
def application(environ, start_response):
cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
response_headers = [('Content-type', 'text/plain')]
response_headers.append(('Set-Cookie',cookie))
...
return [bytes(post_env),response_headers]
通过将身份验证用户/密码传递给我的 python 脚本并将 cookie 传递给浏览器,我成功地能够对托管在我的 python wsgi 脚本运行的同一域上的 Bugzilla 和 TWiki 进行身份验证。这允许我在同一浏览器中打开 Bugzilla 和 TWiki 页面并进行身份验证。我正在尝试对 SuiteCRM 执行相同的操作,但我在 SuiteCRM 接受从 python 脚本获取的会话 cookie 时遇到问题,即使它已成功通过身份验证。
与 cookie 一起发送请求的最佳实践是使用
Session
对象。这样您就不需要每次请求时都解析 cookie。
举个例子:
import requests
cookie = dict(user_session="xxx-xxx-xxx")
with requests.Session() as s:
s.cookies.update(cookie)
response = s.post("https:xxx.com")