スマホから2タップでIEYASU(HRMOS)に勤怠登録する

身内需要のための記事ですが、せっかくの機会ということでQiita初投稿します。
追記： [弊社 Tech Blog](https://tech.sensetime.jp/?p=2189) と併せての投稿となりました

# 実現したいこと

私の勤務先では勤怠管理に [IEYASU](https://www.ieyasu.co/) というシステムを使っています。
追記：[「HRMOS勤怠 by IEYASU」](https://www.ieyasu.co/info/hrmos_kintai_by_ieyasu)に名称が変わりました

個人的に転職したばかりで、前職のものよりはるかに使いやすいシステムのため、日々感謝しております。
ただ1点感じたのは、出退勤時間を打刻するだけなら少し手間が多いことです。

1. PC/スマホのロックを解除する
1. Webアプリ/ネイティブアプリを開く
1. 社員番号とパスワードを入力し、ログインする（Webアプリの場合は都度必要）
1. 「出勤」または「退勤」ボタンを押す

![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/55b41530-8e17-e18b-4095-eec2933d6901.png)

このボタンを押すためだけにこれだけのステップを踏むのは、毎日となるとちょっと面倒です。そこで、なるべく簡単に済むようにしました。
なお、手元にあるのがiPhoneのためiOSの例となりますが、Androidでも似たことが可能のようです。

# 作戦

IEYASUにも[API](https://ieyasu.co/docs/api.html)はありますがTokenの有効期限があるため、再発行の手間を考えて今回は避けます。

代わりに、IEYASUとSlackの連携機能を利用します。

IEYASUのAppに対して「出勤」または「in」とチャットすることで出勤の打刻が、「退勤」または「out」で退勤ができます。
この方法には有効期限がなく、使い続けることができます。
![chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/5a9b3e94-b305-3f75-3327-bdc02aee18c5.png)
そこで「Slackに定型文チャットを送る操作」をなるべく簡単に済ます作戦を取ります。

# IEYASUとSlackの連携

なにはともあれ、まずは連携から始めます。
あとで使用するIDを取得するため、この作業はブラウザ版Slackから行います。

「App」セクションにIEYASUがいればOKです。
いない場合は、「+」ボタンから追加しましょう。
ボタンは2つありますがどちらでも同じです。
![chat2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/aa3d1e14-ab67-a594-71ba-e284728546ce.png)

追加できたら、「IEYASU」Appとのチャットを開いた状態で、URLを確認します。
URLの書式は
`https://app.slack.com/client/{ワークスペースID}/{チャンネルID}`
となっているので、チャンネルIDの方をどこかにコピーしておきます。
（チャットでも、チャンネルIDと呼ぶようです。）

# SlackAppの作成

続いて、このチャットに投稿するためのSlackAppを作ります。
[SlackAPIのページ](https://api.slack.com/apps)から "Create New App" を選択し、お好みの名前をつけて保存します。

このAppは「ユーザー自身としてチャットに投稿する」ことが必要なので、そのための権限を設定します。「Permissions」をクリックし、
![slack_2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/cd06c46d-d5b5-5e98-e82b-dd79f251dde9.png)

「User Token Scopes」の方に「[chat:write](https://api.slack.com/scopes/chat:write)」を設定します。
「Bot Token Scopes」は不要です。
![slack_3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/2b492240-0db8-328a-15d5-2efbafbd9e1f.png)

以上の準備ができたら、使用するワークスペースにインストールします。
インストール後、Tokenが発行されるのでどこかにコピーしておきます。
![slack_4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/2742e7ac-4147-4c5a-1fda-cc1a32da9381.png)

# iOSショートカットの作成

最後に、SlackAppを実行するための環境をiPhone上に作成します。
iPhoneに「ショートカット」Appをインストールし、新規作成します。

先ほどのチャンネルに投稿するためには、[chat.postMessageメソッド](https://api.slack.com/methods/chat.postMessage)を使います。

```bash
curl -X POST -d 'token={token}' -d 'channel={channel_id}' -d 'text={text}' 'https://slack.com/api/chat.postMessage'
```

iOSショートカットでcurlコマンドに相当するのは「URLの内容を取得」というアクションで、このように設定します。textに「in」と入れているので、この場合は出勤となります。
![shortcut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/50f72236-a92b-b630-d77f-fd8586838724.png)

さらに、出勤と退勤の時間はだいたい決まっているので、[こちらの方法](https://namayakegadget.com/43/)を利用して、1ボタンで出勤と退勤がどちらも打てるようにします。

最終的に出来上がったのがこちらです。6時〜14時なら出勤、それ以外なら退勤の登録を行います。
![shortcut2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/dd45cbe0-1563-d324-050f-2cf68fc799a5.png)

できたら、最後にショートカットを[お好きな位置に配置](https://support.apple.com/ja-jp/guide/shortcuts/apd029b36d05/ios)します。
私はロック画面から使えるようにしたいので、ウィジェット画面に配置しています。
![widget2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/9ebb60ce-8880-b218-4590-4eebd30d5252.png)


# 最後に

以上で完成です。
これで、iPhoneのロック画面からでも勤怠登録ができるようになりました。
私は手動トリガーで運用していますが、GPSやNFCタグも設定できますので、勤務形態に合わせて設定していただくとさらに便利かと思います。

なお、「ショートカット」AppはmacOS（Monterey以降）にも対応しています。私の場合、Macが目の前にある場合はわざわざiPhoneを取り出す方が面倒だと感じるので、メニューバーからも実行できるようにしています。もちろんシェルスクリプト等にすればMac以外でも実行可能なので、環境に合わせてご活用ください。
![menubar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429590/05df2112-d619-64bb-f6ce-feb8ec63b73d.png)



# 参考

- [ショートカット ユーザガイド - Apple サポート](https://support.apple.com/ja-jp/guide/shortcuts/welcome/ios)
- [iOS12で追加されたショートカットを使って会社のslackに遅刻の連絡をする - Qiita](https://qiita.com/0ba/items/ca75bfd328270078b034)
- [【iOSショートカット】時間ごとに動作を変える | 生焼けプログラマーの雑記帳](https://namayakegadget.com/43/)