4

我正在尝试使用 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")
4

2 回答 2

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。

查看.. !!:)

于 2011-11-24T03:30:53.373 回答
2

我自己的测试服务器也有类似的问题,它在浏览器上运行良好,但在urllib2.build_opener解决方案上却不行。

问题似乎出在 urllib2 中。正如这些答案所暗示的,使用更强大的机械化库而不是 urllib2很容易:

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

开瓶器将按预期工作!

于 2012-09-18T22:52:10.207 回答