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

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

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

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

390閲覧

ラインボットでpushした後の返答を取得したいです

zfanr

総合スコア14

LINE Messaging API

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2019/04/29 04:13

前提・実現したいこと

ユーザーがラインボットに話しかけてきた後に、ラインボットがユーザーに質問をして、その回答を取得したいです。
その場合、どのように書けばいいのかわかりせん。

現状、ラインボットがユーザーに質問をする(push)ところまでは動作しています。
以下のような書き方が動作しないのは大枠として理解していますが、やりたいことはこのようなことだと思います。

javascript

1app.post('/hook', function (req, res) { 2//1回目のpost 3 app.post('/hook', function (req, res) { 4 //2回目のpost 5 }); 6});

該当のソースコード

javascript

1const express = require('express') 2const request = require('request') 3const bodyParser = require('body-parser'); 4const crypto = require("crypto"); 5const app = express() 6const port = process.env.PORT || 3000; 7 8app.use(bodyParser.urlencoded({ 9 extended: true 10})); 11app.use(bodyParser.json()); 12app.get('/', (req, res) => { 13 res.send('Hello world') 14}) 15app.post('/hook', function (req, res) { 16 17 if (!validateSignature(req.headers['x-line-signature'], req.body)) { 18 return; 19 } 20 21 const events = req.body.events; 22 const userId = events[0].source.userId; 23 const type = events[0].source.type; 24 const message = events[0].message; 25 26 if(type == 'user'){ 27 request.get( getProfileOption(userId), function (error, response, body) { 28 if (!error && response.statusCode == 200) { 29 30 const options = { 31 url: 'https://api.line.me/v2/bot/message/push', 32 headers: { 33 'Content-Type': 'application/json', 34 'Authorization': 'Bearer {' + process.env.LINE_CHANNEL_ACCESS_TOKEN + '}', 35 }, 36 json: true, 37 body: { 38 'to': userId, 39 'messages': [{ 40 "type": "text", 41 "text": '話しかけてくれてありがとう\nあなたのお名前を教えて' 42 }] 43 } 44 }; 45 request.post(options, function (error, response, body) { 46 if (!error && response.statusCode == 200) { 47 app.post('/hook', function (req, res) { 48 console.log('push後にユーザーが返事した場合'); 49 }) 50 } 51 52 }); 53 } 54 }) 55 } 56}) 57 58app.listen(port, () => { 59 console.log(`Example app listening on port ${port}`) 60}) 61 62function getProfileOption(userId) { 63 return { 64 url: 'https://api.line.me/v2/bot/profile/' + userId, 65 json: true, 66 headers: { 67 'Authorization': 'Bearer {' + process.env.LINE_CHANNEL_ACCESS_TOKEN + '}' 68 } 69 }; 70} 71function validateSignature(signature, body) { 72 const hmac = crypto.createHmac('sha256', process.env.LINE_CHANNEL_SECRET); 73 const data = new Buffer(JSON.stringify(body), 'utf8'); 74 const result = hmac.update(data).digest('base64'); 75 return signature == result; 76}

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

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

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

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

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

guest

回答1

0

ベストアンサー

何回めの返事なのか?とかは返ってくるメッセージに書かれていないので、送られてきたmessageを取得して、それをおうむ返しする形で整形したものを返せば良いかと思います。

なので一部ですが

body: { 'to': userId, 'messages': [{ "type": "text", "text": 'あなたのお名前は' + message + 'ですね' }] }

みたいな形にするとかかと思います。
でも、これだと名前じゃない場合でも、「あなたのお名前は〜」になるので、ほかの文字の時にどうするか?はまた考えないといけませんが、それっぽいことはこれで良いかと思います。

投稿2019/04/29 08:34

tomomi66

総合スコア94

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

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

zfanr

2019/04/29 09:05

回答ありがとうございます。 おうむ返しのボットはできました。 ただ、実現したいことはやっぱり以下のような流れなのです。 1.ユーザーがボットに話しかける 2.ボットがユーザーに質問する 3.ユーザーがボットに回答する 4.ボットがその値を受け取って何か処理をする (データベースに保存する・適切な値でない場合はユーザーに伝えるなど) ユーザーがボットに話しかけた時に、req.body.eventsの中にreplyTokenというものがありましたがこちらを利用したりするのでしょうか。おおまかな考え方を知りたいです。
tomomi66

2019/04/29 10:59

1.ユーザーがボットに話しかける 2.ボットがユーザーに質問する(reply) 3.ユーザーがボットに回答する 4.ボットがその値を受け取って何か処理をする(reply) です。 ユーザーから話しかけるが無く、ボットからユーザーに送る=push リファレンスをお読みください。 https://developers.line.biz/ja/reference/messaging-api/
zfanr

2019/04/29 11:51

pushとreplyについては理解いたしました。 ですが、その時に1か3かを判定する方法はあるのでしょうか。 1(ユーザーが最初に話しかけてきた)のか3(ボットの質問に回答した)のかで処理を分岐する必要があると思うのですが、記述の仕方のイメージが湧きません。
tomomi66

2019/04/29 12:01

私が理解している中では無いと思います。 ボタンテンプレートとかで回答を絞った上でifするしか方法が無いかな?と思っていますが…。
papinianus

2019/04/29 13:19

こちらが回答として正しい方針だとおもうので別回答をたてず、こちらにコメントさせていただきます。 1か3かを知るにはユーザとの会話履歴を保持することによってしか識別できません。ボットに送信されてきたメッセージには本文以外にも時刻・ユーザid(グループやルームidのこともある)が含まれますので、それを組合せて履歴データを必要なだけ構築しておき、ボットはこのユーザとどういう会話を進展させてきたかを、この過去の構築済みのデータから、判断する必要があります。これが構築できる仕組みがあれば、履歴がないことから状況「1」にあることが判断できます(実用されているボットは、過去履歴があっても一定時間経過すると忘れる機能もあると思います)。 e-mailのように「返信」という操作がないので、tomomi66様が挙げられたようにボタンを作るのでなければ、どれに対する返信かは、今回送られてきた情報だけからは判断できません。
zfanr

2019/04/29 14:02

そうなんですね。。。 最初に話しかけられた時にユーザIDをデータベースに保存しておいて、次に話しかけられたらそのIDをもとにデータベースに照合するという方法なのかと思っています。 tomomi66さん、papinianusさん ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問