4

urllib2 と cookiejar を使用して Web サイトにログインしようとしています。セッション 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)

さらに、ここで奇妙なことが 1 つあります。

  • パスワードを送信する前に、パスワードを md5 エンコードしています。(変)
  • これは通常、データベースと比較する前にサーバーによって行われます。
  • これはsite.com、JavaScript で md5 を実装している場合にのみ可能です。
  • 0.01 % の Web サイトだけがそれを行う可能性があるため、これは非常にまれなケースです..
  • それを確認してください-それが問題である可能性があり、実際のパスワードではなくハッシュ形式をサーバーに提供しています。
  • したがって、サーバーは 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 に答える