2017-08-27 5 views
0

Je viens donc de commencer à créer des agents API pour l'Assistant Google. J'ai suivi tout dans la documentation api.ai au https://api.ai/docs/getting-started/basic-fulfillment-conversation afin que l'agent ci-dessous obtienne le temps et renvoie une réponse. C'est un code de travail mais je voulais être créatif avec la réponse. Ce que je vise à faire est d'obtenir le pays de la réponse et de décider si l'affichage de l'équivalent Celsius ou Fahrenheit de la température retournée. Mais en le testant dans la console, il continue à utiliser Celsius. Je veux aussi retourner des rappels amicaux basés sur la température que j'ajouterai plus tard.Assistant Google et confusion de l'API WorldWeatherOnline

'use strict'; 
const http = require('http'); 
const host = 'api.worldweatheronline.com'; 
const wwoApiKey = '[api key]'; 
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 API.AI 
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 minTemp = forecast['mintempC']; 
    let maxTemp = forecast['maxtempC']; 
    let unit = '°C'; 
    let location = response['data']['request'][0]; 
    //get country 
    let country = location['query'].split(",")[1]; 

    let conditions = response['data']['current_condition'][0]; 
    let currentConditions = conditions['weatherDesc'][0]['value']; 

    if(country == "Liberia" || country == "Myanmar" || country == "United States of America") 
    { 
     minTemp = forecast['mintempF']; 
     maxTemp = forecast['maxtempF']; 
     unit = '°F'; 
    } 

    // Create response 
    let output = 
    `Current conditions in the ${location['type']} 
    ${location['query']} are ${currentConditions} with a projected high of 
    ${maxTemp} ${unit} and a low of 
    ${minTemp}${unit} on 
    ${forecast['date']} in ${country}`; 
    // Resolve the promise with the output text 
    console.log(output); 
    resolve(output); 
    }); 
    res.on('error', (error) => { 
    reject(error); 
    }); 
}); 
}); 
} 
+1

Bienvenue dans Stack Overflow! Ces types de questions (révision) conviennent mieux à [codereview.se]. Je vous recommande de poster là-bas, sauf si vous avez un problème spécifique (voir [Comment demander] (https://stackoverflow.com/help/how-to-ask)). –

+0

Salut! Désolé pour ça. Je vais déplacer ce post là-bas alors. Merci! – user2658763

+1

Il semble que vous ne demandiez pas une révision de code, mais plutôt de l'aide pour corriger votre code qui ne fait pas ce que vous voulez. Vous devriez [modifier] votre titre pour mieux refléter cela, et aider à empêcher votre question de se fermer. –

Répondre

1

Bien que vous ayez étiqueté ceci avec api.ai et actions-on-google, et que votre code semble provenir de https://api.ai/docs/getting-started/basic-fulfillment-conversation#setup_weather_api, cela ne pose pas vraiment de problème avec l'API Actions elle-même. Il semble que cela a à voir avec la façon dont vous gérez les résultats de l'API WorldWeatherOnline (WWO) et ce que vous attendez de l'apport de l'Assistant Google.

Vous avez quelques problèmes, tous concentrés autour de cette ligne:

let country = location['query'].split(",")[1]; 

Cette ligne obtient la valeur que vous avez fourni dans la requête. Dans ce document, vous êtes en supposant un certain nombre de choses, telles que:

  1. L'utilisateur spécifie le pays (WWO peut prendre seulement une ville, si elle est assez distinguait).

  2. Le pays est spécifié en tant que deuxième champ (lorsque vous parlez de villes américaines, en spécifiant que l'état est commun, ce qui ferait du pays le troisième champ).

  3. L'Assistant Google les précise en capitalisant le prénom du pays (probable, mais non garanti). Si le pays est les États-Unis, il est spécifié avec la chaîne exacte «États-Unis d'Amérique» au lieu de quelque chose de plus court (mais toujours reconnaissable) comme «États-Unis» ou «États-Unis».

De plus il y a la question logique que la personne qui demande l'information peut vouloir dans les unités qui sont familiers les, plutôt que les unités qui sont traditionnelles pour ce pays. Un Américain s'interrogeant sur le temps qu'il fait en Espagne veut probablement encore Fahrenheit. Quoi qu'il en soit - un bon moyen de déboguer ce serait d'imprimer réellement la valeur de location['query'] pour voir quelle est la valeur pour une variété d'entrées et ajuster en conséquence.

Je ne suis pas sûr qu'il existe un moyen direct et efficace de gérer ce que vous essayez de faire. Quelques réflexions:

  • Vous pouvez essayer à la recherche pour les pays comme une sous-chaîne insensible à la casse partout dans la chaîne de requête, mais pourriez-vous obtenir des faux positifs. Pourtant ... c'est probablement votre solution la plus simple. La suggestion de @Shuyang est bonne, mais les paramètres régionaux de langue ne sont pas toujours la meilleure façon de procéder, et vous devrez utiliser les extensions Google Actions pour les données fournies via API.AI.

  • Vous pouvez également demander l'emplacement actuel de l'utilisateur (à nouveau, si vous utilisez Google Actions), puis utiliser un géolocalisateur pour déterminer où il se trouve. Mais c'est vraiment désordonné.

  • Vous pouvez le traiter comme faisant partie de la conversation - étendre les phrases Intent pour les laisser spécifier "en Fahrenheit" ou avec d'autres phrases possibles et faire la conversion. Ou stocker des informations dans un contexte et si elles posent une phrase de suivi comme "Qu'est-ce que c'est en Fahrenheit" fournir les informations mises à jour, converties.

    (Si vous êtes vraiment astucieux, vous stockez l'ID utilisateur de cette personne dans une base de données, et la prochaine fois qu'il vous rendra visite, vous devrez simplement le fournir dans les unités de son choix.)

Je pense que le premier est plus facile, le dernier étant le plus naturel conversationnel, mais tout dépend de ce que la valeur de location['query'] peut effectivement être.

+0

Hey Prisoner, votre première solution suggérée est exactement ce que je voulais. location ['query'] renvoie la [ville, pays] à partir des données de réponse. Donc, dans mon code, je prenais le pays et j'utilisais cela comme base pour afficher Celsius ou Fahrenheit. mais vous avez raison, je devrais probablement le traiter comme faisant partie de la conversation. Il y a encore trop à apprendre. – user2658763

+0

C'est une toute nouvelle façon de penser les choses, et nous essayons toujours de comprendre ce qui fonctionne le mieux. Une règle fondamentale - pensez à ce que les gens disent réellement. Si la réponse a aidé - l'acceptation ou l'upvoting la réponse est toujours appréciée. – Prisoner

1

Au lieu d'essayer d'obtenir quel pays l'utilisateur est de, vous pouvez obtenir les paramètres régionaux de l'utilisateur à l'aide getUserLocale que l'utilisateur peut changer à leur propre volonté et indépendamment de leur localisation qui peut mieux refléter quelle échelle de température, ils préférer.

Avec cette méthode, vous recevrez une chaîne comme 'en-US' ou 'en-GB' qui sont associées à un pays et ainsi vous pouvez mapper à une certaine échelle de température. Un exemple d'utilisation de la localisation peut être trouvé here.

Dans le Simulateur de console Actions on Google, vous pouvez modifier les paramètres régionaux avec la liste déroulante Langue afin de pouvoir tester votre application en utilisant différents paramètres régionaux.