きっかけ
Golangを今年の2月始めて触ってみて、書きやすい言語だなと思って何かGolangを使って遊んで見ようと思いました。そこで、簡単にブラウザをGolangによって操作させて、自動でログインできるような機能を作ってみようと思いました。
何をしたのか
今回は、私が普段大学で利用しているLMS(学習管理システム)を使いたいと思います。
LMSはもちろんのことログインをするためにはユーザー名とパスワードを入力しなければなりません。これを Golangを使うことでログイン認証を自動化させてみようと思います。
下準備
これらを実現させるために主に2つのフレームワークを使いました。
一つ目がagoutiです。簡単に言うとブラウザ操作を自動化させるためのフレームワークです。
まずは下準備としてこれをgo get
によってインストールしましょう。
go mod init asobi //go.modファイル生成
go get https://pkg.go.dev/github.com/sclevine/agouti
これで下準備は完了です。
実践
インポートするのは以下の通りです。
package main
import (
"log"
"time"
"https://pkg.go.dev/github.com/sclevine/agouti"
)
ここからmainを書いていきます。
func main() {
driver := agouti.ChromeDriver(agouti.Browser("chrome"))
if err := driver.Start(); err != nil {
log.Fatalf("Failed to start driver:%v", err)
}
defer driver.Stop()
page, err := driver.NewPage()
if err != nil {
log.Fatalf("Failed to open page:%v", err)
}
if err := page.Navigate("https://elms.u-aizu.ac.jp/login/index.php"); err != nil {
log.Fatalf("Failed to navigate:%v", err)
}
// ID, Passの要素を取得し、値を設定
identity := page.FindByID("username")
password := page.FindByID("password")
identity.Fill("own id") //"own id"には自分のユーザー名を記述
password.Fill("own password") //"own passwordには自分のパスワードを記述"
// formをサブミットして、ログイン
btn := page.FindByButton("Log in")
if err = btn.Click(); err != nil {
log.Fatalf("Failed to navigate:%v", err)
}
// 処理完了後、10秒間ブラウザを表示しておく
time.Sleep(10 * time.Second)
}
解説
ではここから解説していきます。(コメントの部分、一部は省略します。ごめんなさい)
まず、ブラウザ操作を自動化するための宣言をしています。私は普段ブラウザはchromeを使っているので、ここではchromeを指定しています。
driver := agouti.ChromeDriver(agouti.Browser("chrome"))
以下では、Navigate関数で指定したURLに遷移させています。
page.Navigate("https://elms.u-aizu.ac.jp/login/index.php");
以下では、FindByIDというメソッドで、ユーザー名の入力欄を指定しています。
(手動の場合、自分のユーザー名を入力するときユーザー名欄にカーソルを合わせます。これと同じ感覚です。)
identity := page.FindByID("username")
password := page.FindByID("password")
また、FindByIDに指定する"username"はGoogleDeveoperToolで確認できます。
パスワードも同様です。
以下でも、GoogleDevoloperToolを開きボタンにカーソルを合わせて、Elementを見ると、
<bottom type="submit ...>Log in</bottom>
と書いてあります。
このLog in
を指定します。
btn := page.FindByButton("Log in")
以下のように書くことで、クリックを自動でしてくれます。
btn.Click()
そしてLMSのマイページに移動することができます
まとめ
自分の書いたコードが自動で動いたということに素直に感動しました。
今回はLMSで実装してみましたが、これ以外のサイトでもできるのかなと思います。
間違っているところがあれば教えてください。