LoginSignup
1
0

More than 1 year has passed since last update.

Golangで認証ページを突破する

Last updated at Posted at 2022-06-30

きっかけ

 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で確認できます。

1 GoogleDeveloperToolを開いたら、ユーザー名と書いてある入力欄にカーソルを合わせます。
findbyid3.png

  1. カーソルはそのままにして、GoogleDeveloperToolのElementを見るとid="username"と書いてあります
    findbyid2.png

パスワードも同様です。

以下でも、GoogleDevoloperToolを開きボタンにカーソルを合わせて、Elementを見ると、
<bottom type="submit ...>Log in</bottom>と書いてあります。
このLog inを指定します。

btn := page.FindByButton("Log in")

以下のように書くことで、クリックを自動でしてくれます。

btn.Click()

そしてLMSのマイページに移動することができます

まとめ

自分の書いたコードが自動で動いたということに素直に感動しました。
今回はLMSで実装してみましたが、これ以外のサイトでもできるのかなと思います。
間違っているところがあれば教えてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0