私はすでにこれを AHK フォーラムに投稿しましたが、この情報は Stackoverflow にもアーカイブされるのに十分役立つと思います。:)
ツールと開始方法
まず第一に、ログインなどを行いたい場合は、おそらく HTML と HTTP プロトコルの基礎を学ぶ必要があります。FiddlerとSetProxy (2,"localhost:8888") は、デバッグとリバース エンジニアリングに大いに役立ちます。また、ブラウザのアドオンを使用して Cookie をすばやく消去することもお勧めします。
例 1 (IP ボード フォーラム)
さて、いくつかの例を見てみましょう。autohotkey.com フォーラムへのログインはどのようになりますか?
taht サイトのログインをリバース エンジニアリングするために、単純に autohotkey.com へのブラウザー HTTP 要求を分析し (そのためにブラウザーで Fiddler または F12 を使用します)、いくつかの試行錯誤により、それを基本に最小限に抑えることができました。ちょうど 2 つのリクエストが必要で、ログインには 1 つのリクエスト ヘッダーと 3 つの POST データ パラメータが必要です。
基本的に行うことは次のとおりです。
- http://www.autohotkey.com/board/index.php?app=core&module=global§ion=loginで簡単な GET リクエストを実行します。
- 応答本文 (ResponseText) からログイン フォームから auth_key パラメータを抽出します。
- auth_key パラメーターと、ログイン用のユーザー名、パスワード、rememberMe パラメーターを含む POST データ文字列を作成します。
- 次のリクエストの Content-Type ヘッダーを設定します
- POST データ文字列をhttp://www.autohotkey.com/board/index.php?app=core&module=global§ion=login&do=processに送信します
- HTML ドキュメントのタイトルが「サインイン」という単語で始まるかどうかを確認する応答本文を分析します。その場合は、明らかにサインインしていません (ログインに失敗したか、ログイン データが間違っています)。タイトルが違っていればログイン成功です。
例 1 コード
;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects
;Set our URLs
loginSiteURL := "http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login"
loginURL := "http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login&do=process"
;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
rememberMe := "1"
;Step 1
HttpObj.Open("GET",loginSiteURL)
HttpObj.Send()
;Step 2
RegExMatch(HttpObj.ResponseText,"<input\stype='hidden'\sname='auth_key'\svalue='(\w+)'\s/>",match)
auth_key := match1
;Step 3
loginBody := "auth_key=" auth_key "&ips_username=" username "&ips_password=" password "&rememberMe=" rememberMe
;Step 4/5
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)
;Step 6
If (InStr(HttpObj.ResponseText,"<title>Sign In"))
MsgBox, The login failed!
Else
MsgBox, Login was successfull!
URL を適切に変更すれば、これはおそらくほとんどの IPB フォーラムで機能します。
例 2 (phpbb フォーラム)
new/other AHK フォーラムにもう一度ログインしてみましょう (これははるかに簡単です)。
- ユーザー名、パスワード、autologin パラメータを含む POST データを作成します。
- Content-Type ヘッダーを設定する
- POST データをhttp://ahkscript.org/boards/ucp.php?mode=loginに送信します。
- HTML ドキュメントのタイトルが「ログイン」という単語で始まるかどうかを確認する応答本文を分析します。その場合、明らかにまだログインしていません (ログインに失敗したか、ログイン データが間違っています)。タイトルが違っていればログイン成功です。
例 2 コード
;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects
;Set our URLs
loginURL := "http://ahkscript.org/boards/ucp.php?mode=login"
;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
autologin := "on"
;Step 1
loginBody := "username=" username "&password=" password "&autologin=" autologin "&login=Login"
;Step 2/3
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)
;Step 4
If (InStr(HttpObj.ResponseText,"<title>Login"))
MsgBox, The login failed!
Else
MsgBox, Login was successfull!
URL を適切に変更すれば、これはおそらくほとんどの phpbb フォーラムで機能します。