FSharp.Dataライブラリをさわる(その2)

Webプログラムのイメージ

今日も昨日に引き続いて自作ツールのためにFSharp.Dataライブラリをさわっている。

最近のWebサービスのformはVue.jsなどを使って動的に生成されることが多く、さらにCSRF対策がされているため、自動化を進めるためにはいくらかの工夫が必要になる。

例えば、example.comといサイトにcreate-new-formというタグであらわされる動的生成のフォームがあったとして、そのタグが持っている:csrf属性に付与されているトークンをCSRFトークンとして送信するような作りになっていたとすると、フォームの自動入力に相当する操作に先んじてこのトークンを取得してくる必要がある。

<div id="mainArea" class="create-form-div">
<create-new-form
             name=""
            :errors='[]'
            locale="ja"
            :csrf='"9AWGbY8aAOq1gWcmD92ejrOSXBx9yEYo7BkafQ7T"'
        ></create-new-event-form>
</div>

こういう操作をするには、例えばPythonであればBeautiful Soupという著名なライブラリがあり、それを活用することでデータを取得することができる。

では、F#ではどうするか?――実は、この用途にもFSharp.Dataライブラリが活用できる。

具体的には、こんなコードを書く

open FSharp.Data

let results = HtmlDocument.Load("https://example.com")

let form =
    results.Descendants [ "create-new-form" ]
    |> Seq.choose (fun x -> x.TryGetAttribute(":csrf") |> Option.map (fun a -> a.Value()))
    |> Seq.toList

printfn $"{form}"

※ この例では、最後にSeq.toListを実行しているので、formはstring listになる。

こうしてCSRFトークンを得ることができたので、目指しているフォーム送信処理の自動化もできそうだ。