前提・実現したいこと
ユーザーから送信される特定文字列に識別して動作が分岐するLineBotをGASで製作したいです。
例えば、
1 : 製作しているLineBotにユーザが「水を注文」と送信する
2 : LineBotから「お水ですね。軟水にしますか?硬水にしますか?」とメッセージを送る
3 : ユーザが「軟水」か「硬水」と送信する
4 : 軟水か硬水かで処理を分岐させて「〇水ですね。注文完了しました。」とメッセージをおくる
といったようにユーザからのアクションによって処理を分岐しながら進行させるBotの完成を目指しています。
2番までに関してはfunction doPost(e) 内で
// WebHookで受信した応答用Token var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; if(userMessage === "水を注文する") { UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + channel_token, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': [{ 'type': 'text', 'text': "お水ですね。軟水にしますか?硬水にしますか?", }], }), }); }
のようにして実現できているのですが、このあと3番と4番の処理をどのようにすればいいのかよくわかりません。
"お水ですね。軟水にしますか?硬水にしますか?"と尋ねた後、ユーザからレスポンスがあるまで入力待ちし、コードの進行を一旦止めて入力があった場合IF式で条件分岐 → 一定時間入力がなかった場合処理を終了する。といった構造にするのかなと勝手に想像しているのですが如何せん処理が複雑になりすぎる気がします。
いろいろググってみたのですが、これといった具体的な方法を見つけることができないのです。
世によくある対話型で処理を進めるLineBotはどういった作りになっているのでしょうか?
当方初学者につき、見当はずれの質問をしている可能性が高いことは重々認識しています。
回答して頂くにあたって不足している情報などありましたらできる限り対応させて頂きますのでお声がけください。
お付き合い頂ける方がいらっしゃいましたらお力添えを頂ければ幸いです。
よろしくお願いいたします。
追記 : 2020/10/21時点進捗
LINE BOT側が状態を維持しなければならないので、セッション(のようなもの)を管理しなければならないのだと思います。 「LINEBOT セッション」などと検索すると関連する話題がヒットします。 そういったものを調べ、必要であれば質問内容を更新するか、引き続き有識者からの回答をお待ちください。 (当方で検証できる環境にはないので以上、コメントのみです)
dodox86様より、以上のコメントを頂いたので、早速「LINEBOT セッション」で検索した結果、以下の有益な記事を発見することができました。
コメントありがとうございました。
LINEBOTで会話のステータス(文脈)管理(セッション管理?) https://qiita.com/shima-218/items/643406e5a8c0ed3b2176
記事内のコードにjavaが使用されていること、私にjavaの知識とプログラミング知識が欠如していることから、残念ながら記事内容の完璧な理解には及びませんでした。
検索エンジンを駆使してらこの記事内の内容を解読した結果、どうやらHashMapクラス、連想配列というものを使用して、UserIdと処理の進行具合を紐づけることで"セッション(のようなもの)"を管理し、If式で進行度による処理分岐を行っているという暫定解釈になりました。
連想配列の状態をLineBot側に維持させる方法はよくわかっていません。
ユーザが"水を注文"と送信したら連想配列に送信者のUserIdと水を注文しようとしているという進捗を保存し、"お水ですね。軟水にしますか?硬水にしますか?"とメッセージを送る処理をした後、いったんfunction doPost(e)を終了させて、ユーザから軟水か硬水かのレスポンスがあった時、改めてfunction doPost(e)が作動するわけですが、一回目のfunction doPost(e)処理で連想配列に情報を格納させた後、function doPost(e)を終了させた時点で連想配列の内容がクリアされてしまうように思います。これを維持させる方法を記事から読み解くことが現状できていません。
連想配列はよくわからないので、スプレッドシートにUserIdと処理の進捗を保存するシートを作ってそこにIdと進捗を保存しておいて、ユーザのレスポンスがあったときにスプレッドシートの内容を読み取って処理を分岐するという妥協策を検討しています。
このLineBotは完成後50名前後の程度のユーザーが毎日利用する予定なのですが、このような処理でも問題ないでしょうか?セルに書き込んだり読み込んだりする処理は負荷が高く不安定になるという話を聞くのでこれでいいのか疑問です。
連想配列を使った処理の勉強と妥協案の模索は平行して現在も続行しております。
この質問を見られた方で協力いただける方いらっしゃいましたらご助力いただければ幸いです。
あなたの回答
tips
プレビュー