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

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

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

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

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

532閲覧

LINE Messaging APIとlivedoor天気の連携

d0nchaaan

総合スコア14

LINE Messaging API

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

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/07/04 14:52

編集2018/07/05 12:10

前提・実現したいこと

LINEで地名を送信したら、その地名の天気を返してくれるbotを作っています。
天気情報はlivedoor天気のWeather Hacksから持ってきます。

実行環境はnode.jsです。

発生している問題・エラーメッセージ

undefined:1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ^ SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>) at Request._callback (C:\Users\user_name\Desktop\GoogleGit\wetherbot\LINE_Weather.js:197:15) at Request.self.callback (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:185:22) at emitTwo (events.js:126:13) at Request.emit (events.js:214:7) at Request.<anonymous> (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:1157:10) at emitOne (events.js:116:13) at Request.emit (events.js:211:7) at IncomingMessage.<anonymous> (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:1079:12) at Object.onceWrapper (events.js:313:30)

該当のソースコード

JavaScript

1const express = require('express'); 2const line = require('@line/bot-sdk'); 3const PORT = process.env.PORT || 3000; 4var json = null; /** jsonを入れる変数 */ 5 6/* LINEBotを使うためのAPI設定 */ 7'use strict'; 8const config = { // アクセストークンとシークレットをconfigに格納 9 channelAccessToken: '', 10 channelSecret:'' 11}; 12 13const app = express(); 14 15app.post('/webhook', line.middleware(config), (req, res) => { 16 console.log(req.body.events); 17 Promise 18 .all(req.body.events.map(handleEvent)) 19 .then((result) => res.json(result)); 20}); 21 22const client = new line.Client(config); 23var cityCode; 24 25/* LINEからPOSTをキャッチして処理するAPI */ 26function handleEvent(event) { 27 if (event.type !== 'message' || event.message.type !== 'text') { 28 return Promise.resolve(null); 29 } 30 /**受け取ったメッセージが連想配列にあるかを判定 */ 31 if (typeof city.prop !== event.message.text) { 32 cityCode = city[event.message.text]; // あった場合はcityCodeに都市ID(東京なら130010)を入れる 33 } 34 return client.replyMessage(event.replyToken, { 35 type: 'text', 36 text: strBody //実際に返信の言葉を入れる箇所 37 }); 38} 39 40app.listen(PORT); 41console.log(`Server running at ${PORT}`); 42 43/**連想配列で都市コードを定義 */ 44var city = { 45 '稚内': '011000', 46 '旭川': '012010', 47 '留萌': '012020', 48 '網走': '013010', 49 '北見': '013020', 50 '紋別': '013030', 51 '根室': '014010', 52 ~~~~~~~~~~~~~~~ 53 ~~~~~~~~~~~~~~~ 54}; 55/* livedoor天気から天気情報を取得するAPI */ 56var URL = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=' + cityCode; // 都市コードを足して取得する地域のURLを決める 57 58/** livedoor天気から天気情報を取得 */ 59let request = require('request'); 60request.get(URL, function (err, res, body) { 61 if (err) { 62 console.log('Error: ' + err.message); 63 return; 64 } 65 json = JSON.parse(body); 66

試したこと

handleEvent()関数内ではcityCodeに値が入っているのは確認済みです。
この関数外でcityCodeを使えれば上手くいきそうと睨んでいます。
handleEvent内に既にreturn文があるためreturnで変数を返すという方法もできませんでした。

補足情報(FW/ツールのバージョンなど)

プログラミングを初めて3カ月ほどですので、わかりにくいところや、ほかに必要な情報などあれば仰ってください

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因はlivedoor天気のAPIを呼ぶときに、cityCodeが正しく渡せておらずエラー画面のhtmlが返ってきているがjsonとして処理しようとして失敗しているように見えます。
requsetに渡しているURLの中身を確認してください。

呼び出し方法に関しては下記を参考にしてもらい、handler内でrequestの実行が完了した後にreplyMessageを呼び出すように修正すると、とりあえず動くようになると思います。

let request = require('request'); request.get(URL, function (err, res, body) { if (err) { console.log('Error: ' + err.message); return; } json = JSON.parse(body); // 天気情報取り出してstrBodyに格納する client.replyMessage(event.replyToken, { type: 'text', text: strBody //実際に返信の言葉を入れる箇所 }); }

投稿2018/07/05 00:02

shoya.shiraki

総合スコア430

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

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

d0nchaaan

2018/07/05 13:35

変数の参照範囲が原因だったんですね!解決しましたありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問