2011-06-21 6 views
4

企業ポータルにログオンするスクリプトを作成すると、特定のページに移動し、ページをダウンロードし、以前のバージョンと比較して特定の人に電子メールを送ります行われた変更に応じて変更することができます。最後の部分は十分に簡単ですが、それは私に最も困っている最初のステップです。PythonでPythonを使用してNTLMで保護されたWebサイトを参照するNTLM

urllib2(私はPythonでこれをやろうとしています)を使用して接続し、約4時間または5時間のグーグルで接続できない理由は、WebページのNTLM認証によるものだと判断しました。私は、このサイトと他のサイトで見つかった接続のために、さまざまなプロセスを試してみました。 NTLM exampleに基づいて、私が行っている:

import urllib2 
from ntlm import HTTPNtlmAuthHandler 

user = 'username' 
password = "password" 
url = "https://portal.whatever.com/" 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
# create the NTLM authentication handler 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 

# create and install the opener 
opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 

# create a header 
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
header = { 'Connection' : 'Keep-alive', 'User-Agent' : user_agent} 

response = urllib2.urlopen(urllib2.Request(url, None, header)) 

私は、次の取得(実際のユーザ名、パスワード、およびURLで)これを実行すると:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "ntlm2.py", line 21, in <module> 
    response = urllib2.urlopen(urllib2.Request(url, None, header)) 
    File "C:\Python27\lib\urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python27\lib\urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "C:\Python27\lib\urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python27\lib\urllib2.py", line 432, in error 
    result = self._call_chain(*args) 
    File "C:\Python27\lib\urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "C:\Python27\lib\urllib2.py", line 619, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "C:\Python27\lib\urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "C:\Python27\lib\urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python27\lib\urllib2.py", line 432, in error 
    result = self._call_chain(*args) 
    File "C:\Python27\lib\urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "C:\Python27\lib\urllib2.py", line 619, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "C:\Python27\lib\urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "C:\Python27\lib\urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python27\lib\urllib2.py", line 438, in error 
    return self._call_chain(*args) 
    File "C:\Python27\lib\urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "C:\Python27\lib\urllib2.py", line 521, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
    urllib2.HTTPError: HTTP Error 401: Unauthorized 

このトレースについての最も興味深いものですもの最後の行には401エラーが返されたというメッセージが表示されます。私が持っているものから、readはNTLMが起動されたときに401エラーがクライアントに返される最初のメッセージです。私はpython-ntmlの目的が私のNTLMプロセスを処理することだったという印象を受けました。それは間違っているのですか、それとも間違って使用していますか?また、私はこのためにpythonを使用することに縛られていないので、別の言語でこれを行う簡単な方法がある場合は私に知らせてください(私が見たことから、グーグルではありません)。 ありがとう!

+0

401は、NTLMは/認証を交渉開始する返送最初の応答です。しかし、それはあなたの認証が失敗したときの最終的な応答です。サーバーがNTLM認証をサポートしていますか?これはしばしば無効にされ、Negotiate(別名SPNEGO、別名Kerberos)認証だけがサポートされます。 –

+0

それは別のタイプ(Kerberos?)かもしれません。ヘッダーから取られたWWWWAuthenticateフィールドで、常に「交渉する」とは違う方法でアクセスしようとしていたときに考えてみましょう。ケルベロスのサポートがあるかどうか知っていますか? – jias

+0

したがって、認証ヘッダーは基本的にGSSAPI呼び出しに対するbase64の入出力値だけです。 python-krb5 https://fedorahosted.org/python-krbV/のようなものが役に立ちます。しかし、あなたのサイトですでにケルベロスをやっていないなら、これはまったく新しい虫の可能性があります。 IISでNTLMが有効になっていることを確認することをお勧めします。http://support.microsoft.com/kb/215383 –

答えて

1

サイトがNTLM認証を使用している場合、得られたHTTPErrorそう言うべきのヘッダ属性:

>>> try: 
... handle = urllib2.urlopen(req) 
... except IOError, e: 
... print e.headers 
... 
<other headers> 
WWW-Authenticate: Negotiate 
WWW-Authenticate: NTLM 
関連する問題