面倒な事をシステムでなんとかする
弊社では勤怠システムが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使うならシェルいらないのでは?とかエラー処理されていないとか、実用するにはまだまだまだまだ改善すべき箇所が多く残っていますが、ひとまず目標は達成しました。