【初心者向け】記念日を通知するLINE botをheroku + Node.jsで作る

## 概要
この記事では、HerokuとNode.jsを活用して特定のユーザ（少人数を想定）に記念日を通知するLINE Botを作るノウハウを紹介します。ここでの通知とは、時間指定でbotからユーザへの簡単なテキストメッセージを送ることを指します。

##事前準備１　LINE bot のチャネルの用意
LINE Botを作成するためにはLINEのMessaging APIというサービスを使います。
まずこのサービスを利用するためのチャネルを作成します。
以下をページを参考に必要な情報を入力して進めてください。

>https://developers.line.biz/ja/docs/messaging-api/getting-started/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90

実在するアカウントと同様にアイコンも設定できます。
ここでは、某作品より以下のようなアイコンを設定しました。　
![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/103176b7-5958-752e-a20e-5aa154c189c1.jpeg)


Messaging APIには、botからユーザへのメッセージ（Push）とユーザがbotに送ったメッセージに対する返信（Reply）
がありますが、今回使用するのは、Pushの方です。
![messaging-api-thumb0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/4771e325-dfd2-1329-2821-f4bd8bfef0e9.png)

>https://developers.line.biz/ja/services/messaging-api/
より引用


##事前準備2　ホストするサーバー(Heroku)の用意
次に、botをホストするサーバを用意します。
今回は無料で多くのサービスが利用可能なHerokuを使います。
Herokuの基本的な使い方やデプロイするまでの流れは、以下の記事が参考になると思います。
>https://qiita.com/arashida/items/b2f2e01259238235e187
>https://qiita.com/shti_f/items/b4b5d830672d908eff4e

##botの開発
今回はbotからのメッセージを送ることを想定しているので、起点はHerokuのアドオン機能であるheroku schedulerを利用することにします。（詳細は後述）
この設定は後ほど行うとして、まずは通知するためのプログウラムを記載します。
通常使うindex.jsとは別にファイルを一つ作成します。

>https://qiita.com/nkjm/items/38808bbc97d6927837cd

コードを書くにあたっては、Herokuの環境変数の設定などがあり、その点は上記の記事を参考にさせていただきました。



```js:sample.js
#!/usr/bin/env node
// モジュールのインポート
const server = require("express")();
const line = require("@line/bot-sdk"); // Messaging APIのSDKをインポート

// パラメータ設定
const line_config = {
    channelAccessToken: process.env.LINE_ACCESS_TOKEN, // 環境変数からアクセストークンセット
    channelSecret: process.env.LINE_CHANNEL_SECRET // 環境変数からChannel Secretをセット
};


// APIコールのためのクライアントインスタンスを作成
const bot = new line.Client(line_config);

      main();//メインとなる処理を適当に

//メッセージを送る処理
      function sendMessage(message){
          console.log("message:" + message);
          bot.pushMessage("XXXXXXXXXXXXXXXXXXXXXXXXXX",{  //送りたい相手のUserID
            type:"text",
            text: "今日ハ " + message + "ダゼェ！"
                      })

      }

    function main() {
      //現在日付の取得
      var today = new Date();
      var month = today.getMonth()+1;
      var date = today.getDate();
      var message = "";  //デフォルトのメッセージをなにか入れたい場合はここに入れる。


      //送るべきメッセージの判定
      //XXの誕生日
      if (month == 7 & date == 30 ) {
        message = "XXの誕生日"
        sendMessage(message);
      }
      //入籍届けを出した日
      else if (month == 8 & date == 11 ) {
        message = "入籍届けを出した日"
        sendMessage(message);
      }     
      //該当しない日は何もしない
      else {

      }
    }
```

今回は簡易的な作りでDBのようなものを持たせていないので、日付の判定もメッセージ送信先のIDもハードコードしています。

##package.jsonにJobの追加
heroku schedulerにキックしてもらうためのジョブと実際に動かすjsのファイルをpackage.jsonで紐付けます。

```json:package.json
{
  "name": "line_botXXXXX",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "job-push-sample": "node sample.js"
  },
  ...
```

##スケジューラの設定
スケジューラはHerokuのアドオン機能で日時や毎時の実行であれば、この機能で十分です。
※細かい設定はできないので、そのあたりまで実装したい方は別のサービスを使ったほうがいいでしょう
実際の設定は以下の記事を参考にさせていただきました。
>https://qiita.com/Taro_man/items/2eab3e3acad88c5b759e

実際の設定画面は以下の通りです。
npm run 「package.jsonで指定したjob」という記載の仕方です。
※時間は標準時での設定しかできない点に要注意。
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/eaee38ba-1ffe-609a-ee64-20c761be3fdd.jpeg)

設定は以上です！
実際に指定したユーザのラインにメッセージが飛んでいることを確認できましたでしょうか？

##まとめ
ラインは生活の中に浸透していることもあって、アイディアと工夫次第で面白いことができそうですね。
これからも可能性を探っていきたいと思います。