我需要在需要Cookie的网页上填写登录表单,并获取有关结果页面的一些信息。由于这需要在非常奇怪的时间在晚上完成,我想自动化过程,因此使用机械化(欢迎任何其他建议 - 请注意,我必须在学校服务器上运行我的脚本,我不能安装新的软件.Mechanize是纯python,所以我能解决这个问题。)
问题是托管登录表单的页面要求我能够接受和发送cookie。理想情况下,我希望能够接受并发送服务器发送给我的所有cookie,而不是硬编码我自己的cookie。
所以,我开始用mechanize编写我的脚本,但我似乎错误地处理了cookie。由于我无法在任何地方找到有用的文档(如果我是盲人,请指出),我在这里问。
这是我的机械化脚本:
import mechanize as mech
br = mech.Browser()
br.set_handle_robots(False)
print "No Robots"
br.set_handle_redirect(True)
br.open("some internal uOttawa website")
br.select_form(nr=0)
br.form['j_username'] = 'my username'
print "Login: ************"
br.form['j_password'] = 'my password'
print "Password: ************"
response = br.submit()
print response.read()
这将打印以下内容
No Robots
Login: ************
Password: ************
<html>
<body>
<img src="/idp/images/uottawa-logo-dark.png" />
<h3>ERROR</h3>
<p>
An error occurred while processing your request. Please contact your helpdesk or
user ID office for assistance.
</p>
<p>
This service requires cookies. Please ensure that they are enabled and try your
going back to your desired resource and trying to login again.
</p>
<p>
Use of your browser's back button may cause specific errors that can be resolved by
going back to your desired resource and trying to login again.
</p>
<p>
If you think you were sent here in error,
please contact technical support
</p>
</body>
</html>
如果我在Chrome浏览器上禁用了Cookie并尝试了相同的操作,那么这确实是我会得到的页面。
我尝试过如下添加饼干罐,没有运气。
br = mech.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
我看了几个机械化文档来源。 One of them提到
A common mistake is to use mechanize.urlopen(), and the .extract_cookies() and
.add_cookie_header() methods on a cookie object themselves.
If you use mechanize.urlopen() (or OpenerDirector.open()),
the module handles extraction and adding of cookies by itself,
so you should not call .extract_cookies() or .add_cookie_header().
这似乎说我的第一种方法应该有效,但事实并非如此。
我很感激任何帮助 - 这令人困惑,似乎严重缺乏文档。
答案 0 :(得分:2)
我在使用Mechanize对Shibboleth网站进行身份验证时遇到了完全相同的消息,因为我犯了同样的错误。看起来我想通了。
您需要打开的链接是:
br.open("https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-register")
而不是:
br.open("https://idp.uottawa.ca/idp/login.jsp?actionUrl=%2Fidp%2FAuthn%2FUserPassword")
Shibboleth:通过以下方式轻松安全地连接到各种服务 一个简单的登录。
如果您不告诉他要登录哪项服务,Shibboleth登录本身就没用了。让我们分析HTTP标头,并比较两个查询获得的Cookie。
<强> 1。正在打开 https://idp.uottawa.ca/idp/login.jsp?actionUrl=%2Fidp%2FAuthn%2FUserPassword
Cookie: JSESSIONID=C2D4A19B2994BFA287A328F71A281C49; _ga=GA1.2.1233451770.1401374115; arp_scroll_position=-1; tools-resize=tools-resize-small; lang-prev-page=en; __utma=251309913.1233451770.1401374115.1401375882.1401375882.1; __utmb=251309913.14.9.1401376471057; __utmz=251309913.1401375882.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); lang=en
<强> 2。正在打开 https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-register
Cookie: JSESSIONID=8D6BEA53823CC1C3045B2CE3B1D61DB0; _idp_authn_lc_key=fc18251e-e5aa-4f77-bb17-5e893d8d3a43; _ga=GA1.2.1233451770.1401374115; arp_scroll_position=-1; tools-resize=tools-resize-small; lang-prev-page=en; __utma=251309913.1233451770.1401374115.1401375882.1401375882.1; __utmb=251309913.16.9.1401378064938; __utmz=251309913.1401375882.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); lang=en
有什么区别?您还有一个Cookie:_idp_authn_lc_key=1c21128c-2fd7-45d2-adac-df9db4d0a9ad;
。我想这是饼干说&#34;我想登录there&#34;。
在身份验证过程中,IdP将设置一个名为的cookie _idp_authn_lc_key。此cookie仅包含识别当前身份验证过程所必需的信息(通常跨越 多个请求/响应)并在身份验证后删除 过程完成。
来源:https://wiki.shibboleth.net/confluence/display/SHIB2/IdPCookieUsage
我是如何找到 that link的?我确实挖了网页,发现https://web30.uottawa.ca/hr/web/en/user/registration通过以下链接重定向到登录表单:
<a href="https://web30.uottawa.ca/Shibboleth.sso/Login?target=https://web30.uottawa.ca/hr/web/post-register"
class="button standard"><span>Create your account using infoweb</span></a>
所以这对于Mechanize来说不是问题,但更多的是Shibboleth乍一看有点难以理解。您将在Shibboleth身份验证流程here中找到更多信息。
答案 1 :(得分:-3)
您提交表单数据的网站可能需要一个CSRF令牌(以跳过下载形式提供的cookie。)
尝试使用请求:
http://docs.python-requests.org/en/latest/user/quickstart/#cookies
查找Cookie和/或隐藏的表单字段,然后开火。