今日も昨日に引き続いて自作ツールのために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トークンを得ることができたので、目指しているフォーム送信処理の自動化もできそうだ。