2009-07-08 22 views
5

Mechanize(Python)は、httpダイジェストURLを開くために401で失敗しています。私はグーグルでデバッグを試みましたが成功しませんでした。python mechanizeはHTTP認証を処理できますか?

私のコードは次のようになっています。

import mechanize 

project = "test" 
baseurl = "http://trac.somewhere.net" 
loginurl = "%s/%s/login" % (baseurl, project) 
b = mechanize.Browser() 
b.add_password(baseurl, "user", "secret", "some Realm") 
b.open(loginurl) 
+0

どういう意味ですか?それは403で失敗するのですか?その他のエラーまたは状態? – ars

+0

HTTP認証でチェックするようにtracが設定されていますか?または、単純なHTMLフォームにログインする必要がありますか? –

+1

何か変わったように見えます - 通常は保護されていないログインページにナビゲートしているようです。基本/ダイジェスト認証を使用すると、保護されたリソースに直接アクセスし、HTTPヘッダーで資格情報を提供します(これは機械化がもちろん可能です)。 –

答えて

6

Mechanizeのは、パラメータがパラメータとしてURI、ユーザ名とパスワードであることを主張していますが、4つのパラメータがあります。 urllib2.add_passwordには4つのパラメータが正しいが、最初のパラメータはuriではなくrealmでなければならない。

http://wwwsearch.sourceforge.net/mechanize/

私が最初にそれを変更しようと思います。

tracはダイジェストを必要としますか?あなただけのaddHeaderであることを追加することができますので、次のステップは、それが動作するかどうかを確認するための試験として、基本認証を使用して試してみることができない場合:

import base64 
from mechanize import Browser 
browser = Browser() 
browser.addheaders.append(('Authorization', 'Basic %s' % base64.encodestring('%s:%s' % (user, pwd)))) 
+0

最後のパラメータはオプションです:realm、デフォルトはNoneです。 –

+0

ああ、OK。それを見たことはありませんでしたが、ドキュメントには言及していません...しかし、とにかく、彼はログイン画面を開いているだけなので、実際には認証エラーではありません。 –

+0

help-> add_password(self、url、user、password、realm = None)mechanize._mechanize.Browserインスタンスのメソッド 次に、Twillを使用する類似のスクリプトがうまく機能します。ツインは機械化のみを使用します。 – Shekhar

0

ウェブオートメーションプロジェクトがどのように複雑に応じて、使用することを検討してくださいiMacros。 Mechanizeとは異なり、Webブラウザで動作するので、ほとんどのWebサイトでそのまま使用できます。

コマンドライン(Linuxサーバー上)での無料のFirefoxアドオンと、COMオブジェクトによるiMacros Scripting Edition(FlashとJavaのあるサイトではWindows VMware上)の両方を使用します。

コマンドライン(フリーウェア&オープンソース):http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support

COMオブジェクト(有料版必須):MechanizeのとHTTP認証のためにwiki.imacros.net/Python

ティム

+0

興味深いですが、要件によっては、私は既存のPythonプログラム内で何かを実行する必要があります。 – Shekhar

+0

ブラウザを駆動する場合は、selenium/webdriverを使用してください。 –

1
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import mechanize 

a=mechanize.Browser() 
a.open("http://www.facebook.com/login.php") 
a.select_form(nr=0) #form number. 
a["email"]="mailaddress" 
a["pass"]="password" 
a.submit() 
print a 
+1

これはhttp認証ではありません。これは、ログインしているページにページ上のフォームがある場合です。 HTTP認証にはフォームがありません – bluerubez

3

ホストベースアドレスだけでなく、add_passwordメソッドへの完全なURLを提供する必要があります。

import mechanize 

project = "test" 
baseurl = "http://trac.somewhere.net" 
loginurl = "%s/%s/login" % (baseurl, project) 
b = mechanize.Browser() 
b.add_password(loginurl, "user", "secret", "some Realm") 
b.open(loginurl) 
+0

他の人の参考になると、これは変更されているか、そうでないようです。このインスタンスに 'baseurl'を指定すると、少なくとも機械化0.3.3の場合、指定された資格情報を使用して、その正確なベースルールで始まるすべてのURLが生成されます。 – kungphu

関連する問題