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

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

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

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

Dialogflow

Dialogflowは、Googleが提供している自然言語対話プラットフォーム。音声入力で自然言語の解析を行ってくれる機能で、対話型アプリを簡単に作成することが可能です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Node.js

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

Q&A

1回答

2035閲覧

Node.jsでのLINE公式bot(dialogflow使用)開発が上手くいきません

kuzumi

総合スコア1

LINE Messaging API

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

Dialogflow

Dialogflowは、Googleが提供している自然言語対話プラットフォーム。音声入力で自然言語の解析を行ってくれる機能で、対話型アプリを簡単に作成することが可能です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Node.js

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

0グッド

0クリップ

投稿2021/12/06 06:02

環境

Windows 64bit
言語:Node.js
PaaS:Heroku

やりたい事

Dialogflow(自然言語解析)によるユーザーの意図を汲んだbotを作成したい
参照:LINEのBot開発 超入門(後編) メッセージの内容と文脈を意識した会話を実現する

botとしての自動発信のほか、LINE Messaging APIのメッセージタイプ機能などを使いたいため、できればDialogflowのIntegrationsではなくNode.jsで動作を分岐させたく考えております。

一旦参考サイトの表記通り進めたものの、botが動作しなくなり自身で解決できず質問いたしました。

コードとエラーの内容

コードの内容(index.js)

// モジュールのインポート const server = require("express")(); const line = require("@line/bot-sdk"); // Messaging APIのSDKをインポート const dialogflow = require("dialogflow"); // ----------------------------------------------------------------------------- // パラメータ設定 const line_config = { channelAccessToken: process.env.LINE_ACCESS_TOKEN, // 環境変数からアクセストークンをセットしています channelSecret: process.env.LINE_CHANNEL_SECRET // 環境変数からChannel Secretをセットしています }; // ----------------------------------------------------------------------------- // Webサーバー設定 server.listen(process.env.PORT || 3000); // APIコールのためのクライアントインスタンスを作成 const bot = new line.Client(line_config); // Dialogflowのクライアントインスタンスを作成 const session_client = new dialogflow.SessionsClient({ project_id: process.env.GOOGLE_PROJECT_ID, credentials: { client_email: process.env.GOOGLE_CLIENT_EMAIL, private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\n/g, "\n") } }); // ----------------------------------------------------------------------------- // ルーター設定 server.post('/webhook', line.middleware(line_config), (req, res, next) => { // 先行してLINE側にステータスコード200でレスポンスする。 res.sendStatus(200); // すべてのイベント処理のプロミスを格納する配列。 let events_processed = []; // イベントオブジェクトを順次処理。 req.body.events.forEach((event) => { // この処理の対象をイベントタイプがメッセージで、かつ、テキストタイプだった場合に限定。 if (event.type == "message" && event.message.type == "text"){ events_processed.push( session_client.detectIntent({ session: session_client.sessionPath(process.env.GOOGLE_PROJECT_ID, event.source.userId), queryInput: { text: { text: event.message.text, languageCode: "ja", } } }).then((responses) => { if (responses[0].queryResult && responses[0].queryResult.action == "handle-delivery-order"){ let message_text if (responses[0].queryResult.parameters.fields.menu.stringValue){ message_text = `毎度!${responses[0].queryResult.parameters.fields.menu.stringValue}ね。どちらにお届けしましょ?`; } else { message_text = `毎度!ご注文は?`; } return bot.replyMessage(event.replyToken, { type: "text", text: message_text }); } }) ); } }); // すべてのイベント処理が終了したら何個のイベントが処理されたか出力。 Promise.all(events_processed).then( (response) => { console.log(`${response.length} event(s) processed.`); } ); });

heroku configにて環境変数[LINE_CHANNEL_ID][LINE_CHANNEL_SECRET][LINE_ACCESS_TOKEN][GOOGLE_PROJECT_ID][GOOGLE_PRIVATE_KEY][GOOGLE_CLIENT_EMAIL]に誤りがない事は確認いたしました。
エンコードはUTF-8です。

エラーの内容

2021-12-06T02:54:32.566069+00:00 app[web.1]: (node:4) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'stringValue' of undefined 2021-12-06T02:54:32.566079+00:00 app[web.1]: at /app/index.js:55:77 2021-12-06T02:54:32.566080+00:00 app[web.1]: at async Promise.all (index 0) 2021-12-06T02:54:32.566080+00:00 app[web.1]: (Use `node --trace-warnings ...` to show where the warning was created) 2021-12-06T02:54:32.566150+00:00 app[web.1]: (node:4) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) 2021-12-06T02:54:32.566208+00:00 app[web.1]: (node:4) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

stringValueが抽出されていないようなので、API連携が原因なのかと思っているのですが、初のGCPにてサービスアカウント設定などに自信がございません。
Entiesの[menu]にはvalue(松・竹・梅)が入っております。

経緯と現状

LINE公式アカウントを作成、特定の単語に反応して返信をするシンプルなbotを作成
→Herokuでデプロイし動作を確認

その後
0. 参照サイトの通りdialogflowのエージェントを作成
0. GCPで上記エージェントを内包するプロジェクトのサービスアカウントを作成
0. サービスアカウントで鍵(JSON)を作成
0. JSONを参照しHerokuの環境変数を設定
0. 上記コード(index.js)をデプロイ→botが無言botと化す

という経緯にございます。

どうしたら良いものか皆目見当もつかず、理解が浅い状態での質問にて大変恐縮ながらご教示いただけますと幸甚です。

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

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

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

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

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

guest

回答1

0

Dialog flowの設定画面で、IntentsのAction and parametersに
menuという名前のパラメータが存在しないのが原因ではないでしょうか?

もしそうならば、下記の手順で、menu という名前のパラメータを追加してみてはいかがでしょうか。

手順

(1)Training Phrasesの” Add user expression インプットボックスに、
認識させたいTraining Phraseを入力します。

イメージ説明

(2)インテントとして一致させたい文字列をマウスでドラッグし、選択状態にします。(図では「松」を選択)
イメージ説明

(3)すると、コンテキストメニューが現れるので、filterに「menu」と入力し、下の「@menu」を選択します。
イメージ説明

(4)これで、menuという名前のパラメータが追加されます。
イメージ説明

(5)右上のSAVEボタンをクリックして保存し登録を完了させます。
イメージ説明

投稿2021/12/08 15:37

編集2021/12/08 15:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問