質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Q&A

解決済

1回答

659閲覧

Line Messaging APIで受信したメッセージの振り分けたい

n.Taro

総合スコア19

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

0グッド

0クリップ

投稿2022/01/04 06:37

Lineを使って一問一答でユーザーが入力したメッセージを、割り振って
いくつかの項目(カラム)にわけてDB登録・更新をしたいです。(API自体は利用できています。)

Messaging APIで利用できるものとして
特定のアクションを起こしたユーザーに対して、メッセージの送信。
ユーザーが送ったメッセージを、Webhookのイベントでメッセージを受信。
はできたのですが、こちらの質問に対する回答かどうかの判断ができません。

Aというメッセージを送信した結果、Bというメッセージが受信できたといった使い方はできないのでしょうか?
APIリファレンスを見る限り、明確な解決方法がはみつかりませんでした。
LineBot関連やMessaging API関連の経験者で、よい方法ご存知の方おられましたら、ご教授ください。

今のところ解決策として
受信したメッセージの内容から、キーワードなどで回答と判断して、次の質問を聞く
もしくは
1回目の質問のあとは1回目の回答が来たと無理やり判断して、次の質問を聞くとか
くらいしか思いつきません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/04 11:28 編集

「一問一答でユーザーが入力したメッセージを、割り振っていくつかの項目(カラム)にわけてDB登録・更新」 ここの具体的な動作がわかりません。 以下のような理解でよろしいでしょうか? --- ユーザーがbotに対して「開始」とメッセージを送る(「開始」はここで一問一答の開始トリガーとなるキーワードとします) ↓ botが用意された質問からランダムに1つ選び、ユーザーに質問メッセージを送る。(例:今日は何時に起きた?) ↓ その質問に対してユーザーが回答メッセージをbotに送信する。(例:6時だよ) ------- 「一問一答」において回答を「割り振りたい」とは、 上記のように、1つの質問に対するユーザーの回答を紐づけたい、という理解でよろしいのでしょうか? (上記の例であれば「今日は何時に起きた?」という質問に対するユーザーの回答が「6時だよ」というテキストであることを識別したい、ということでしょうか) もし違うのであれば上記のような具体的な例で提示してください。
n.Taro

2022/01/05 01:00

わかりづらく申し訳ありません。 >上記のように、1つの質問に対するユーザーの回答を紐づけたい、という理解でよろしいのでしょうか? 仰るとおりです。
guest

回答1

0

(下記は、質問のユースケースが「Line botとユーザーとのやりとりである」という前提です。
botから特定のユーザーに質問メッセージを送信
->メッセージを送られたユーザーがbotに対して当該質問に対する回答を送付する
というユースケースを想定しています)

ユーザーからbotに対してメッセージを送信したときはリプライトークンが付与されます。
このリプライトークンを使って、元のメッセージを送信したユーザーに対して、botからリプライを送ることができます。

しかし、botからユーザーへのリプライや、botからユーザーへのプッシュメッセージ自体には、前述のリプライトークンのようなメッセージの文脈を紐付けるものは存在しません。
このため、Line Messaging APIに用意された仕組みだけで「Aというメッセージを送信した結果、Bというメッセージが受信できた」といった使い方はできないようです。
(言い直すと、botからのメッセージAに対応する、ユーザからの回答Bを、Line Messaging APIに用意された仕組みだけで識別することはでききないように思われます)

したがって、下記のような対応になろうかと思います。


次のような構造のデータベースを用意しておく

IDユーザーID送信日時受信日時送信メッセージ回答メッセージ

1.botからユーザーに対してメッセージを送信するとき、
データベースに、送信日時と送信先ユーザーID、ユーザーに送ったメッセージを記録する。

2.次にユーザーからメッセージが来たときに、データベースを調べる。
->当該ユーザーIDの一番直近の送信日時に該当するレコードの"受信日時"が空欄のときは、
自分(bot)が送信したメッセージに対応する応答であると判断する。
データベースに、受信日時とユーザーから受け取ったメッセージを記録する。


<具体例>
1.ユーザーが開始トリガーとなるキーワードをbotに送信
(開始トリガーキーワードが送られてきたときはデータベースに記録しない)
bot  <-------「開始」--------- ユーザー

2.botはリプライトークンとユーザーIDを取得。
ユーザーに対して質問を送信
bot   ----「今日は何時に起きた?」---> ユーザー

データベースに時刻とユーザIDと質問内容を記録

IDユーザーID送信日時受信日時送信メッセージ受信メッセージ
1U12345618:00今日は何時に起きた?

3.ユーザーがbotに対して返信
bot  <-------「6時だよ」--------- ユーザー
botはユーザーIDを取得
データベースから、該当するユーザーIDで、現在時刻に最も近い送信日時のレコードを探す。
->そのレコードの受信日時が空欄であれば、そのレコードの送信メッセージに対する回答であると判断し、
botに送られてきたメッセージテキストを、受信メッセージに記録する。
同時に受信日時も記録する。

IDユーザーID送信日時受信日時送信メッセージ受信メッセージ
1U12345618:0018:02今日は何時に起きた?6時だよ

このやり方を応用すれば、データベースから、「質問に対応する回答内容を振り分ける」ことができると思います。

一問一答ではなく会話を重ねていく場合、
たとえばデータベースに会話IDと継続回数カウンタを記録するカラムを追加しておき、
会話の都度、継続回数カウンタを1ずつ増やす、等のやり方が考えられます。

投稿2022/01/05 02:12

編集2022/03/13 01:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n.Taro

2022/01/05 02:32

>このため、Line Messaging APIに用意された仕組みだけで「Aというメッセージを送信した結果、Bというメッセージが受信できた」といった使い方はできないようです。 →やはりそうですか。。。 DBの構造までご説明いただきありがとうございます。 色々方法は考えていたのですが、ご提案いただいた方法も考慮してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問