時間のかかるコマンドの実行結果や処理完了を気軽にLINEに通知したい - LINE Notify

この記事は[ニフティグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nifty) の4日目の記事です。

昨日は@tatsuya-miyamotoさんの「[JavaScriptでメンバーをローテーションさせよう！](https://qiita.com/tatsuya-miyamoto/items/d95af55a6f5746460f9e)」でした。
こうやってエンジニアが自分の技術を駆使して自動化を推進し、より良い環境になっていくのは素敵ですね！

記事の最後に **なんとかなれ！** という強いメッセージがあったのを見つけたので **なんとかします！**

# はじめに
当日滑り込みで枠を取ったのでネタを何にしようか悩んだのですが、タイトルの通り日常生活で使えるTipsを紹介します！

みなさんは日常生活において **時間のかかるコマンド** を実行する機会はありませんか？
業務で使うようなシステムであれば「Slackなどのチャットツールに実行結果を通知する」など当たり前のように実装されていると思います。
しかし個人の環境ではどうでしょうか？
「**ちょっとコマンドを実行した時に結果を気軽に受け取りたい**」と思ったことはありませんか？
「**処理に数十分掛かるけどずっとは確認できない…でも実行結果が気になる…**」みたいな事ありませんか？

それ「**LINE Notify**」を使えば**無料**で**気軽**に実現できます！

### 時間のかかるコマンド（例）
- サイズの大きいファイルのコピー (ex. `cp ~`)
- サイズの大きいファイルのダウンロード (ex. `wget ~`)
- サイズの大きいファイルのFTPアップロード (ex. `lftp ~`)
- メディアのエンコード (ex. `ffmpeg ~`)
- CI/CDツールの実行結果 (ex. GitHub Actions)
- などなど

# LINE Notifyを使ってみる
それでは早速LINE Notifyを使ってみましょう！

## LINE Notifyの準備
まずはLINEに通知するための**トークンの発行**をおこないます
1. 普段使っているアカウントで [LINE Notify](https://notify-bot.line.me/ja/) にログイン
2. [マイページ](https://notify-bot.line.me/my/) にアクセスし「トークンを発行する」をクリック
3. 「トークン名」に任意の名前を設定し、通知の送信先を選択（とりあえず1:1でOK）
<img width="300px" alt="LINE Notify 設定画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187334/c974dc16-f9ad-9f64-8baf-862c1a350ca0.png">
4. 発行されたトークンを控える（このタイミングでしか確認できないので注意）
<img width="300px" alt="LINE Notify トークン発行画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187334/480183d1-edf4-cb9b-7763-c65a985da3d6.png">


これで準備は終わりです！

## LINE Notifyの動作確認
続いて軽く動作確認をしていきましょう。今回は`curl`を使ってAPIを叩きます。
以下の`{TOKEN}`を先程控えた**トークン**に置き換え実行してみてください

```
curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer {TOKEN}' -F 'message=Merry Christmas!!'
```

いかがでしょうか？以下のようなメッセージが届いていれば動作確認は成功です！

<img width="300px" alt="LINE Notify テスト受信" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187334/34968e10-9c21-c0e1-f130-8f6fc612568f.jpeg">

もし以下のようなエラーが返ってきた場合はトークンの確認や、再発行（削除→登録）を試してみてください。

```
{"status":401,"message":"Invalid access token"}
```

# コマンドの実行結果をLINEに通知する
それでは本題です。
実際に「時間のかかるコマンド」を使って実行結果をLINEに通知してみましょう！
以下では「時間のかかるコマンド」として`sleep 5`を使用しているため**実行後5秒後**に通知が届きます。
必要に応じてこの部分を任意の「時間のかかるコマンド」に変更してください。

## 失敗・成功に関わらず通知する
```
sleep 5 ; curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer {TOKEN}' -F "message=実行結果: $?"
```
`;`が左辺の成功失敗問わずに**終了次第**右辺が実行される事、`$?`で終了コードを取得できる事を利用する。[^1]

[^1]: 今回のサンプルでは簡略化のために終了コードをそのままメッセージに入れて表示していますが、IF文などで処理してあげれば「成功時」「終了時」のメッセージ切り替えが出来るようになります。

## 成功時に通知する
```
sleep 5 && curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer {TOKEN}' -F 'message=実行結果: 成功'
```

`&&`が左辺が**成功（終了コード0）の場合にのみ**右辺が実行されるのを利用する。

## 失敗時に通知する
```
sleep 5 || curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer {TOKEN}' -F 'message=実行結果: 失敗'
```
`||`が左辺が**失敗（終了コード0以外）の場合にのみ**右辺が実行されるのを利用する。


# まとめ
LINEのAPIと聞くとなんだか難しそうな感じもしますが、ただ一方的に通知を受け取るだけであれば無料で簡単に使うことができます！
サービスごとにトークンも発行できるため複数のサービスや目的に応じて利用することもできます。
※ 届くトークルームは共通ですが、頭の`[完了お知らせくん]`の部分が変わります

私は「ファイルの変換完了通知」や「GitHub Actionsを利用したWordPressのデプロイ完了通知」などをLINE Notifyを使って受け取っています。

[LINE NotifyのAPI仕様書](https://notify-bot.line.me/doc/ja/)を見るとわかりますが、パラメーターを指定してあげることで「画像やスタンプを送る」事や「通知なしでサイレントでメッセージだけ送る」といったことも出来るので、ぜひいろいろ試してみてください！

# おわりに
明日は@regurusuuuさんの「GCP で運動不足を解消**したかった**」です。
運動不足は解消されたのでしょうか？？結果は明日の記事でご確認ください！