面倒な事をシステムでなんとかする

弊社では勤怠システムがWEBシステムになっているのですが、忘れることがあったのでえいやーでなんとかしてみました。

・WEB上に勤怠システムがある
・emailアドレスとパスワードでログインする必要がある
・システムではlaravelのtoken処理が使われているらしく、cookieとtokenも一致させなければいけない
・Macの起動と終了で勤務時間とみなす
・自分しか使わない前提でとりあえず動くもの

ひとまず出勤と退勤処理をするためのプログラムを作成
できあがったものが以下

#!/usr/bin/env bash

function usage {
  cat <<EOM
Usage: $(basename "$0") [OPTION]...
  -h Display help
  -e VALUE E-mail address
  -p VALUE Password
  -t VALUE Type(start, end)
EOM

  exit 2
}

API_HOST='kintai-system-no-host-dayo'
_EMAIL=''
_PASS=''
_TYPE='start'

while getopts ":e:p:t:h" optKey; do
  case "$optKey" in
    e)
      _EMAIL="${OPTARG}"
      ;;
    p)
      _PASS="${OPTARG}"
      ;;
    t)
      if [ "x${OPTARG}" = "xstart" ]; then
        _TYPE='start'
      elif [ "x${OPTARG}" = "xend" ]; then
        _TYPE='end'
      else
        echo "-t ${OPTARG}: unknown type."
        usage
      fi
      ;;
    '-h'|'--help'|* )
      usage
      ;;
  esac
done


if [ "x${_EMAIL}" = "x" ]; then
  read -p "E-mail address: " _EMAIL
fi

if [ "x${_PASS}" = "x" ]; then
  read -sp "Password: " _PASS
fi

# cookieの保存場所
tmpfile=$(mktemp)

# トークンの取得
_TOKEN=$(curl -s -c ${tmpfile} https://${API_HOST}/login | xmllint --html --xpath '//*form/input/@value' - | grep value= | sed 's/[^"]*"\([^"]*\)"[^"]*/\1/g')

# ログイン
curl -L -b ${tmpfile} -c ${tmpfile} -d "_token=${_TOKEN}&email=${_EMAIL}&password=${_PASS}" https://${API_HOST}/login

# 出勤もしくは退勤
curl -L -b ${tmpfile} -c ${tmpfile} -d "_token=${_TOKEN}" https://${API_HOST}/dashboard/${_TYPE}/

exit

適当なファイル名eiya-de-kintai.shとして保存し、実行権限をつけておきます。

$ chmod +x ~/eiya-de-kintai.sh



実行するには以下のようにします。
出勤

$ ~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t start


退勤

$ ~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t end

プログラムの内容は
・curlでログインページの取得を行い、一時ファイルにcookieを保存
 同時にレスポンスbodyからxpathでinput要素のvalueにあるtokenを取得
・取得したcookieとtokenとメールアドレス(-e)とパスワード(-p)をログインページへPOSTし、ログイン状態のcookieを保存
・出勤もしくは退勤(-tで指定)のエンドポイントへログイン状態のcookieを使いtokenをPOST

ログイン判定してないとかcookieが残骸として残る等かなり手を抜いているがひとまず気にしない。徐々に手を加えていく予定。

Macの起動と終了で処理を走らせるには、「Macの起動=アプリケーションの起動」、「終了=アプリケーションの終了」とみなすことにし、作成したシェルスクリプトを呼び出すApplescriptを作成しました。

Macに標準で入っているスクリプトエディタを起動

↑こんなアイコン

以下のコードを記述

on run
	do shell script "~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t start"
end run

on quit
	do shell script "~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t end"
	continue quit
end quit

これを
 ファイルフォーマット:アプリケーション
 オプション:ハンドラの実行後に終了しない。
で保存します。

出来上がったアプリケーションをMacのログイン時に実行されるようにします。
「システム環境設定」にある「ユーザとグループ」を開き
「ログイン項目」へ作成したアプリケーションの登録を行います。

以上でとりあえずのものが出来上がりました。

Macを起動し、ログインすると自動で出勤処理が行われます。
Macの終了時には自動で退勤処理が行われ、何も意識しなくても勤怠処理が行われるようになりました。


そう、エラーさえなければ・・・

アカウント情報を平文で書いているとかApplescript使うならシェルいらないのでは?とかエラー処理されていないとか、実用するにはまだまだまだまだ改善すべき箇所が多く残っていますが、ひとまず目標は達成しました。