RoboBrowser 不会更改 Cookie

robobrowser won't change cookies

提问人:ikel 提问时间:8/3/2017 最后编辑:BrokenBenchmarkikel 更新时间:11/15/2023 访问量:1076

问:

我从 robobrowser 向服务器发送了一个 POST 请求,但服务器响应时没有数据。响应标头如下(这是来自 Chrome 浏览器的响应,它应该是这样):

Cache-Control:no-cache, no-store, must-revalidate
Content-Length:335
Content-Type:application/json; charset=utf-8
Date:Wed, 02 Aug 2017 17:01:17 GMT
Expires:-1
lg:2673
Pragma:no-cache
Server:Unknown
Set-Cookie:BrandingUserLocationGroupID=ic4DUh/NXVp8VOKAtyDgbA==; expires=Fri, 01-Sep-2017 17:01:16 GMT; path=/; secure; HttpOnly
Set-Cookie:.AIRWATCHAUTH=A69C1A5EE8A5F3626385F35DA1B104EE7DFF5E5AF549DDB02EE8ED53931A0585C0FBB8299E3FC7B428A982B9826EF68390E659F4A74DCE00E195601F400D6E69F53907DADED4194F32DD08A72BA212DCCD0D23AB7C5BD56171E6C55EF1BE90849E9C81B2DAE23B05CA6E361326F44604; expires=Thu, 03-Aug-2017 17:01:17 GMT; path=/; secure; HttpOnly
Strict-Transport-Security:max-age=31536000;includeSubDomains
user:5679
X-Content-Type-Options:nosniff
x-download-options:noopen
x-frame-options:SAMEORIGIN
X-XSS-Protection:1; mode=block

看起来服务器正在重置 cookie,但我的 robobrowser 实例没有响应/刷新新的 cookie。 基本上,我认为该网站正在尝试切换会话/更改 cookie,但我的 python robobrowser 没有反映这一点或由于某种原因不允许它更改

这是我的 POST 请求和响应:

browser=RoboBrowser()
browser.session.headers['X-Requested-With']='XMLHttpRequest'
browser.open('https://example.com/test/Users/set-role?id='+role_id+'&__RequestVerificationToken='+token,method='POST')
print browser.response.content

这给了我以下错误消息:

{"RedirectUrl":null,"IsSuccess":false,"Message":"Save Failed","CustomMessage":null,"Errors":[{"Key":"","Value":["An error has occurred. This error has automatically been saved for further analysis. Please contact technical support."]}],"Messages":{},"HasView":false,"ViewHtml":null,"ViewUrl":null,"IsValidationException":false,"IsValidationWarning":false,"ReloadPage":false,"IsSessionExpired":false,"Script":null,"NextWizardUrl":null,"PreviousWizardUrl":null,"ShowDialog":false}

有谁知道如何让 robobrowser 响应新的 cookie?

添加了 Chrome 中开发者工具的 cookie 屏幕截图。 突出显示的红色框是单击链接后发生更改的位置。enter image description here

python-2.7 http python请求 urllib2

评论

0赞 ikel 8/3/2017
如果使用浏览器,则 cookie 会在发布后更改,但使用此 RoboBrowser 不会更改
0赞 Oluwafemi Sule 8/10/2017
如果您在 curl 中发出相同的请求,服务器的响应是什么?curl -X POST 'https://example.com/test/Users/set-role?id=<id>&__RequestVerificationToken=<token>' -H 'x-requested-with: XMLHttpRequest'
0赞 Dror Av. 8/11/2017
您确定 cookie 是问题所在吗? 从字面上看只是变相。发布请求应自动更新(即 - )会话,因为它已修复 - github.com/jmcarp/robobrowser/issues/27。您还可以在这篇文章中查看第二个答案 - stackoverflow.com/questions/23737719/...robobrowser.open()requests.Session()_update_state(response)
0赞 ikel 8/11/2017
@droravr是的......我确定是 cookie 部分有问题,因为我从 chrome 中的开发人员工具中查看了它,我确实看到它在单击链接后几乎没有部分更改,并且会话 ID 保持不变(也许这就是为什么 robobrowser 不会反映到更改)
2赞 Dror Av. 8/11/2017
您能否尝试打印您的 Robobrowser 会话 cookie,以查看会话是否实际更新,并了解问题出在 Robobrowser 更新自身(在 中)还是在会话本身未加载新 cookie 上?browser.session.cookies

答:

0赞 Shashvat Kumar 11/15/2023 #1

似乎问题可能与RoboBrowser处理cookie的方式有关。当服务器在响应中设置新的 cookie 时,您的 RoboBrowser 实例需要相应地更新其 cookie jar。下面是包含处理 Cookie 的代码的修改版本:

from robobrowser import RoboBrowser

# Create a session to handle cookies
browser = RoboBrowser(session=True)
browser.session.headers['X-Requested-With'] = 'XMLHttpRequest'

# Make the POST request
url = 'https://example.com/test/Users/set-role?id=' + role_id + '&__RequestVerificationToken=' + token
browser.open(url, method='POST')

# Update the session's cookies with the ones received in the response
browser.session.cookies.update(dict(browser.response.cookies))

# Print the content or handle it as needed
print(browser.response.content)

此修改包括创建一个会话(在 RoboBrowser() 中为 session=True)以在请求之间持久化 cookie。发出 POST 请求后,代码会使用响应中收到的 cookie 更新会话的 cookie。这应该有助于 RoboBrowser 维护会话并正确处理新 cookie。

试一试,看看它是否能解决您面临的问题。