【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やセッションについて記事を書く予定です。

じゃ、またね✋