2011-12-08 10 views
3

私はMechanizeを使用して、非常に厄介なレガシーシステムとのやりとりを自動化しようとしています。特に、最初のログインページの後に、システムからあなたを叩いてしまうすべてのリクエストとともに、認証が送信されなければなりません。残念ながら、Mechanizeは最初に401 Unauthorizedエラーが発生した後にのみ認証を送信することに満足しているようです。毎回認可を送信する方法はありますか?401エラーを最初に得ることなく、Pythonの機械化と認証

は、ここではいくつかのサンプルコードです:

br.add_password("http://example.com/securepage", "USERNAME", "PASSWORD", "/MYREALM") 
br.follow_link(link_to_secure_page) # where the url is the previous URL 

は、ここで私は、デバッグから取得レスポンスのMechanizeの:

send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n' 
reply: 'HTTP/1.1 401 Unauthorized\r\n' 
header: Server: Tandy1000Web 
header: Date: Thu, 08 Dec 2011 03:08:04 GMT 
header: Connection: close 
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT 
header: Content-Type: text/html; charset=US-ASCII 
header: Content-Length: 210 
header: WWW-Authenticate: Basic realm="/MYREALM" 
header: Cache-control: no-cache 
send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nAuthorization: Basic VVNFUk5BTUU6UEFTU1dPUkQ=\r\nUser-Agent: Python-urllib/2.7\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Server: Tandy1000Web 
header: Date: Thu, 08 Dec 2011 03:08:07 GMT 
header: Connection: close 
header: Last-Modified: Thu, 08 Dec 2011 03:08:06 GMT 
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT 
header: Content-Type: text/html; charset=UTF-8 
header: Content-Length: 33333 
header: Cache-control: no-cache 

問題があることGET要求付きのモダンなWebアプリケーションで起こるべきことに反し、 401エラーを最初に打つことによって、私は間違ったページを取得します。私はCURLとurllib2を使って、最初のリクエストでauthヘッダーを渡してURLに直接アクセスすると正しいページを取得することを確認しました。

機械語に常にauthヘッダーを送信し、最初の401エラーを回避する方法についてのヒントはありますか?これは、クライアント側で修正する必要があります。私はサーバーを変更することはできません。

+0

あなたはこれを理解しましたか? – ytjohn

+0

ネガティブ。このコメント(2013年7月下旬)の執筆時点で、私はまだ答えを見つけていません。私が答えを見つけたり、他の誰かが答えを出したら、それを受け入れるようにします。 – Pridkett

+0

私は最後に尋ねたので、私はヘッダーを追加することでこれを解決することができました。 – ytjohn

答えて

2
from base64 import b64encode 
import mechanize 

url = 'http://192.168.3.5/table.js' 
username = 'admin' 
password = 'password' 

# I have had to add a carriage return ('%s:%s\n'), but 
# you may not have to. 
b64login = b64encode('%s:%s' % (username, password)) 

br = mechanize.Browser() 

# # I needed to change to Mozilla for mine, but most do not 
# br.addheaders= [('User-agent', 'Mozilla/5.0')] 

br.addheaders.append( 
    ('Authorization', 'Basic %s' % b64login) 
) 

br.open(url) 
r = br.response() 
data = r.read() 

print data 
関連する問題