【GAS】時限トリガー&応答型のLINE Botを作ってみた (1)なぜ作ったの?
GASを使ってLINE Botを作ってみました。まだ改良中ですが、気づき点などをメモします。1回目の今回は、作成のきっかけからコードの一部です。(コード全体は次の記事)
1. LINE Bot作成を思いついたきっかけ
お世話になっているランニングコミュニティのコーチが妊娠されて、週1回続けていただいていたオンラインの筋トレ指導が難しくなってきました。
健やかなお誕生を待つ間、メンバーで何かできることはないかな?
ということで思いついたのが、youtubeに蓄積されたこれまでの筋トレ動画のバックナンバーを活用すること。
バックナンバー動画には、コーチのお手本とメンバー自身の動画が集約されていて、理想的な動作と自分の癖を比較でき、仲間と一緒にトレーニングしている気分も味わえるので、これを見返しながら筋トレライブがない日に復習しているメンバーも多いのです。コロナが始まった頃から毎週続けてきているので、本数も溜まってそれなりに良いコンテンツになりそうです。
2.LINE Botを通じて解決すべき課題
ただ、このバックナンバー動画の活用には2つの課題がありました。
筋トレをしようと思っていても、忘れたり、後回しにしてしまいがちなこと
どの動画にどんな筋トレメニューが入っているのか分からないため、その日見たいバックナンバー動画が選びにくいこと
3. LINE Botで提供する解決策
そこで、過去の動画とそこに含まれる筋トレメニューを紐づけたデータベースを作ったうえで、次の2つのことをするLINE Botを作ってみよう!と思い立ちました。
毎朝、ユーザーに、今日やりたい筋トレは?とメッセージを送る
ユーザーから筋トレメニューを回答すると、その筋トレメニューが含まれる動画リンクを返信する
今日の時点で、上記の動作はOKになりました。今後は、動画が追加された時にどうするか、といったデータの収集や持ち方の問題も考えてみたいと思っています。また、繰り返し利用することにより、長い目で見た時に初期投資を上回るメリットを得る、というプログラミングの利点を生かすべく、クラスの活用にもいずれは挑戦できればと思っています。そしていつか、コーチにプレゼントできたら嬉しいですね♪
4. LINE Bot「筋トレくん」でやっていること
自分のgmailからタイトルで抽出したメッセージに含まれるyoutubeリンクを「マスタ」シートに転記(GAS→GMAILへ働きかけ)
QRコードから「筋トレくんver3」に登録したユーザーに対し、時限トリガーでBOTが定型メッセージを送信(GAS→LINE)
ユーザーが何か入力するとBOTが認識(LINE→BOT)して応答。その応答は2パターンあって、以下の(1)または(2)です。
(1)ユーザー入力がキーワードと部分または全部一致→一致するレコードの中からランダムに選んだレコードの情報をBOTが返信(GAS→LINE)
(2)ユーザー入力がキーワードに一致しない→「定期メッセージ」シートのメッセージをBOTが返信(GAS→LINE)
5. LINE Bot「筋トレくん」関連のコード(GAS)
1つの関数にすべての動作を含めることも可能ですが、関数を再利用したいため、いくつかの機能に切り分けて書いています。縦スクロールが苦手なので、短いコードですが、gsファイルを分けています。
コード全体は次の記事で♪
今回は、グローバル変数・定数だけを集めたgsファイルの中身だけメモします。
/** LINE Channel Access Token */
const ACCESS_TOKEN = PropertiesService.getUserProperties().getProperty('LINE_ACCESS_TOKEN');
/** LINE User ID */
const LINE_USER_ID = PropertiesService.getUserProperties().getProperty('LINE_USER_ID');
/** LINE Broadcast Url */
const BroadcastUrl = 'https://api.line.me/v2/bot/message/broadcast';
/** LINE Push Url このアプリでは不使用 特定のLINE_IDに送信する時に使用*/
const PushUrl = 'https://api.line.me/v2/bot/message/push'
/** LINE ReplyUrl */
const ReplyUrl = 'https://api.line.me/v2/bot/message/reply'
/** スプレッドシート(アクティブ=コンテナ) */
const SS = SpreadsheetApp.getActiveSpreadsheet();
/** 「マスタ」シート */
const Sh1 = SS.getSheetByName('マスタ');
/** 「定期メッセージ」シート */
const Sh2 = SS.getSheetByName('定期メッセージ');
★LINEチャネルアクセストークンの取得
以下のサイトを参考にさせていただきました。
セキュリティを向上させるため、ユーザープロパティに保存しています。
スクリプトプロパティまたはユーザープロパティに、他人に知られたくないトークンなどの情報を格納する方法は、こちらを参考にさせていただきました。
(★LINEユーザーID
LINEユーザーIDがわかっている相手(自分など)向け。応答型LINE Botでは結局使わなくなったのですが、別のLINE Botを使うときに丸っとコピペできるように残してあります。自分のLINEユーザーIDの取得の方法は以下のサイトを参考にさせていただきました。)
★LINE broadcast url
誰でも上記と同じurlです。
(★LINE push url
誰でも上記と同じurlです。LINEユーザーIDが分かっている相手に一方的に送信する場合に使用します。今回のBotでは結局使わなくなったのですが、別のLINE Botを使うときに丸っとコピペできるように残してあります)
★LINE reply url
誰でも上記と同じurlです。
続きはまた今度、、、♪