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

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

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

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

Node.js

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

Q&A

解決済

1回答

913閲覧

Linebotのクイックリプライを使いたいけどできない

lassieena

総合スコア18

LINE Messaging API

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

Node.js

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

0グッド

0クリップ

投稿2019/06/24 05:33

初めに

node.jsを使ってLinebotにじゃんけん機能をつけたい。MessagingAPIを使って、Linebotは作ることができたのですがクイックリプライ機能ができません。どこがいけないのでしょうか?

コード

js

1'use strict'; 2 3const express = require('express'); 4const line = require('@line/bot-sdk'); 5const PORT = process.env.PORT || 8000; 6const configs = require('./configs'); 7 8const config = { 9 channelSecret: configs.lineapi.channelSecret, 10 channelAccessToken: configs.lineapi.channelAccessToken 11}; 12const app = express(); 13const client = new line.Client(config); 14 15app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない) 16app.post('/webhook', line.middleware(config), (req, res) => { 17 console.log(req.body.events); 18 19 20 Promise 21 .all(req.body.events.map(handleEvent)) 22 .then((result) => res.json(result)); 23}); 24 25 26function handleEvent(event) { 27 console.log(event) 28 if (event.type === 'message' && event.message.type === 'text') { 29 handleMessageEvent(event) 30 } else { 31 return Promise.resolve(null) 32 } 33} 34 35function handleMessageEvent(event) { 36 let msg = { 37 type: event.message.type, 38 text: event.message.text 39 } 40 41 const eventMessageText = event.message.text.toLowerCase(); 42 if (eventMessageText === "じゃんけん") { 43 msg = { 44 "type": "text", 45 "text": "じゃんけんポン!", 46 "quickReply": { 47 "items": [{ 48 "type": "action", 49 "action": { 50 "type": "message", 51 "label": "パー", 52 "text": "パー" 53 } 54 }, 55 { 56 "type": "action", 57 "action": { 58 "type": "message", 59 "label": "グー", 60 "text": "グー" 61 } 62 }, 63 { 64 "type": "action", 65 "action": { 66 "type": "message", 67 "label": "チョキ", 68 "text": "チョキ" 69 } 70 } 71 ] 72 } 73 } 74 // msg = { 75 // "type": "message", 76 // "text": text, 77 // "quickReply": quickReply 78 // } 79 } else { 80 let hands = ['グー', 'パー', 'チョキ']; 81 let num = Math.floor(Math.random() * hands.length); 82 let hand = hands[num]; 83 let win; 84 switch (hand) { 85 case 'グー': 86 win = 'パー'; 87 break; 88 case 'パー': 89 win = 'チョキ'; 90 break; 91 case 'チョキ': 92 win = 'グー'; 93 break; 94 } 95 let text; 96 if (eventMessageText === win) { 97 text = format("{hand}!あなたの勝ち!", { 98 hand: hand 99 }); 100 } else if (eventMessageText === hand) { 101 text = 'あいこ!'; 102 } else { 103 text = format("{hand}!残念。あなたの負け!", { 104 hand: hand 105 }); 106 } 107 msg = { 108 "type": "text", 109 "text": text 110 } 111 } 112 return client.replyMessage(event.replyToken, msg); 113} 114 115 116// app.listen(PORT); 117(process.env.NOW_REGION) ? module.exports = app: app.listen(PORT); 118console.log(`Server running at ${PORT}`);

エラーコード

$ node server.js Server running at 8000 [ { replyToken: '00000000000000000000000000000000', type: 'message', timestamp: 1561354197556, source: { type: 'user', userId: 'Udeadbeefdeadbee' }, message: { id: '100001', type: 'text', text: 'Hello, world' } }, { replyToken: 'ffffffffffffffffffffffffffffffff', type: 'message', timestamp: 1561354197556, source: { type: 'user', userId: 'Udeadbeefddbee' }, message: { id: '100002', type: 'sticker', packageId: '1', stickerId: '1' } } ] { replyToken: '00000000000000000000000000000000', type: 'message', timestamp: 1561354197556, source: { type: 'user', userId: '' }, message: { id: '100001', type: 'text', text: 'Hello, world' } } ReferenceError: format is not defined at handleMessageEvent (/home/・・・/server.js:103:7) at handleEvent (/home/・・・/server.js:29:5) at Array.map (<anonymous>) at app.post (/home/・・・/server.js:21:26) at Layer.handle [as handle_request] (/home/・・・/node_modules/express/lib/router/layer.js:95:5) at next (/home/・・・/node_modules/express/lib/router/route.js:137:13) at /home/・・・/node_modules/@line/bot-sdk/dist/middleware.js:42:13 at process._tickCallback (internal/process/next_tick.js:68:7)

参考記事

](https://dev.classmethod.jp/etc/line-messaging-api-quick-reply-demo/)

開発環境

  • Messaging API
  • Node.js(v10.14.2)
  • now

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

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

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

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

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

guest

回答1

0

自己解決

できました。

'use strict'; const express = require('express'); const line = require('@line/bot-sdk'); const PORT = process.env.PORT || 8000; const configs = require('./configs'); const config = { channelSecret: configs.lineapi.channelSecret, channelAccessToken: configs.lineapi.channelAccessToken }; const app = express(); const client = new line.Client(config); app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない) app.post('/webhook', line.middleware(config), (req, res) => { console.log(req.body.events); Promise .all(req.body.events.map(handleMessageEvent)) .then((result) => res.json(result)); }); function handleMessageEvent(event) { if (event.message.type !== 'message' && event.message.type !== 'text') { return Promise.resolve(null) } let msg = { type: event.message.type, text: event.message.text } const eventMessageText = event.message.text.toLowerCase(); if (eventMessageText === "じゃんけん") { console.log("成功") msg = { "type": "text", "text": "じゃんけんポン!", "quickReply": { "items": [{ "type": "action", "action": { "type": "message", "label": "パー", "text": "パー" } }, { "type": "action", "action": { "type": "message", "label": "グー", "text": "グー" } }, { "type": "action", "action": { "type": "message", "label": "チョキ", "text": "チョキ" } } ] } } } else if (eventMessageText === "グー" || eventMessageText === "パー" || eventMessageText == "チョキ") { let hands = ['グー', 'パー', 'チョキ']; let num = Math.floor(Math.random() * hands.length); let hand = hands[num]; let win; switch (hand) { case 'グー': win = 'パー'; break; case 'パー': win = 'チョキ'; break; case 'チョキ': win = 'グー'; break; } let text; if (eventMessageText === win) { text = `${hand}!\n勝ち ` } else if (eventMessageText === hand) { text = `${hand}!\n負け` } else { text = `${hand}!\n負け` } msg = { "type": "text", "text": text } } else { msg = { "type": "text", "text": "" } } return client.replyMessage(event.replyToken, msg); } // app.listen(PORT); (process.env.NOW_REGION) ? module.exports = app: app.listen(PORT); console.log(`Server running at ${PORT}`);

投稿2019/06/25 01:05

lassieena

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問