【VBA】HTTP通信でWEBスクレイピング3~POSTでフォームを送信する~
POSTでフォームを送信する
活発な秋雨前線ですな。Jimです。どうも✋
雨が降って涼しいのはいいのだけど、農作物に影響あるみたいね。
はい。ってことで、今日は前回(GETでログイン画面を取得する)の続き『POSTでフォームを送信する』です。
前回はGETでログイン画面(HTML)を取得したところまでアップしていて、今回はその続きだね。
POSTでフォームの内容を送信できれば、あとはもう応用で色々できるでしょう。。
って発想。
したら、VBAを使ってPOSTでフォームの内容を送信する。
Option Explicit
Private Const url As String = "https://bw-rocket.com/http_scraping"
Private Const name As String = "admin"
Private Const pass As String = "1234"
Public Sub login()
'ログインページのGETリクエスト
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url & "/login.php", False
http.setRequestHeader "User-Agent", "Mozilla/5.0"
http.send
'レスポンスヘッダからクッキー取得
Dim setCookie As String
setCookie = http.getResponseHeader("Set-Cookie")
'DOMでcsrf属性の値を取得
Dim doc As Object
Set doc = CreateObject("HTMLFile")
doc.body.innerHTML = http.responseText
Dim csrf As String
csrf = doc.getElementsByName("_csrf")(0).Value
'フォームの内容をPOSTリクエスト
Dim postData As String
postData = "_csrf=" & csrf & _
"&username=" & name & _
"&password=" & pass
http.Open "POST", url & "/authenticate.php", False
http.setRequestHeader "Cookie", setCookie
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.send postData
'フォーム送信のレスポンス
Debug.Print http.responseText
Set http = Nothing
End Sub
POSTもGETの時と同じようなもので、、
http.Open "POST", url & "/authenticate.php", False
まず、Open時に『POST』ということと『URL』をフルパスで設定する。
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
次にリクエストヘッダにContent-Typeが『フォーム形式』ということを設定する。
わからなければ開発者ツールのRequest headersで確認できる。

Dim postData As String
postData = "_csrf=" & csrf & _
"&username=" & name & _
"&password=" & pass
http.send postData
そして最後に、フォームの内容を送信すればよい。
送信内容は下図のようになる。

で、上記のPOSTを送信に対してのレスポンスは、成功でも失敗でもログイン結果を返すようにしてある。
正しくフォームが送信できていれば『ログイン成功!』となる。

ちな、『csrfって何だぁ?削るかぁ?』Verで実行しよう。
Option Explicit
Private Const url As String = "https://bw-rocket.com/http_scraping"
Private Const name As String = "admin"
Private Const pass As String = "1234"
Public Sub login()
'ログインページのGETリクエスト
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url & "/login.php", False
http.setRequestHeader "User-Agent", "Mozilla/5.0"
http.send
'レスポンスヘッダからクッキー取得
Dim setCookie As String
setCookie = http.getResponseHeader("Set-Cookie")
'DOMでcsrf属性の値を取得
Dim doc As Object
Set doc = CreateObject("HTMLFile")
doc.body.innerHTML = http.responseText
Dim csrf As String
csrf = doc.getElementsByName("_csrf")(0).Value
'フォームの内容をPOSTリクエスト
Dim postData As String
postData = "username=" & name & _
"&password=" & pass
http.Open "POST", url & "/authenticate.php", False
http.setRequestHeader "Cookie", setCookie
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.send postData
'フォーム送信のレスポンス
Debug.Print http.responseText
Set http = Nothing
End Sub
ログインできないようにしてある。

当たり前だよね。そんなガバガバなログインがあるかって話。
それに、あまりにも簡単なログインにしてしまうと、実際に業務ツールにしようと思った時に詰んで『ったく使えねぇ記事だな』って思われちまうでしょ?
つーことで、『POSTでフォームを送信する』でした。
一応、勘のいい人は応用できるかもしれないけども、次回はCookieやセッションについて記事を書く予定です。
じゃ、またね✋


ディスカッション
コメント一覧
まだ、コメントがありません