Symfoware

Symfowareについての考察blog

Python Windows認証サイト(NTLM認証)をmechanizeで操作する

Pythonのmechanizeを触ってみました。
Windows認証で保護されたサイトを操作できるか試してみます。

準備



IISのサイトにWindows認証を設定。
http://symfoware.blog68.fc2.com/blog-entry-1827.html

入力値を受け付け、結果を表示するプログラムを作成しました。

・input.aspx


  1. <%@ Page Language="C#" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>formテスト</title>
  8. </head>
  9. <body>
  10.     入力
  11.     <form method="post" action="result.aspx" name="inputForm">
  12.         <div><input type="text" name="input_1"></div>
  13.         <div><input type="text" name="input_2"></div>
  14.         <div><input type="submit" name="sub" value="登録"></div>
  15.     </form>
  16. </body>
  17. </html>




・result.aspx


  1. <%@ Page Language="C#" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>form入力結果</title>
  8. </head>
  9. <body>
  10.     <div>input_1:<% Response.Write(Request.Form["input_1"]); %></div>
  11.     <div>input_2:<% Response.Write(Request.Form["input_2"]); %></div>
  12.     <div>value:<% Response.Write(Request.Form["sub"]); %></div>
  13. </body>
  14. </html>







サンプル



Use python mechanize to log into pages with NTLM authentication
こちらを参考に、mechanizeのソースを一部修正します。

・_response.py

353行目付近

  1. # ここをコメント
  2. #        self.__iter__ = self.fp.__iter__
  3. #        self.next = self.fp.next
  4. # これ以降追加
  5.         if hasattr(self.fp, "__iter__"):
  6.             self.__iter__ = self.fp.__iter__
  7.             self.next = self.fp.next
  8.         else:
  9.             self.__iter__ = lambda self: self
  10.             self.next = lambda self: self.fp.readline()



Python mechanizeでボタンクリック
このプログラムを修正して実行します。

※ntlmがインストールされていない場合は、以下のコマンドでインストール。

$ sudo easy_install python-ntlm




  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import mechanize
  4. from ntlm import HTTPNtlmAuthHandler
  5. passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
  6. passman.add_password(None, 'http://192.168.1.10', 'Administrator@test.local', 'P@ssw0rd')
  7. # create the NTLM authentication handler
  8. auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)
  9. # Browserオブジェクトを生成
  10. br = mechanize.Browser()
  11. handlersToKeep = []
  12. for handler in br.handlers:
  13.     if not isinstance(handler,
  14.     (mechanize._http.HTTPRobotRulesProcessor)):
  15.         handlersToKeep.append(handler)
  16. br.handlers = handlersToKeep
  17. br.add_handler(auth_NTLM)
  18. # 非ロボット化
  19. br.set_handle_robots(False)
  20. # 対象のURLをオープン
  21. br.open('http://192.168.1.10/test/input.aspx')
  22. # フォームを選択
  23. br.select_form(name='inputForm')
  24. # 値を設定
  25. br['input_1'] = 'hoge'
  26. br['input_2'] = 'piyo'
  27. # submit
  28. response = br.submit()
  29. # 結果の読み取り
  30. print response.read()




想定通りの実行結果が得られました。


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>form入力結果</title>
</head>
<body>
    <div>input_1:hoge</div>
    <div>input_2:piyo</div>
    <div>value:登録</div>
</body>
</html>




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/01/23(土) 22:24:05|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ruby MechanizeでNTLM Authentication | ホーム | IIS 8.5(2012 R2)で認証方式にWindows認証を使用する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1828-cc15b2bc
この記事にトラックバックする(FC2ブログユーザー)