2009-05-26 13 views
10

Windowsのユーザー名とパスワードが必要なWebページからデータを取得したいと考えています。Pythonとurllib2によるWindows認証

はこれまでのところ、私が持っている:これはurllib2ので

opener = build_opener() 
try: 
    page = opener.open("http://somepagewhichneedsmywindowsusernameandpassword/") 
    print page 
except URLError: 
    print "Oh noes." 

サポートされていますか?私はPython NTLMを見つけましたが、私のユーザ名とパスワードを入力する必要があります。認証情報を何とか取得する方法はありますか(例えば、IEのように、Firefoxの場合はnetwork.automatic-ntlm-auth.trusted-urisの設定を変更してください)。

編集だから私は今、これを持っているmsanderの答え

後:かなりよくsocket_server.pyからリッピングされ

# Send a simple "message" over a socket - send the number of bytes first, 
# then the string. Ditto for receive. 
def _send_msg(s, m): 
    s.send(struct.pack("i", len(m))) 
    s.send(m) 

def _get_msg(s): 
    size_data = s.recv(struct.calcsize("i")) 
    if not size_data: 
     return None 
    cb = struct.unpack("i", size_data)[0] 
    return s.recv(cb) 

def sspi_client(): 
    c = httplib.HTTPConnection("myserver") 
    c.connect() 
    # Do the auth dance. 
    ca = sspi.ClientAuth("NTLM", win32api.GetUserName()) 
    data = None 
    while 1: 
     err, out_buf = ca.authorize(data) # error 400 triggered by this line 
     _send_msg(c.sock, out_buf[0].Buffer) 

     if err==0: 
      break 

     data = _get_msg(c.sock) 

    print "Auth dance complete - sending a few encryted messages" 
    # Assume out data is sensitive - encrypt the message. 
    for data in "Hello from the client".split(): 
     blob, key = ca.encrypt(data) 
     _send_msg(c.sock, blob) 
     _send_msg(c.sock, key) 
    c.sock.close() 
    print "Client completed." 

hereを参照してください)。しかし、私はエラー400 - 悪い要求を取得します。誰か他のアイデアはありますか?

おかげで、

ドム

+0

"認証情報を取得する"とは、ドメイン名とパスワードをどこかから取得してスクリプトで使用することですか?私もそれが可能かどうかを知ってほしい:) – kender

+0

@ケンダー - はい、まさに私が意味するものです。 –

+0

多分anwsers [私の質問](http://stackoverflow.com/questions/356321/scripted-files-download-under-windows)あなたを助けるでしょう。 – kender

答えて

-2

ウェブサイトが使用できる認証のいくつかの形式があります。

  1. HTTP認証。これは、ブラウザがあなたのユーザ名とパスワードを入力するためのウィンドウをポップアップする場所です。基本とダイジェストの2つのメカニズムがあります。ブラウザー(またはurllib2を使用するプログラム)に何をすべきかを伝えるページに付随する「Authorization」ヘッダーがあります。

    この場合、権限ヘッダーが必要とする回答を提供するようにurlopenerを設定する必要があります。 HTTPBasicAuthHandlerまたはHTTPDigestAuthHandlerのいずれかを作成する必要があります。

    AuthHandlersにはPasswordManagerが必要です。このパスワードマネージャーは、ハードコードされたユーザー名とパスワード(非常に一般的)を持つことができます。または、巧妙でWindowsパスワードをWindows APIから取り出すことができます。

  2. アプリケーション認証。これは、Webアプリケーションがユーザー名とパスワードで記入するフォームのページにあなたを誘導するところです。この場合、あなたのPythonプログラムはurllib2を使って、データが正しく記入されたPOST(request with data)を実行しなければなりません。通常、投稿への返信にはCookieが含まれています。これにより、さらにアクセスできるようになります。あなたはクッキーについて心配する必要はありません。urllib2はこれを自動的に処理します。

あなたはあなたがどのように知っていますか?応答にヘッダーをダンプします。 urllib2.openurlからの応答には、すべてのヘッダー(page.info())とページの内容が含まれます。

HTTP Authentication in Python

How would one log into a phpBB3 forum through a Python script using urllib, urllib2 and ClientCookie?

How do you access an authenticated Google App Engine service from a (non-web) python client?

+2

OPは、基本またはダイジェストを使用しない統合されたWindowsセキュリティについて質問しています。 – bpeikes

16

では、Windows上のクライアント・コードを記述すると、あなたのpython-win32のメーリングリストからマークハモンドのHooking in NTLM記事をお読みくださいシームレスなNTLM認証を必要としていると仮定すると、読んでいます本質的に同じ質問に答える。これは、Python Win32拡張機能に含まれているsspiサンプルコード(ActivePythonに含まれ、それ以外の場合はdownloaded here)になります。

+0

OK - これは私が行きたい、感謝のように見えます。 –