2011-11-24 19 views
4

urllib2とcookiejarを使用してWebサイトにログインしようとしています。セッションIDは保存されますが、認証が必要な別のリンクを開こうとすると、ログインしていないと表示されます。何が間違っていますか?Python CookieJarはCookieを保存しますが、Webサイトに送信しません。

ここでは私のために失敗したコード、です:

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()回答のヘッダーを見て、実際に受け取っているクッキーを確認してください。 4つの主要なブラウザから開いていくつかのサイトが唯一のボットへのアクセスを許可しないので、あなたは、設定されていないUser-agentのチェックを持つ

  • その:

    サイトがあるためにあなたをログに記録することはできません。 。アドバイスのサイトには、あなたが送信されない可能性がありますいくつかの特別な非表示のフォームフィールドを探しているかもしれない

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エンコードしています。 (Strange)
  • これは通常、データベースと比較する前にサーバーによって行われます。
  • これは、site.comがjavascriptでmd5を実装している場合にのみ可能です。
  • これは非常にまれなケースです。これは0.01%のウェブサイトしかないためです。
  • これは問題である可能性があります。サーバーに実際のパスワードではなくハッシュフォームを提供していることを確認してください。
  • したがって、サーバーはmd5ハッシュのmd5を再度計算していたはずです。

チェックアウト! :)

+0

ありがとうございました。私はいくつかのサービスのためのクライアントソフトウェアで働いており、私はPHPサーバを実装している人と直接コミュニケーションしています。セキュリティ上の理由から、パスワードはmd5ハッシュとして送信する必要があります。隠れたフォームフィールドはありません。私はmechanizeやCurlを使ってみよう。 –

+0

答えを与えることと、回答の横にある「目盛り」をクリックすることで回答を受け入れることを検討してください。 これは、あなたがstackoverflowに感謝する方法です。 –

+1

@TomRayパスワードを送信する前にこの方法でパスワードをハッシュすると、実際には何も保護されていません。単にセキュリティの観点からパスワードと同じくらいの派生*パスワードを提供するだけです。そのサービスを実装した人は誰もが明確に考えていませんでした。 – zigg

2

私はブラウザで正常に動作したが、urllib2.build_openerソリューションではうまくいかなかった自分のテストサーバーで同様の問題が発生しました。

問題はurllib2にあるようです。 these answersが示すように、それは代わりにurllib2ののより強力なmechanizeライブラリを使用するのは簡単です:

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

を期待どおりにオープナーが動作します!

関連する問題