Go言語とSeleniumでジョブカンの打刻をプログラムで行う

Blog Single

皆さん、ジョブカンでの勤怠の打刻を忘れたり面倒だと思ったことはないですか?

今回はGo言語とSeleniumを使って、ジョブカンの打刻を行うプログラムを作成します。

Seleniumとは

Seleniumというツールは、ブラウザの操作をプログラムで行うことができるWebアプリケーションのテストツールです。
SeleniumはWebアプリケーションのコードだけではテストできない、ブラウザでの操作を行って正しく動作するかどうかの確認や、ページのスクリーンショットを自動で撮ったりということができます。
アプリケーションのテスト以外にも今回のような自動操作やスクレイピングなどにもよく用いられます。

以前書いたGo言語でのWebスクレイピングの記事では取得してきたページから欲しい情報を取得するプログラムを作成しましたが、入力欄にデータを入力したり、リンクではなくボタンを操作したりといったことが必要になる場合があります。
その操作を行うためにSeleniumを用いてプログラムを作成します。

SetUp

Seleniumを操作するためのパッケージをインストールします。今回は、Go言語でSeleniumを扱いますがJavaやPythonなどでもSeleniumの操作のためのパッケージがあるため他の言語でも同様のことが行えます。

パッケージのインストール

go get github.com/sclevine/agouti

WebDriverのインストール

先ほどインストールしたパッケージから Selenium WebDriver を操作を行いますが、そのWebDriverをインストールする必要があります。

今回はChromeDriverを用いますが、FirefoxDriverなどもあります。

Macの場合

# homebrew/cask
brew tap homebrew/cask
# chromedrive
brew cask install chromedriver

サンプルプログラム

seleniumで行いたい操作は以下のドキュメントで確認できます。
agoutiのドキュメント

まずサンプルのプログラムとして、このサイトにアクセスしてスクリーンショットをプログラムを作成します。

sample.go

package main

import "github.com/sclevine/agouti"

func main() {
    // ChromeDriverの立ち上げ
    agoutiDriver := agouti.ChromeDriver()
    agoutiDriver.Start()

    // プログラム終了時にChromeDriverを閉じる
    defer agoutiDriver.Stop()

    // リンク先のページを開く
    page, _ := agoutiDriver.NewPage()
    page.Navigate("https://blog.fox-hound.tech/")
    // スクリーンショットを撮る
    page.Screenshot("foxhoundtech.png")
}

実行

go run sample.go

実装

サンプルプログラムではスクリーンショットを撮るという操作だけを行いましたが、出勤の打刻を行うにはログインフォームの入力とログインボタンの押下、そして遷移先のページで打刻を行うボタンを押下するといった動作が必要となります。

それを実現するためには、操作する要素の指定を行い、それに対しての動作を指定するということを行います。

操作する要素の指定(id=”email”の要素)

page.Find("#email")

指定した要素を操作(メールアドレスを入力)

page.Find("#email").Fill("hogehoge@example.com")

ボタンを押下

page.Find("button").Click()

これらを組み合わせると実装することができます。

punch-in.go

package main

import (
    "github.com/sclevine/agouti"
    "log"
)

func main() {
    // ChromeDriverの立ち上げ
    agoutiDriver := agouti.ChromeDriver()
    agoutiDriver.Start()
    // プログラム終了時にChromeDriverを閉じる
    //defer agoutiDriver.Stop()

    page, _ := agoutiDriver.NewPage()

    // ログインページを開く
    page.Navigate("https://ssl.jobcan.jp/login/pc-employee/")
    // 入力フォームにデータを記入 (会社名、メールアドレス、パスワードを設定)
    page.Find("#client_id").Fill("exampleCompany")
    page.Find("#email").Fill("hogehoge@example.com")
    page.Find("#password").Fill("password")

    page.Find("body > div > div > div.login-block > form:nth-child(3) > div:nth-child(5) > button").Click()

    status, err := page.Find("#working_status").Text()
    if err != nil {
        log.Println("正常にログインできていません。")
        status = "非ログイン"
    }

    if status == "未出勤" {
        page.Find("#adit-button-push").Click()
    log.Println("出勤ボタンを押しました。")
    } else {
        log.Println("現在" + status + "です。")
    }
}

実行

go run punch-in.go

プログラムで設定している内容を正しい会社名、メールアドレス、パスワードにすると正常に出勤の打刻を行うことができます。

今回は、出勤のためだけのプログラムにしましたが、条件判定を変更することで退勤や再入室を行うことができたり、出勤状態を確認するプログラムを作成してcrontabなどで平日の出勤時間をトリガーにそのプログラムを実行させるようにして、出勤していなければ何らかの動作を行うといったことも可能です。

以前書いたGo言語でのWebスクレイピングの記事と組み合わせて、ブラウザの操作が必要なスクレイピングもSeleniumを用いることで行うことができるので、興味を持った方はSeleniumを使ってプログラムを作成してみてはいかがでしょうか。

今回作成したようなWebページの自動操作やクレイピングに関するプログラムは、Webページがリニューアルなどで書き変わってしまうと、セレクタで正しく要素が取得できなくなると正しく動作しなくなるため気をつけましょう。

なお今回記載した内容による損害などについては責任を負いませんので、あくまでも自己責任でお願いします。

Posted by MatsumotoKazuki
PHPやJavaで開発を行っているエンジニア。 LOLというゲームの試合を観戦するのが好きです。

Other Posts: