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

发布于 2024-12-17 21:00:28 字数 549 浏览 1 评论 0原文

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

I am trying to login to website using urllib2 and cookiejar. It saves the session id, but when I try to open another link, which requires authentication it says that I am not logged in. What am I doing wrong?

Here's the code, which fails for me:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贩梦商人 2024-12-24 21:00:28

你的实现看起来不错......并且应该可以工作。

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

你怎么能说它没有发送 cookie或者您收到的 cookie 可能不是对您进行身份验证的。

使用:response.info() 查看响应的标头,以了解您实际收到的 cookie。

该网站可能不会让您登录,因为:

  • 它会检查您未设置的用户代理,因为某些网站从 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。

查看.. !!
:)

Your implementation seems fine... and should work.

It should be sending in the correct cookies, but I see it as the case when the site is actually not logging you in.

How can you say that its not sending the cookies or may be cookies that you are getting are not the one that authenticates you.

Use : response.info() to see the headers of the responses to see what cookies you are receiving actually.

The site may not be logging you in because :

  • Its having a check on User-agent that you are not setting, since some sites open from 4 major browsers only to disallow bot access.

  • The site might be looking for some special hidden form field that you might not be sending in.

1 piece of advise:

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)

Moreover 1 thing is strange here :

  • You are md5 encoding your password before sending it over. (Strange)
  • This is generally done by the server before comparing to database.
  • This is possible only if the site.com implements md5 in javascript.
  • Its a very rare case, since only may be 0.01 % websites do that..
  • Check that - that might be the problem, and you are providing the hashed form and not the actual password to the server.
  • So, server would have been again calculating a md5 for your md5 hash.

Check out.. !!
:)

泡沫很甜 2024-12-24 21:00:28

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

问题似乎出在 urllib2 上。正如这些答案所建议的,使用更强大的mechanize 库而不是 urllib2:

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

并且开启器将按预期工作!

I had a similar problem with my own test server, which worked fine with a browser, but not with the urllib2.build_opener solution.

The problem seems to be in urllib2. As these answers suggest, it's easy to use more powerful mechanize library instead of urllib2:

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

And the opener will work as expected!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文