質問編集履歴

4 API取得サイトの追記

SasamiDaifuku

SasamiDaifuku score 4

2018/04/29 03:23  投稿

Dialogflow のチュートリアルのFulfillmentの部分がうまくいきません
### 前提・実現したいこと
GoogleのDialogflowのチュートリアルをしているのですが、
[Basic Fulfillment and Conversation Setup](https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)
のSetup Weather APIの章で詰まってしまったので質問します。
 
追記2018/04/29  
因みにWeather APIはここから持ってきています(おそらく)  
[Weather API 入手先](https://www.apixu.com/)  
 
### 発生している問題・エラーメッセージ
Setup Weather APIの章のチュートリアルの最後の部分で
weather
と入力したあとに
new york
と入力すると
new yorkの天気が出るとあるのですが、
Sorry I don't know the weather
が出てきてしまいます。
SHOW JSONの部分を見ると以下のように表示されます。
(responseID など固有の値は * に置き換えています)
```
{
 "responseId": "*",
 "queryResult": {
   "queryText": "new york",
   "parameters": {
     "date": "",
     "geo-city": "New York"
   },
   "allRequiredParamsPresent": true,
   "fulfillmentText": "Sorry I don't know the weather",
   "fulfillmentMessages": [
     {
       "text": {
         "text": [
           "Sorry I don't know the weather"
         ]
       }
     }
   ],
   "outputContexts": [
     {
       "name": "*",
       "lifespanCount": 5,
       "parameters": {
         "geo-city": "New York",
         "date.original": "",
         "date": "",
         "geo-city.original": "new york"
       }
     }
   ],
   "intent": {
     "name": "*",
     "displayName": "weather"
   },
   "intentDetectionConfidence": 1,
   "diagnosticInfo": {
     "webhook_latency_ms": 392
   },
   "languageCode": "en"
 },
 "webhookStatus": {
   "code": 13,
   "message": "Webhook call failed. Error: 500 Internal Server Error"
 }
}
```
Webhook call failed. Error: 500 Internal Server Errorがエラーメッセージぽいのですが、調べてもよくわかりませんでした。
### 該当のソースコード
ソースコードはチュートリアルにある通りのものをそのまま使用しています。
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
 // Get the city and date from the request
 let city = req.body.result.parameters['geo-city']; // city is a required param
 // Get the date for the weather forecast (if present)
 let date = '';
 if (req.body.result.parameters['date']) {
   date = req.body.result.parameters['date'];
   console.log('Date: ' + date);
 }
 // Call the weather API
 callWeatherApi(city, date).then((output) => {
   // Return the results of the weather API to Dialogflow
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({ 'speech': output, 'displayText': output }));
 }).catch((error) => {
   // If there is an error let the user know
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
 });
};
function callWeatherApi (city, date) {
 return new Promise((resolve, reject) => {
   // Create the path for the HTTP request to get the weather
   let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
     '&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
   console.log('API Request: ' + host + path);
   // Make the HTTP request to get the weather
   http.get({host: host, path: path}, (res) => {
     let body = ''; // var to store the response chunks
     res.on('data', (d) => { body += d; }); // store each response chunk
     res.on('end', () => {
       // After all the data has been received parse the JSON for desired data
       let response = JSON.parse(body);
       let forecast = response['data']['weather'][0];
       let location = response['data']['request'][0];
       let conditions = response['data']['current_condition'][0];
       let currentConditions = conditions['weatherDesc'][0]['value'];
       // Create response
       let output = `Current conditions in the ${location['type']}
       ${location['query']} are ${currentConditions} with a projected high of
       ${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
       ${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
       ${forecast['date']}.`;
       // Resolve the promise with the output text
       console.log(output);
       resolve(output);
     });
     res.on('error', (error) => {
       reject(error);
     });
   });
 });
}
```
### 試したこと
ここに問題に対して試したことを記載してください。
1つめ
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
の部分を
res.send(JSON.stringify({'fulfillmentText': response,}));
に変更
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
 // Get the city and date from the request
 let city = req.body.result.parameters['geo-city']; // city is a required param
 // Get the date for the weather forecast (if present)
 let date = '';
 if (req.body.result.parameters['date']) {
   date = req.body.result.parameters['date'];
   console.log('Date: ' + date);
 }
 // Call the weather API
 callWeatherApi(city, date).then((output) => {
   // Return the results of the weather API to Dialogflow
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({
     "fulfillmentText": response,
     }
   ));
 }).catch((error) => {
   // If there is an error let the user know
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({
     "fulfillmentText": response,
     }
   ));
 });
};
function callWeatherApi (city, date) {
 return new Promise((resolve, reject) => {
   // Create the path for the HTTP request to get the weather
   let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
     '&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
   console.log('API Request: ' + host + path);
   // Make the HTTP request to get the weather
   http.get({host: host, path: path}, (res) => {
     let body = ''; // var to store the response chunks
     res.on('data', (d) => { body += d; }); // store each response chunk
     res.on('end', () => {
       // After all the data has been received parse the JSON for desired data
       let response = JSON.parse(body);
       let forecast = response['data']['weather'][0];
       let location = response['data']['request'][0];
       let conditions = response['data']['current_condition'][0];
       let currentConditions = conditions['weatherDesc'][0]['value'];
       // Create response
       let output = `Current conditions in the ${location['type']}
       ${location['query']} are ${currentConditions} with a projected high of
       ${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
       ${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
       ${forecast['date']}.`;
       // Resolve the promise with the output text
       console.log(output);
       resolve(output);
     });
     res.on('error', (error) => {
       reject(error);
     });
   });
 });
}
```
結果→同じエラーが出る。
2つめ
GoogleCloudPlatformのバケットが
stanging.my-weather~
my-weather~
の二つあったので、
gcloud beta functions deploy weatherWebhook --stage-bucket [BUCKET_NAME] --trigger-http
の[BUCKET_NAME]をそれぞれに変更してコンパイルを行う。
結果→同じエラーが出る
以上です。
考えても検索しても糸口がつかめなかったので、
もしわかる方や、チュートリアルをこうしたらできたよという方がいましたら教えていただきたいです。
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
  • JavaScript

    23234 questions

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

  • API

    2052 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Cloud Platform

    282 questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

3

SasamiDaifuku

SasamiDaifuku score 4

2018/04/28 13:42  投稿

Dialogflow のチュートリアルのFulfillmentの部分がうまくいきません
### 前提・実現したいこと
GoogleのDialogflowのチュートリアルをしているのですが、
[Basic Fulfillment and Conversation Setup](https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)
のSetup Weather APIの章で詰まってしまったので質問します。
### 発生している問題・エラーメッセージ
Setup Weather APIの章のチュートリアルの最後の部分で
weather
と入力したあとに
new york
と入力すると
new yorkの天気が出るとあるのですが、
Sorry I don't know the weather
が出てきてしまいます。
SHOW JSONの部分を見ると以下のように表示されます。
(responseID など固有の値は * に置き換えています)
```
{
"responseId": "*",
"queryResult": {
"queryText": "new york",
"parameters": {
"date": "",
"geo-city": "New York"
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Sorry I don't know the weather",
"fulfillmentMessages": [
{
"text": {
"text": [
"Sorry I don't know the weather"
]
}
}
],
"outputContexts": [
{
"name": "*",
"lifespanCount": 5,
"parameters": {
"geo-city": "New York",
"date.original": "",
"date": "",
"geo-city.original": "new york"
}
}
],
"intent": {
"name": "*",
"displayName": "weather"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {
"webhook_latency_ms": 392
},
"languageCode": "en"
},
"webhookStatus": {
"code": 13,
"message": "Webhook call failed. Error: 500 Internal Server Error"
}
}
```
Webhook call failed. Error: 500 Internal Server Errorがエラーメッセージぽいのですが、調べてもよくわかりませんでした。
### 該当のソースコード
ソースコードはチュートリアルにある通りのものをそのまま使用しています。
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
// Get the city and date from the request
let city = req.body.result.parameters['geo-city']; // city is a required param
// Get the date for the weather forecast (if present)
let date = '';
if (req.body.result.parameters['date']) {
date = req.body.result.parameters['date'];
console.log('Date: ' + date);
}
// Call the weather API
callWeatherApi(city, date).then((output) => {
// Return the results of the weather API to Dialogflow
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ 'speech': output, 'displayText': output }));
}).catch((error) => {
// If there is an error let the user know
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
});
};
function callWeatherApi (city, date) {
return new Promise((resolve, reject) => {
// Create the path for the HTTP request to get the weather
let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
'&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
console.log('API Request: ' + host + path);
// Make the HTTP request to get the weather
http.get({host: host, path: path}, (res) => {
let body = ''; // var to store the response chunks
res.on('data', (d) => { body += d; }); // store each response chunk
res.on('end', () => {
// After all the data has been received parse the JSON for desired data
let response = JSON.parse(body);
let forecast = response['data']['weather'][0];
let location = response['data']['request'][0];
let conditions = response['data']['current_condition'][0];
let currentConditions = conditions['weatherDesc'][0]['value'];
// Create response
let output = `Current conditions in the ${location['type']}
${location['query']} are ${currentConditions} with a projected high of
${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
${forecast['date']}.`;
// Resolve the promise with the output text
console.log(output);
resolve(output);
});
res.on('error', (error) => {
reject(error);
});
});
});
}
```
### 試したこと
ここに問題に対して試したことを記載してください。
1つめ
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
の部分を
res.send(JSON.stringify({'fulfillmentText': response,}));
に変更
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
// Get the city and date from the request
let city = req.body.result.parameters['geo-city']; // city is a required param
// Get the date for the weather forecast (if present)
let date = '';
if (req.body.result.parameters['date']) {
date = req.body.result.parameters['date'];
console.log('Date: ' + date);
}
// Call the weather API
callWeatherApi(city, date).then((output) => {
// Return the results of the weather API to Dialogflow
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
"fulfillmentText": response,
}
));
}).catch((error) => {
// If there is an error let the user know
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
"fulfillmentText": response,
}
));
});
};
function callWeatherApi (city, date) {
return new Promise((resolve, reject) => {
// Create the path for the HTTP request to get the weather
let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
'&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
console.log('API Request: ' + host + path);
// Make the HTTP request to get the weather
http.get({host: host, path: path}, (res) => {
let body = ''; // var to store the response chunks
res.on('data', (d) => { body += d; }); // store each response chunk
res.on('end', () => {
// After all the data has been received parse the JSON for desired data
let response = JSON.parse(body);
let forecast = response['data']['weather'][0];
let location = response['data']['request'][0];
let conditions = response['data']['current_condition'][0];
let currentConditions = conditions['weatherDesc'][0]['value'];
// Create response
let output = `Current conditions in the ${location['type']}
${location['query']} are ${currentConditions} with a projected high of
${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
${forecast['date']}.`;
// Resolve the promise with the output text
console.log(output);
resolve(output);
});
res.on('error', (error) => {
reject(error);
});
});
});
}
```
結果→同じエラーが出る。
2つめ
GoogleCloudPlatformのバケットが
stanging.my-weather~
my-weather~
の二つあったので、
gcloud beta functions deploy weatherWebhook --stage-bucket [BUCKET_NAME] --trigger-http
の[BUCKET_NAME]をそれぞれに変更してコンパイルを行う。
結果→同じエラーが出る
以上です。
考えても検索しても糸口がつかめなかったので、
もしわかる方や、チュートリアルをこうしたらできたよという方がいましたら教えていただきたいです。
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
  • JavaScript

    23234 questions

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

  • API

    2052 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Cloud Platform

    282 questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

2

SasamiDaifuku

SasamiDaifuku score 4

2018/04/28 13:41  投稿

Dialogflow のチュートリアルのFulfillmentの部分がうまくいきません
### 前提・実現したいこと
GoogleのDialogflowのチュートリアルをしているのですが、
[Basic Fulfillment and Conversation Setup](https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)
のSetup Weather APIの章で詰まってしまったので質問します。
### 発生している問題・エラーメッセージ
Setup Weather APIの章のチュートリアルの最後の部分で
weather
と入力したあとに
new york
と入力すると
new yorkの天気が出るとあるのですが、
Sorry I don't know the weather
が出てきてしまいます。
SHOW JSONの部分を見ると以下のように表示されます。
(responseID など固有の値は * に置き換えています)
```
{
"responseId": "*",
"queryResult": {
"queryText": "new york",
"parameters": {
"date": "",
"geo-city": "New York"
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Sorry I don't know the weather",
"fulfillmentMessages": [
{
"text": {
"text": [
"Sorry I don't know the weather"
]
}
}
],
"outputContexts": [
{
"name": "*",
"lifespanCount": 5,
"parameters": {
"geo-city": "New York",
"date.original": "",
"date": "",
"geo-city.original": "new york"
}
}
],
"intent": {
"name": "*",
"displayName": "weather"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {
"webhook_latency_ms": 392
},
"languageCode": "en"
},
"webhookStatus": {
"code": 13,
"message": "Webhook call failed. Error: 500 Internal Server Error"
}
}
```
Webhook call failed. Error: 500 Internal Server Errorがエラーメッセージぽいのですが、調べてもよくわかりませんでした。
### 該当のソースコード
ソースコードはチュートリアルにある通りのものをそのまま使用しています。
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
// Get the city and date from the request
let city = req.body.result.parameters['geo-city']; // city is a required param
// Get the date for the weather forecast (if present)
let date = '';
if (req.body.result.parameters['date']) {
date = req.body.result.parameters['date'];
console.log('Date: ' + date);
}
// Call the weather API
callWeatherApi(city, date).then((output) => {
// Return the results of the weather API to Dialogflow
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ 'speech': output, 'displayText': output }));
}).catch((error) => {
// If there is an error let the user know
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
});
};
function callWeatherApi (city, date) {
return new Promise((resolve, reject) => {
// Create the path for the HTTP request to get the weather
let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
'&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
console.log('API Request: ' + host + path);
// Make the HTTP request to get the weather
http.get({host: host, path: path}, (res) => {
let body = ''; // var to store the response chunks
res.on('data', (d) => { body += d; }); // store each response chunk
res.on('end', () => {
// After all the data has been received parse the JSON for desired data
let response = JSON.parse(body);
let forecast = response['data']['weather'][0];
let location = response['data']['request'][0];
let conditions = response['data']['current_condition'][0];
let currentConditions = conditions['weatherDesc'][0]['value'];
// Create response
let output = `Current conditions in the ${location['type']}
${location['query']} are ${currentConditions} with a projected high of
${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
${forecast['date']}.`;
// Resolve the promise with the output text
console.log(output);
resolve(output);
});
res.on('error', (error) => {
reject(error);
});
});
});
}
```
### 試したこと
ここに問題に対して試したことを記載してください。
1つめ
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
の部分を
res.send(JSON.stringify({'fulfillmentText': response,}));
に変更
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
// Get the city and date from the request
let city = req.body.result.parameters['geo-city']; // city is a required param
// Get the date for the weather forecast (if present)
let date = '';
if (req.body.result.parameters['date']) {
date = req.body.result.parameters['date'];
console.log('Date: ' + date);
}
// Call the weather API
callWeatherApi(city, date).then((output) => {
// Return the results of the weather API to Dialogflow
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
"fulfillmentText": response,
}
));
}).catch((error) => {
// If there is an error let the user know
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
"fulfillmentText": response,
}
));
});
};
function callWeatherApi (city, date) {
return new Promise((resolve, reject) => {
// Create the path for the HTTP request to get the weather
let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
'&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
console.log('API Request: ' + host + path);
// Make the HTTP request to get the weather
http.get({host: host, path: path}, (res) => {
let body = ''; // var to store the response chunks
res.on('data', (d) => { body += d; }); // store each response chunk
res.on('end', () => {
// After all the data has been received parse the JSON for desired data
let response = JSON.parse(body);
let forecast = response['data']['weather'][0];
let location = response['data']['request'][0];
let conditions = response['data']['current_condition'][0];
let currentConditions = conditions['weatherDesc'][0]['value'];
// Create response
let output = `Current conditions in the ${location['type']}
${location['query']} are ${currentConditions} with a projected high of
${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
${forecast['date']}.`;
// Resolve the promise with the output text
console.log(output);
resolve(output);
});
res.on('error', (error) => {
reject(error);
});
});
});
}
```
結果→同じエラーが出る。
2つめ
GoogleCloudPlatformのバケットが
stanging.my-weather~
my-weather~
の二つあったので、
gcloud beta functions deploy weatherWebhook --stage-bucket [BUCKET_NAME] --trigger-http
の[BUCKET_NAME]をそれぞれに変更してコンパイルを行う。
結果→同じエラーが出る
以上です。
考えても検索しても糸口がつかめなかったので、
もしわかる方や、チュートリアルをこうしたらできたよという方がいましたら教えていただきたいです。
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
  • JavaScript

    23234 questions

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

  • API

    2052 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Cloud Platform

    282 questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

1

SasamiDaifuku

SasamiDaifuku score 4

2018/04/26 01:58  投稿

Dialogflow のチュートリアルのFulfillmentの部分がうまくいきません
### 前提・実現したいこと
GoogleのDialogflowのチュートリアルをしているのですが、
[Basic Fulfillment and Conversation Setup](https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)
のSetup Weather APIの章で詰まってしまったので質問します。
### 発生している問題・エラーメッセージ
Setup Weather APIの章のチュートリアルの最後の部分で
weather
と入力したあとに
new york
と入力すると
new yorkの天気が出るとあるのですが、
Sorry I don't know the weather
が出てきてしまいます。
SHOW JSONの部分を見ると以下のように表示されます。
(responseID など固有の値は * に置き換えています)
```
{
 "responseId": "*",
 "queryResult": {
   "queryText": "new york",
   "parameters": {
     "date": "",
     "geo-city": "New York"
   },
   "allRequiredParamsPresent": true,
   "fulfillmentText": "Sorry I don't know the weather",
   "fulfillmentMessages": [
     {
       "text": {
         "text": [
           "Sorry I don't know the weather"
         ]
       }
     }
   ],
   "outputContexts": [
     {
       "name": "*",
       "lifespanCount": 5,
       "parameters": {
         "geo-city": "New York",
         "date.original": "",
         "date": "",
         "geo-city.original": "new york"
       }
     }
   ],
   "intent": {
     "name": "*",
     "displayName": "weather"
   },
   "intentDetectionConfidence": 1,
   "diagnosticInfo": {
     "webhook_latency_ms": 392
   },
   "languageCode": "en"
 },
 "webhookStatus": {
   "code": 13,
   "message": "Webhook call failed. Error: 500 Internal Server Error"
 }
}
```
Webhook call failed. Error: 500 Internal Server Errorがエラーメッセージぽいのですが、調べてもよくわかりませんでした。
### 該当のソースコード
ソースコードはチュートリアルにある通りのものをそのまま使用しています。
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = '[YOUR_API_KEY]';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
 // Get the city and date from the request
 let city = req.body.result.parameters['geo-city']; // city is a required param
 // Get the date for the weather forecast (if present)
 let date = '';
 if (req.body.result.parameters['date']) {
   date = req.body.result.parameters['date'];
   console.log('Date: ' + date);
 }
 // Call the weather API
 callWeatherApi(city, date).then((output) => {
   // Return the results of the weather API to Dialogflow
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({ 'speech': output, 'displayText': output }));
 }).catch((error) => {
   // If there is an error let the user know
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
 });
};
function callWeatherApi (city, date) {
 return new Promise((resolve, reject) => {
   // Create the path for the HTTP request to get the weather
   let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
     '&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
   console.log('API Request: ' + host + path);
   // Make the HTTP request to get the weather
   http.get({host: host, path: path}, (res) => {
     let body = ''; // var to store the response chunks
     res.on('data', (d) => { body += d; }); // store each response chunk
     res.on('end', () => {
       // After all the data has been received parse the JSON for desired data
       let response = JSON.parse(body);
       let forecast = response['data']['weather'][0];
       let location = response['data']['request'][0];
       let conditions = response['data']['current_condition'][0];
       let currentConditions = conditions['weatherDesc'][0]['value'];
       // Create response
       let output = `Current conditions in the ${location['type']}
       ${location['query']} are ${currentConditions} with a projected high of
       ${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
       ${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
       ${forecast['date']}.`;
       // Resolve the promise with the output text
       console.log(output);
       resolve(output);
     });
     res.on('error', (error) => {
       reject(error);
     });
   });
 });
}
```
### 試したこと
ここに問題に対して試したことを記載してください。
1つめ
res.send(JSON.stringify({ 'speech': error, 'displayText': error }));
の部分を
res.send(JSON.stringify({'fulfillmentText': response,}));
に変更
```js
// Copyright 2017, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
const http = require('http');
const host = 'api.worldweatheronline.com';
const wwoApiKey = 'c431cc02700d4f16acb134539182404';
const wwoApiKey = '*';
exports.weatherWebhook = (req, res) => {
 // Get the city and date from the request
 let city = req.body.result.parameters['geo-city']; // city is a required param
 // Get the date for the weather forecast (if present)
 let date = '';
 if (req.body.result.parameters['date']) {
   date = req.body.result.parameters['date'];
   console.log('Date: ' + date);
 }
 // Call the weather API
 callWeatherApi(city, date).then((output) => {
   // Return the results of the weather API to Dialogflow
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({
     "fulfillmentText": response,
     }
   ));
 }).catch((error) => {
   // If there is an error let the user know
   res.setHeader('Content-Type', 'application/json');
   res.send(JSON.stringify({
     "fulfillmentText": response,
     }
   ));
 });
};
function callWeatherApi (city, date) {
 return new Promise((resolve, reject) => {
   // Create the path for the HTTP request to get the weather
   let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' +
     '&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date;
   console.log('API Request: ' + host + path);
   // Make the HTTP request to get the weather
   http.get({host: host, path: path}, (res) => {
     let body = ''; // var to store the response chunks
     res.on('data', (d) => { body += d; }); // store each response chunk
     res.on('end', () => {
       // After all the data has been received parse the JSON for desired data
       let response = JSON.parse(body);
       let forecast = response['data']['weather'][0];
       let location = response['data']['request'][0];
       let conditions = response['data']['current_condition'][0];
       let currentConditions = conditions['weatherDesc'][0]['value'];
       // Create response
       let output = `Current conditions in the ${location['type']}
       ${location['query']} are ${currentConditions} with a projected high of
       ${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of
       ${forecast['mintempC']}°C or ${forecast['mintempF']}°F on
       ${forecast['date']}.`;
       // Resolve the promise with the output text
       console.log(output);
       resolve(output);
     });
     res.on('error', (error) => {
       reject(error);
     });
   });
 });
}
```
結果→同じエラーが出る。
2つめ
GoogleCloudPlatformのバケットが
stanging.my-weather~
my-weather~
の二つあったので、
gcloud beta functions deploy weatherWebhook --stage-bucket [BUCKET_NAME] --trigger-http
の[BUCKET_NAME]をそれぞれに変更してコンパイルを行う。
結果→同じエラーが出る
以上です。
考えても検索しても糸口がつかめなかったので、
もしわかる方や、チュートリアルをこうしたらできたよという方がいましたら教えていただきたいです。
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
  • JavaScript

    23234 questions

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

  • API

    2052 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Cloud Platform

    282 questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る