Python的请求库requests无法正确处理cookies?

6

我有一个简单的授权和上传API脚本的问题。

当授权成功后,客户端会收到几个cookie,其中包括PHPSESSID cookie(在浏览器中)。

我使用表单数据和requests.post方法进行授权:

r = requests.post(url, headers = self.headers, data = formData)
self.cookies = requests.utils.dict_from_cookieja(r.cookies)

头部信息仅用于自定义User-Agent

授权是完全没问题的(页面上有一个注销链接)。 稍后,我尝试使用已授权的会话Cookie上传数据:

r = requests.post(url, files = files, data = formData, headers = self.headers, cookies = self.cookies)

但是网站拒绝请求。如果我们使用Wireshark比较脚本和Google Chrome的请求,请求体中没有任何区别。

唯一的区别是请求类发送2个cookie,而Google Chrome发送7个cookie。

更新:再次确认,第一个请求接收到了7个cookie。post方法只忽略了其中一半...


1
我不知道requests存在任何cookie问题。使用Chrome的无痕标签,第一次请求该网站时设置了多少个cookie?该网站可能会根据用户代理或其他请求头更改行为。接下来,您确定该页面没有在登录表单中嵌入CSRF令牌吗? - Martijn Pieters
接下来,这些 cookie 的过期日期是什么?这些 cookie 上是否设置了特定的标志?当您使用 requests.Session() 对象来管理这些 cookie 时会发生什么? - Martijn Pieters
@MartijnPieters 不好意思,我已经解决了错误。我没有使用“session”类的经验,这是一个很好的建议,以备将来之需! - Croll
1个回答

3

我的代码错误在于我将每个下一个API请求的cookie分配给会话cookie字典。在每个请求中,由于已登录,cookie会被即将到来的响应cookie“重置”,这就是问题所在。由于身份验证cookie仅在登录请求时分配,它们在下一个请求中丢失。

在每个授权请求之后,我使用了update()而不是分配。

self.cookies.update( requests.utils.dict_from_cookiejar(r.cookies) )

解决了我的问题,上传正常工作!

1
你应该只使用一个会话,这样你就不必自己处理它们。 - Ian Stapleton Cordasco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接