2020-01-24に更新

【GAS】家族で使えるゴミ出しリマインダ LINEチャットボットを作った

はじめに

日常のゴミ出しって難題ですよね。

「今日燃えるゴミの日なのに、ゴミ出し忘れた!!」
「プラごみ出し忘れて今日で1ヶ月…また2週間後まで出せない…」

いや、できるのが普通当たり前のことなのかもしれないのですが、自分のような日常生活に支障をきたす程度の面倒くさがり+曜日感覚のない人間にとっては、ゴミを定期的に出すというのはかなりのハードルです。
一人暮らしの時にはアパートの入り口は基本ゴミの山。
結婚してからも自分の力でゴミ出しができた試しがなく妻には頭が上がらない。

男女問わずこんなダメ人間多忙なビジネスパーソンが多いと僕は信じています…。

ともあれ、そんなやっかいなゴミ出し問題を解決するために、家族や夫婦で活用できるアプリを制作しました。

「ゴミ出し日の前日にリマインドしてくれるLINEチャットボット」

一人暮らしで活用してもよし、旦那さんが奥さんのために率先してゴミ出ししてもよし、夫婦で共有してもよし、子供にゴミ出しを意識づけさせるために使ってもよし。

使用した技術

  • GAS(Google Apps Script)
  • LINE Messanger API

1.チャットボット詳細

改めて、このチャットボットで出来ることはとてもシンプルで、このLINE botアカウントと友達になっておくことで
「ゴミ出し日の前日夜9時にリマインダが送られてくる」
というものです。ただそれだけ。

曜日によって送る情報を変えることができるので、自分の地域のゴミ収集曜日を入れておくことでそれに応じてリマインドしてくれます。

↓いろいろ通知してくれるLINE bot 「にゃんこ通信」
Screenshot_20200117-181309.png

↓こんな感じに勝手にチャットが飛んできてお知らせしてくれます。うんこうんこ
Screenshot_20200117-181124.png

3.色々な情報をグローバルで定義しておく

Line Developersのチャンネル作成やプッシュメッセージの登録などが必要ですが、
今回はコードのみ紹介。

//チャンネル情報・ラインユーザー情報の取得
var CHANNEL_ACCESS_TOKEN = 'ここにアクセストークンを入力';
var USER_ID_M = 'ここにラインユーザーIDを入力';
var USER_ID_L = 'ここにラインユーザーIDを入力';

まず、チャンネルアクセストークンと、リマインダメッセージを送りたいラインのユーザーIDを変数に入れます。

