Python CookieJar保存cookie,但不会将其发送到网站

时间:2011-11-24 01:19:46

标签: python urllib2 cookiejar

我正在尝试使用urllib2和cookiejar登录网站。它会保存会话ID,但是当我尝试打开另一个需要身份验证的链接时,它表示我没有登录。我做错了什么?

这是代码,但对我来说失败了:

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")

2 个答案:

答案 0 :(得分:4)

您的实施似乎很好......并且应该可行。

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

你怎么能说它不发送cookies或者cookies你得到的不是认证你的那个。

使用:response.info()查看回复标题,了解您实际收到的Cookie。

网站可能没有登录你,因为:

  • 检查User-agent您没有设置,因为有些网站只能从4个主要浏览器打开以禁止机器人访问。

  • 网站可能正在寻找您可能不会发送的特殊隐藏表单字段。

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)

此外有一件事很奇怪:

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

退房.. !! :)

答案 1 :(得分: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)

开场白将按预期工作!