2011-11-24 52 views
4

我正在尝试使用urllib2和cookiejar登录到网站。它保存了会话ID,但是当我尝试打开另一个需要认证的链接时,它说我没有登录。我在做什么错了?Python CookieJar保存cookie,但不会将其发送到网站

下面的代码,它失败对我来说:

import urllib 
import urllib2 
import cookielib 

cookieJar = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar)) 

# Gives response saying that I logged in succesfully 
response = opener.open("http://site.com/login", "username=testuser&password=" + md5encode("testpassword")) 

# Gives response saying that I am not logged in 
response1 = opener.open("http://site.com/check") 

回答

4

你的实现似乎罚款...并应工作。

应该发送的正确cookies,但我认为它视情况时,该网站实际上没有登录你进来。

你怎么能说其不发送cookies或可能cookies你越来越不是认证你的人。

使用:response.info()查看响应的标题以查看实际接收的cookie。

  • 它具有上User-agent,你是不是设置了检查,因为一些网站从4级主要的浏览器只开放给禁止BOT访问:

    该网站可能没有,因为您登录。 。

  • 该网站可能会寻找,你可能不被发送一些特殊的隐藏的表单字段

1个提醒的:

from urllib import urlencode 
# Use urlencode to encode your data 

data = urlencode(dict(username='testuser', password=md5encode("testpassword"))) 
response = opener.open("http://site.com/login", data) 

而且1件事是这里的怪:

  • 在发送密码之前,您是md5编码的密码。 (奇怪)
  • 这通常由服务器在与数据库比较之前完成。
  • 仅当site.com在javascript中实现md5时,才有可能。
  • 它是一种非常罕见的情况,因为只有0.01%的网站可以这样做。
  • 检查 - 可能是问题,并且您提供散列表单而不是服务器的实际密码。
  • 因此,服务器将会再次为您的md5散列计算md5。

退房.. !! :)

+0

谢谢你的回答。我正在为一些服务开发客户端软件,并且直接与正在实施php服务器的人进行通信。出于安全原因,密码需要作为md5哈希发送。并没有任何隐藏的表单字段。我会尝试使用机械化或卷曲。 –

+0

考虑通过点击答案旁边的“打勾”来给予答案并接受答案。 这就是你如何感谢在stackoverflow。 –

+1

@TomRay在发送密码之前用这种方式散列密码实际上并不能保证任何东西 - 它只是提供一个*派生密码,就像从安全角度来看密码一样好。执行这项服务的人没有清楚地思考。 – zigg

2

我与我自己的测试服务器有类似的问题,它可以在浏览器中正常工作,但不能与urllib2.build_opener解决方案配合使用。

这个问题似乎在urllib2中。作为these answers表明,它很容易使用更强大的mechanize库,而不是urllib2的的:

cookieJar = cookielib.CookieJar() 
browser = mechanize.Browser() 
browser.set_cookiejar(cookieJar) 
opener = mechanize.build_opener(*browser.handlers) 

并如期揭幕战会努力!

相关问题