子供が産まれたから家庭に「LINE BOT」追加してみた

## 前置き
先日次女が産まれました。
長女が産まれたときは割と余裕があったので[子供が産まれたから「おうちハック」してみた](https://qiita.com/nori-shio88/items/82fa698de7963bcf4bf2)をしてたんですが、今回は長女の育児をしながら、模様替えやらで時間がなくガッツリ時間を取れない状況です。
とはいえ、ミルクやおむつ替え記録と夫婦間の共有を行う必要があります。

前回作ってたiPad上のアプリはAppleDeveloperライセンスを更新していないのと、非エンジニアの嫁としてはSlackが定着しなかったという点から復活させるより別の方法を考えたほうがよさそうです。

リアルでも知り合いの@LunaChevalierさんの記事で[LINEBOTで自分好みの秘書BOTを作ってみる](https://qiita.com/LunaChevalier/items/06706546762dfde04b44)と楽しそうなことをしてそうなのでLINE BOTを試してみます。


## やること
1. LINE Developerライセンスの登録
2. LINE MessagingAPIの用意
3. 記録用のスプレッドシートの作成
4. GASでPOSTを受け付けるAPIの用意

## 1.LINE Developersライセンスの登録
すでにLINEを利用しているのであれば以下のURLからログインして登録するのみです。
https://developers.line.biz/ja/

## 2.LINE MessagingAPIの用意
どのLINE BOTの記事からもリンクが貼られている[1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)を参考にしました。

ちょっと詰まったのはTOKENがボタンをポチらないと発行されない点です。他にチャンネルトークンなどもあり紛らわしいですがそれではなかったです。

![スクリーンショット 2020-10-07 22.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26911/4aa49794-ce57-3ac5-368f-1d21a360aa06.png)

## 3.記録用のスプレッドシートの作成
Google Drive上で任意の場所にスプレッドを作成します。
シートは赤ちゃんの「う ん ち」 や 「お し っ こ」を記録するための「排泄」シートと、
ミルクを飲んだことを記録する「ミルク」シートを用意します。

![スクリーンショット 2020-10-07 22.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26911/070689a7-4f5b-bd82-22eb-7a97e0a017ee.png)

スプレッドシートのURLからスプレッドシートのIDをメモしておきます。

## 4.GASでPOSTを受け付けるAPIの用意
Google Drive上の任意の場所にGASファイルを新規作成します。
そのGASファイルに記載したソースは以下そのまま記載します。

```javascript
// LINE developersのメッセージ送受信設定に記載のアクセストークン
var ACCESS_TOKEN = '<チャンネルアクセストークンを貼ります>';

function doPost(e) {
  // 送信された内容
  var events = JSON.parse(e.postData.contents).events[0];
  // WebHookで受信した応答用Token
  var replyToken = events.replyToken;
  // ユーザーのメッセージを取得
  var userMessage = events.message;

  // 返却用のメッセージ
  var replyMessage = "";
  
  // 記録用の情報
  var reqDate = new Date();
  var saveType = "";
  var saveMessage = "";
  
  if(userMessage.text){
    // メッセージテキストを送信
    if (userMessage.text.match(/ウンチ|うんち/)) {
      replyMessage = "うんちが出たんですね！\n記録しました！！";
      saveType = "排泄";
      saveMessage = "うんち";
    }
    if (userMessage.text.match(/オシッコ|おしっこ/)) {
      replyMessage = "おしっこが出たんですね！\n記録しました！！";
      saveType = "排泄";
      saveMessage = "おしっこ";
    }
    if(userMessage.text.match(/ミルク|みるく/)){
      const milk = userMessage.text.replace(/[^0-9]/g, '');
      replyMessage = "ミルクを"+milk+"ml飲んだんですね！\n記録しました！！";
      saveType = "ミルク";
      saveMessage = milk;
    }
  } else if(userMessage.type === 'sticker'){
    // ステッカーの送信
    // https://static.worksmobile.net/static/wm/media/message-bot-api/line_works_sticker_list_new.pdf
    if(userMessage.stickerId === "284"){
      replyMessage = "うんちが出たんですね！\n記録しました！！";
      saveType = "排泄";
      saveMessage = "うんち";
    }    
  }
  //スプレッドに記録
  log(reqDate,saveType,saveMessage);
  if(!replyMessage){
    // その他
    replyMessage = "わからないンゴ";
  }
    
  // 応答メッセージ用のAPI URL
  var url = 'https://api.line.me/v2/bot/message/reply';

  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': replyMessage,
      }],
    }),
    });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

function log(reqDate,saveType,saveMessage){
  var target = "<スプレッドシートのIDを貼ります>";
  var spreadsheet = SpreadsheetApp.openById(target);
  var sheet = spreadsheet.getSheetByName(saveType);
  var lastRow = sheet.getLastRow();
  sheet.getRange(lastRow + 1, 1).setValue(reqDate);
  sheet.getRange(lastRow + 1, 2).setValue(saveMessage);
}
```

### メモ
* ミルクの場合は送信されたテキストメッセージから数字のみを抜き出して記録します。
* ステッカーでウンチだけ対応させてます。
  * 他のステッカーは[コチラ](https://static.worksmobile.net/static/wm/media/message-bot-api/line_works_sticker_list_new.pdf)

![スクリーンショット 2020-10-07 23.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26911/472639c5-1515-5dbb-9be8-0ec43e376f5f.png)

### 残りの作業
できあがったらGASをウェブサービスとして公開して発行されたリクエスト用のURLをコピーしてLINE Developers側のWebHooks先のURLとして指定させれば完了です。