サーティワンの日をお知らせするLINEBotを作った(1/2)

#きっかけ
ある日Qiitaを眺めていて思ったのです…。Qiitaで扱われる題材って、アニメとかアイドルとか、おじさん好みなものが多すぎて、JKが見ても面白くないんじゃないか？我々は、もっとJKがワクワクするようなアプリケーションを作って、JKにプログラミングの楽しさを知ってもらう必要があるんじゃないか？
そういった圧倒的使命感でこのbotをつくりました。

#サーティワンの日とは
>年に7回(1月、3月、5月、7月、8月、10月、12月)ある31日と3月1日は、ダブルコーン、ダブルカップが、なんと、通常価格の31%OFF!

引用：[トピックス：「31の日」［B-R サーティワンアイスクリーム］](https://www.31ice.co.jp/contents/topics/31day.html)

基本的には31日が対象で、おまけ的に3月1日も対象となっています。
なお今回記事を書いて気づいたのですが、アイスクリームの一番のシーズンである7月、8月にサーティワンの日が設定されるような構造になっております。ゆるふわなキャンペーンと思いきやここまで計算されていたなんて…サーティワンやりおる。

対象となるダブルコーン（カップ）は、その名の通りアイスが2つ選べる頼み方です。
2つ頼めるとなると、私なんかはバニラ系の甘いアイスとシャーベット系のさわやかなアイスを組み合わせたくなりますね…。
二種類の味を楽しめるうえ、31%OFFとは…これはお得…！

#概要
![IMG_3517.jpg](https://qiita-image-store.s3.amazonaws.com/0/104983/94d3de59-7e57-bfb4-d27c-5da9e4bfc37f.jpeg)

やっぱりサーティワンといえばキャラメルリボンですよね。
サーティワンの日の朝に、こんな感じで通知を入れてくれます。
このアカウントのおかげで、サーティワンの日を忘れて、つらみを感じることがなくなります:v:

![IMG_3519.jpg](https://qiita-image-store.s3.amazonaws.com/0/104983/818ca4ea-5a7a-5bb3-7ef0-b65c5b5b181e.jpeg)

#構成
Google Apps Script→LINE Messaging API→LINEアプリ

①Google Apps Scriptで、プログラムを日次で定期実行
②LINE Messaging APIにリクエスト
③LINEアプリにメッセージ送信
といった流れになります。

Google Apps Scriptは、クラウド上でJavascriptライクなスクリプトを実行できるサービスです。従来同じようなことをしようとすると、Linuxサーバを用意して、cron設定して…などだいぶ面倒だったかと思いますが、Google Apps ScriptならGoogleアカウント作るだけでめちゃくちゃ簡単に出来ます。

LINE Messaging APIは、LINEアプリとメッセージのやり取りをするためのAPIです。LINE Developersより手続きをすることで、アクセストークンが発行され利用可能となります。

#手順
①LINEよりMessaging APIの新規チャネルを作成
②Google Apps Scriptにスクリプトを登録
③定期実行を設定

まずはLINE Developersより、配信用のチャンネルを作成します。
LINEの中の人が書いている手順がQiitaにありましたので、そちらを参照すると良いかと思います。
[LINEのBot開発 超入門（前編） ゼロから応答ができるまで](https://qiita.com/nkjm/items/38808bbc97d6927837cd#channel%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)

LINE Developersの管理画面からは、「アクセストークン（ロングターム）」と「Your user ID」という値が確認できます。こちらの値は、コード内に記述する必要があるので、確認しておきます。

Google Apps Scriptは、Googleドライブから利用する手順が紹介されていることが多いですが、以下のURLから手続きを進めることで、登録可能かと思います。
https://www.google.com/script/start/

登録完了したら、以下のような管理画面がありますので、左上の「＋新規スクリプト」をクリック。

![Screenshot_2018-07-16 Apps Script.png](https://qiita-image-store.s3.amazonaws.com/0/104983/5ef20409-e569-e743-8f56-997d5c843245.png)

ブラウザ上で直接コード編集できるので、ガシガシ書いていきます。

![Screenshot_2018-07-16 サーティワンLINE通知(1).png](https://qiita-image-store.s3.amazonaws.com/0/104983/a23c5c68-77b6-8225-4ba8-3386f3ae5d5b.png)

コードが書き終わったら、スクリプトの定期実行の設定を行います。
メニューの「編集」→「現在のプロジェクトのトリガー」から、トリガーを設定します。
朝に通知をしたいので、午前7時～8時の実行とし、実行する関数はメイン処理を行う「main」を設定します。
![Screenshot_2018-07-16 サーティワンLINE通知(2).png](https://qiita-image-store.s3.amazonaws.com/0/104983/66f5cb8b-58a0-0cb7-0f2d-51270c30f6a8.png)

あとはGoogle先生におまかせし、日次でスクリプトを実行してもらいます。

#コード
現在日時を確認し、サーティワンの日の条件に合致していたら、Push APIで定型文を送ります。
該当日でなければ、特に処理は行いません。
なお「channel_access_token」「user_id」については、自身の値を設定します。

```javascript:31.gs
//メイン処理
//毎日AM7:00〜8:00に起動
function main() {
  //自分のアクセストークンを設定
  var channel_access_token = '';

  //自分のLINEのユーザIDを設定
  var user_id = '';

  var line_url = 'https://api.line.me/v2/bot/message/push';

  var date = new Date();
  var month = Utilities.formatDate( date, 'Asia/Tokyo', 'MM');
  var day = Utilities.formatDate( date, 'Asia/Tokyo', 'dd');

//  ログで日時が取得できていることを確認
//  Logger.log(month);
//  Logger.log(day);
  
  if(day === '31' || (day === '01' && month === '03')){
   var message = 'きょうは待ちに待ったサーティワンの日\uDBC0\uDC7F\nダブルコーン・ダブルカップが31%OFF!\n今すぐ近くの店舗へGO\uDBC0\uDC4B';
   push_message(line_url,channel_access_token,user_id,message);
  }
}

//LINEへプッシュ送信
function push_message(line_url,channel_access_token,user_id,message){
    UrlFetchApp.fetch(line_url,{
      'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + channel_access_token
      },
      'method': 'post',
      'payload': JSON.stringify({
        'to': user_id,
        'messages' : [
          {
            'type':'text',
            'text':message
          }
        ]
      })
    });
}
```

#今後の改善案
- 現在のコードだと自分自身にしか送信できないので、友達登録した人に、プッシュメッセージが配信できるようにする（must）
- Reply APIで季節のフレーバーの配信

#おわりに
~~あれ、[サーティワン公式アプリ](https://itunes.apple.com/jp/app/31club/id910133705?mt=8)でいいんじゃね？~~