これらはプログラム中で変更することがないので定数constに入れたいなあと思うのですが、どうやらconstはグローバルでは定義できないようです(参考リンク1
(定数は関数内でプライベートでのみ定義)
頭に書いておきたいので変数varで定義しておきます。

チャンネルアクセストークンと自身のLINEユーザーIDについては、LINE Developersのチャンネル情報で見れるので、それを利用します。

ちょっと手間がかかるのが複数人でこのbotを共有する場合。
僕の場合は妻とbotを共有したいので、メッセージの送り先として妻のLINEユーザーID(ラインで友達検索に使うラインIDとは別物です)を設定しなければなりません。

ところが、調べているとこれが簡単に取得できないことが発覚。
一旦置いておいて次項で。

//ユーザー入力項目
var weekday = ["日", "月", "火", "水", "木", "金", "土"];
var garbageCalendar = {
  "日":"",
  "月":"燃やすゴミ",
  "火":"",
  "水":"資源ゴミ",
  "木":"燃やすゴミ",
  "金":"",
  "土":""
};

次にユーザー入力項目ですが、
このgarbageCalendar変数に、オフジェクトでゴミ収集の曜日とゴミの種類を入れておきます。
地域のゴミ収集カレンダーから持って来ましょう。

3.他人のラインユーザーIDの取得

これには参考サイト1をそのまま活用させてもらいました。

取得したユーザーIDをグローバル変数に入れておきます。

4.リマインダのメイン処理

次に、リマインダのメッセージなどを記述して送信するためのgarbageReminder()関数というものを作ります。

//リマインダのメイン処理
function garbageReminder() {
//翌日の日時を取得
  var date = new Date();
  date.setDate(date.getDate() + 1);
//翌日の曜日を取得して、ゴミの種類を取得
  var dayNum = date.getDay();
  var day = weekday[dayNum];
  var garbageType = garbageCalendar[day];

//明日がゴミ収集日にリマインドメッセージを送信
  var message = "【ゴミ出し通信】\n";

  if(garbageType != ""){ 
    message += " 明日は${day}曜日、「${garbageType}」の日です。\n出すゴミをチェックしよう!".replace('${day}',day).replace('${garbageType}',garbageType);
    sendToLine(message);
  }else{

  };
}

前半では、今日の日付から曜日を取得してわちゃわちゃして翌日のゴミの種類を判別してます。

new Date()でまず今日の日付情報を取得できるので、その変数にdate.setDate(date.getDate() + 1);とすることで、翌日の日付情報を取得しています。
その取得した日付情報dategetDay()メソッドを使うことで曜日を取り出すことができます。曜日は数字になっているので注意。
曜日からゴミの種別を取ってくるときは、グローバルで定義しておいた配列とオブジェクトを使用します。

後半は、メッセージを送信する処理になります。
翌日がゴミ出し曜日の場合にのみ、変数messageに曜日やゴミの種別が入った文字列が入ります。
変数を文字列として送るときはreplaseメソッドを活用。
また改行を入れたいときは\n(記号はバックスラッシュ)を使います。

最後にsendToLine(message)という関数(次項に記述)を利用して、先ほどの変数
messageの値をラインに送信しています。

5.ラインに送信する処理

前項の最後の、実際にラインに送信するための色々な情報を記述する
sendToLine()関数を作ります。

//ラインに送信する処理
function sendToLine(message){
//色々なパラメータを設定
  var url = 'https://api.line.me/v2/bot/message/multicast';
  var headers = {
    'Content-Type':'application/json; charset=UTF-8',
    'Authorization':'Bearer ' + CHANNEL_ACCESS_TOKEN
  };

  var data={
    "to":[USER_ID1, USER_ID2],
    "messages":[{
      "type":"text",
      "text":message
    }]
  };

  var options = {
    'method':'post',
    'headers':headers,
    'payload':JSON.stringify(data)
  };
//LINE messanger APIを叩く
  UrlFetchApp.fetch(url, options);
}

最後のUrlFetchApp.fetch(url, options);がGASでAPIを叩く命令となります。
かっこの中は「どこへ、どの情報を送る」というイメージです。

そのために必要なものをその前に変数に入れて記述しています。
詳しくはLINE Developersの公式ドキュメント(Messaging APIリファレンス)を参照。

var urlにはHTTPリクエストを送るURLを記述します。
このurlの末尾をmulticastとしていることで、送り先を複数に設定しています。
この実際に送るのがvar datatoに配列で複数設定しているユーザーIDになっています。

例えばこのbotを自分だけが使用できれば良いという場合は、
HTTPリクエストを送るurlの末尾をpushにして、var datatoには自分のユーザーIDだけを指定しておけば良いですね。

詳しい説明は省いてしまいますが、このようにLINEのmessaging APIを叩くための諸々のパラメータをurl,headers,data, optionsに入れているわけです。

ここまでできたら、トリガーを登録することでリマインド機能が完成です!

課題

  • LINEのユーザーIDを調べる方法をコピペで実施しているので、コードを自分の頭で書いて理解してみようと思います。
  • というか、そもそもLINEユーザーIDをいちいち入れなくてもいい可能性はないか…?

おわりに

普段使っているラインを入り口にして色々できないかなーと考えるようになって
日常生活で欲しかったちょっとしたものを実際に作ってみた次第です。

これに夫婦で使いたい機能をちょっとずつ付け足していきたいと思っていて、
家計の金銭管理とか、買い物リストとか、直接ラインでやりとりするのは少し手間だったり精神的負担があったり…というようなほんと些細なことをツールで出来るようにしたいなーと思っています。

いずれリッチメニューなんかも作れるようになりたいですね。

夫婦中がちょっとだけアップするアプリを目指します。笑

参考にしたサイト

MEMO

Githubに全体のコードをあげています。
書き方はあまりスマートでない部分もあるかと思うので、その点はお手柔らかに。

LINEbot-for-life/push.gs at master · Massasquash/LINEbot-for-life · GitHub

また、LINE botのアイコンの画像はこちらのものを使用させていただいてます。感謝。
勉強猫 | 無料イラスト素材|素材ラボ

ツイッターでシェア
みんなに共有、忘れないようにメモ

Massa

北海道のただの畑作農家がプログラミングに取り組んでます。仕事や日常生活で感じる小さな不便を解消するべくプロダクト制作に取り組んでます。「自然の中で感じたことをカタチにする」をテーマに、プロダクト制作を通じて農作業をより楽しくするのが目標。 ■Ruby/Rails ■GAS+LINE bot ◇Capoeiraがライフワーク

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント