2011-10-02 93 views
2

我在想,如果我访问使用Python的机制保护网站的密码,我会得到它需要认证数据401未授权错误。如何使用python访问受密码保护的站点?

所以我的剧本里,我试图访问我的雅虎邮箱,这显然需要用户名和密码,我想我会得到401,但我没有。

代码:

yahoo_mail = 'http://mail.cn.yahoo.com' 
br = mechanize.Browser() 
r = br.open(yahoo_mail) 
print r.info() #here, I got 200, it's ok apparently 

br.select_form(nr=0) #select the login form 
r = br.submit() #submit the form without providing username and password 
print r.info() #but I didn't get 401, why? 

问:

  1. 为什么我没有拿到401无需提供身份验证,信息?
  2. 如果不是我的信箱,其他任何网站可以给我一个401?
+0

我想你的意思是401未经授权,而不是410飘 – greg0ire

回答

5

大多数网站这几天使用HTTP认证。因此,如果您未能登录,则401不会返回;而是返回一个正常的200个成功响应,并且文本内部的网页上显示您没有登录。

相反,网站使用Cookie。这意味着您的浏览器实际上并不知道它登录的网站;当你最终为Yahoo!提供了一个成功的密码时,它会更改它存储在浏览器中的cookie,或者甚至保持cookie相同,但只是更改与cookie关联的数据库记录。

因此,在登录过程中,HTTP状态代码通常是无用的。相反,您将不得不刮取“200成功”页面的文本,看看它是否恭喜您登录或重复表单;或者,您也可以选择检查返回的网页的网址,然后再查看它是否为登录表单,或者它是否是您想要访问的目的地。

0
  1. 验证失败并不意味着你不能看到后面的认证页面。这意味着您将不会看到此页面的版本将您的凭据考虑在内。如果您在主页上但未能通过身份验证,您仍然可以看到首页。

  2. 搜索引擎似乎并没有指数401页,所以它可以是一个有点难找...

0

它看起来像雅虎只是在处理其代码的密码验证。尝试将以下两行添加到您的代码中:

f = open('a.html', 'w') 
f.write(r.read()) 

当您阅读该页面时,您将再次看到相同的页面。

看起来他们只是有一些JavaScript,告诉你你的密码是错误的。

+0

你在正确的轨道上在实现身份验证可能不通过HTTP完成,但通过Javascript密码身份验证就不会是安全的*所有*。正如Brandon的答案所示,他们在服务器端代码中进行密码验证,并在客户端存储cookie。 – Rob