Google Apps Script(GAS)を用いて,より本格的な機能を利用できるLINE Botを作成します.
Note
このハンズオンでは,Messaging APIの無料枠の中で実装します.
ご自身で独自に実装を拡張される場合,Botからの自発的なメッセージは500通/月を超えると費用が発生しますのでご注意ください.
ただし,支払い手続きを行う前に課金されることはありません.
詳しくはこちらをご覧ください.
まずは LINE Developers のサイトにアクセスし,右上のコンソールにログイン
をクリックします.
開いた画面でLINEアカウントでログイン
をクリックし,ご自身のLINEアカウントでログインされてください.
Tip
QRコードログイン機能が便利です.
ログインできたら,まずはプロバイダー(Bot開発者のプロフィール)を作成します.
プロバイダー画面で,作成
をクリックして手順に従い作成します.
-
チャネル設定画面より,Messaging APIを有効化します.
Messaging API
の画像をクリックします. -
以下の項目をそれぞれ入力・アップロードし,利用規約を確認して
作成
をクリックします.- 会社・事業者の所在地・地域:日本
- チャネルアイコン:任意
- チャネル名:Botの名前を決めてください
- チャネル説明:Botの説明を入れてください(
test
など) - 大業種:保育・学校
- 小業種:大学所属サークル・部活動
-
以下の内容でMessaging APIチャネルを作成しますか?
と表示されます.内容を確認して,問題なければOK
をクリックします. -
チャネル基本設定
にて,以下の要素をコピーしてメモ帳などのアプリケーションに控えておきます.- チャネルID(上から1番目)
- チャネルシークレット(下から3番目,発行を押すと再発行されます)
-
Messaging API設定
を開き,表示されたQRコードをお手持ちのスマートフォンでスキャンして友だちとして登録します. -
Messaging API設定
の最下部にスクロールしてチャネルアクセストークン(長期)
の発行
をクリックします.
表示されたチャネルアクセストークンは,チャネルシークレットと同様に控えておきます. -
これからGoogle Apps Scriptを使用しますが,その後このLINE Developersのコンソール画面を再び操作します.
閉じないようにしておきましょう.
Caution
チャネルシークレットやチャネルアクセストークンは,他者に知られないように注意してください.
もしGitHubの公開リポジトリなどでうっかり公開してしまったときは,速やかに発行
ボタンをクリックして以前のものを無効化します.
これからGoogle Apps Scriptを使って,サーバプログラムを書いていきます.
まずはLINE Botから正常に情報を取得できるか試してみます.
-
Google Driveにアクセスし,任意の場所で左上の
新規
→スプレッドシート
をクリックします. -
左上の
無題のスプレッドシート
をクリックして名前をLINE Bot
に変更します. -
上部の
拡張機能
からApps Script
を開きます. -
同様に左上の
無題のプロジェクト
をクリックして名前をLINE Bot
に変更しておきます. -
書きかけの
myFunction
関数がありますがこれを削除して,以下のコードに置き換えます.function doPost(e){ let sheet = SpreadsheetApp.getActive().getActiveSheet(); sheet.appendRow([new Date(), e.postData.contents]); }
-
右上の
デプロイ
→新しいデプロイ
をクリックし,種類を選択
の右にある歯車⚙
からウェブアプリ
を選択します. -
表示された設定のうち,
アクセスできるユーザー
を全員
に変更し,デプロイ
をクリックします. -
アクセスを承認
をクリックし,ご自身のGoogleアカウントを選択します.
このとき,Googleが承認していない開発者によるアプリケーションを実行しようとしているため
Google hasn't verified this app
と表示されます. 自身で作成したアプリですので承認します.
左下に小さく表示されたAdvanced
からGo to LINE Bot(unsafe)
をクリックします. -
スプレッドシートの編集などを求める権限リクエストが表示されますので,
Allow
をクリックして許可します. -
問題なければ,デプロイIDとウェブアプリのURLが発行されます.
このうちウェブアプリのURL
をコピーして,メモ帳などのアプリケーションに記録しておきます.
-
LINE Developersのコンソール画面を開き,
Messaging API設定
からWebhook URLの編集
ボタンをクリックします. -
先ほど生成したウェブアプリのURLをここにペーストし,
更新
をクリックします. -
Webhookの利用
をオンにして,Webhook URL
の検証
をクリックします.
LINE Developersのコンソール画面に成功
と表示され,元のGoogleスプレッドシートに以下のような文字列が記録されればOKです.2024/04/16 15:00:00 {"destination":"U3a4...","events":[]}
-
LINE公式アカウント機能
の応答メッセージ
の右にある編集
をクリックし,応答メッセージ
をオフにします. -
LINEアプリから作成したBotアカウントに対して,何らかのメッセージを送信してみます.
Googleスプレッドシートに以下のような文字列が記録されればOKです.2024/04/16 15:20:00 {"destination":"U3a4...","events":[{"type":"message","message":{"type":"text","id":"5040...","quoteToken":"vFKAy...","text":"送信した文字列"},"webhookEventId":"01HV...","deliveryContext":{"isRedelivery":false},"timestamp":1713...,"source":{"type":"user","userId":"U97c..."},"replyToken":"ed08...","mode":"active"}]}
少し読みにくいので整形すると,以下のようなJSON形式のメッセージが出力されたことを確認できます.
今回はこちらのWebサービスを使って整形しました.{ "destination": "U3a4...", "events": [ { "type": "message", "message": { "type": "text", "id": "5040...", "quoteToken": "vFKAy...", "text": "送信した文字列" }, "webhookEventId": "01HV...", "deliveryContext": { "isRedelivery": false }, "timestamp": 1713..., "source": { "type": "user", "userId": "U97c..." }, "replyToken": "ed08...", "mode": "active" } ] }
どうやら
e.postData.contents
をJSONフォーマットのテキストとして読み込んだとき,
送信したメッセージは内部のevents
に含まれるmessage.text
に格納されているようですね.
取得したデータのうち,メッセージテキストのみを記録するようにしてみましょう.
-
Google Apps Scriptの編集画面を開きます.
-
以下の行を見つけ,
sheet.appendRow([new Date(), e.postData.contents]);
e.postData.contents
をJSON.parse(e.postData.contents).events[0].message.text
に差し替えます. -
左上の
デプロイ
→デプロイを管理
→右上の鉛筆マーク
をクリックし,バージョン
を新バージョン
にしてデプロイ
をクリックします. -
以降,LINEアカウントにテキストメッセージを送ったとき,自分が送信したメッセージ(と日付)のみがスプレッドシートに記録されていればOKです.
それでは,実際に送信されたメッセージを使用した処理を書いていきます.
送信されたメッセージを解析して,どのような処理を行うか分岐できるようにします.
-
先ほどの変更により,コードの3行目がとても長く読みにくいコードになっていると思います.
これは美しくないので,以下のように書き換えます.function doPost(e){ let sheet = SpreadsheetApp.getActive().getActiveSheet(); let data = JSON.parse(e.postData.contents); let events = data.events; for(let i = 0; i < events.length; i++){ let event = events[i]; if (event.type == 'message'){ if (event.message.type == 'text'){ sheet.appendRow([new Date(), event.message.text]); if (event.message.text == '教えて'){ // TBD } } } } }
-
左上の
デプロイ
→デプロイを管理
→右上の鉛筆マーク
をクリックし,バージョン
を新バージョン
にしてデプロイ
.
LINEアカウントにメッセージを送ってスプレッドシートに記録されることを確認します.
これで,
- ユーザが送信したメッセージがテキストなのかどうか
(ほかには,スタンプや画像などが送信される場合があります) - 送信された文字列が規定の文字列と一致するか
などを判定できるようになりました.
後半では,Raspberry Pi Pico Wと連携したLINE Botの開発に挑戦します.
プログラミング経験のある方は,あとの説明がなくとも好きなように実装できるかもしれません.
そのまま作成いただいても,後半をskipして応用コンテンツに取り組まれても構いません.
3-b. LINE Messaging API を利用した本格Botの開発 (後半) へ進む
4-(a) MQTT・クラウドサービスを使った本格IoT へ進む
4-(b) 他のボードやセンサ,ディスプレイなどを試してみる へ進む