A Pen by vijaysiva5555 on CodePen.
Created
February 20, 2019 08:48
-
-
Save vijaysiva5555/cb53f8b2de7f355bbe4c8932b3816061 to your computer and use it in GitHub Desktop.
Make AJAX Calls to Third Party APIs from DialogFlow V2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<h1>Hello World!</h1> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const express = require('express'); | |
const bodyParser = require('body-parser'); | |
const rp = require('request-promise-native'); | |
const { WebhookClient } = require('dialogflow-fulfillment'); | |
const { Card, Suggestion } = require('dialogflow-fulfillment'); | |
const { Carousel } = require('actions-on-google'); | |
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements | |
const imageUrl = 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png'; | |
const imageUrl2 = 'https://lh3.googleusercontent.com/Nu3a6F80WfixUqf_ec_vgXy_c0-0r4VLJRXjVFF_X_CIilEu8B9fT35qyTEj_PEsKw'; | |
const linkUrl = 'https://assistant.google.com/'; | |
const API_KEY = 'YOUR-API-KEY-HERE'; | |
const server = express(); | |
server.use( | |
bodyParser.urlencoded({ | |
extended: true | |
}) | |
); | |
server.use(bodyParser.json()); | |
server.post('/dialog-flow-fulfillment', (request, response) => { | |
const agent = new WebhookClient({ request, response }); | |
function googleAssistantOther(agent) { | |
let conv = agent.conv(); | |
conv.ask(`Sure! Details about ${agent.parameters.movie} coming your way!`); | |
return getMovieDataFromOMDb(agent.parameters.movie).then(movie => { | |
conv.ask(`Okay! So there you go.`); | |
conv.ask(new Card({ | |
title: `${movie.Title}(${movie.Year})`, | |
imageUrl: movie.Poster, | |
text: `${movie.Rated} | ${movie.Runtime} | ${movie.Genre} | ${movie.Released} (${movie.Country})`, | |
buttonText: 'Website', | |
buttonUrl: movie.Website || `https://www.imdb.com/title/${movie.imdbID}` | |
})); | |
conv.ask(new Suggestion(`More details`)); | |
conv.ask(new Suggestion(`Another movie`)); | |
agent.add(conv); | |
return Promise.resolve(agent); | |
}); | |
} | |
function welcome(agent) { | |
agent.add(`Welcome to my agent!`); | |
} | |
function fallback(agent) { | |
agent.add(`I didn't understand`); | |
agent.add(`I'm sorry, can you try again?`); | |
} | |
function getMovieDetailsOther(agent) { | |
return getMovieDataFromOMDb(agent.parameters.movie).then(movie => { | |
// const responseDataToSend = `${movie.Title} is a ${ | |
// movie.Actors | |
// } starer ${movie.Genre} movie, released in ${ | |
// movie.Year | |
// }. It was directed by ${movie.Director}`; | |
// console.log(`Generated response as ${responseDataToSend}`); | |
// agent.add(responseDataToSend); | |
agent.add(`Okay! So there you go.`); | |
agent.add(new Card({ | |
title: `${movie.Title}(${movie.Year})`, | |
imageUrl: movie.Poster, | |
text: `${movie.Rated} | ${movie.Runtime} | ${movie.Genre} | ${movie.Released} (${movie.Country})`, | |
buttonText: 'Website', | |
buttonUrl: movie.Website || `https://www.imdb.com/title/${movie.imdbID}` | |
})); | |
agent.add(new Suggestion(`More details`)); | |
agent.add(new Suggestion(`Another movie`)); | |
return Promise.resolve(agent); | |
}, error => { | |
console.log(`Got an error as ${error}`); | |
agent.add(`Sorry bout that! An error prevented getting data for: ${agent.parameters.movie || 'the requested movie'}` | |
); | |
}) | |
.catch(function (err) { | |
console.log(`Caught an err as ${err}`); | |
agent.add(err); | |
}); | |
// agent.add(`This message is from Dialogflow's Cloud Functions for Firebase editor!`); | |
// const newCard = new Card({ | |
// title: `Title: this is a card title`, | |
// imageUrl: imageUrl, | |
// text: `This is the body text of a card. You can even use line\n breaks and emoji! 💁`, | |
// buttonText: 'This is a button', | |
// buttonUrl: linkUrl | |
// }); | |
// // newCard.setPlatform('facebook'); | |
// agent.add(newCard); | |
// agent.add(new Suggestion(`Quick Reply`)); | |
// agent.add(new Suggestion(`Suggestion`)); | |
// agent.setContext({ name: 'weather', lifespan: 2, parameters: { city: 'Rome' }}); | |
} | |
function moreDetailsOther(agent) { | |
return getMovieDataFromOMDb(agent.parameters.movie).then(movie => { | |
agent.add(`Okay! I've got you covered on this too.`); | |
agent.add(`So the ${movie.Actors} starer ${movie.Type} is produced by ${movie.Production}, is directed by ${movie.Director}`); | |
agent.add(`It ${movie.Awards}. It's available in ${movie.Language}`); | |
agent.add(`Written by ${movie.Writer}, it plots ${movie.Plot}`); | |
agent.add(new Suggestion(`Stats on the movie`)); | |
agent.add(new Suggestion(`Another movie`)); | |
return Promise.resolve(agent); | |
}, error => { | |
console.log(`Got an error as ${error}`); | |
agent.add(`Sorry bout that! An error prevented getting data for: ${agent.parameters.movie || 'the requested movie'}` | |
); | |
}) | |
.catch(function (err) { | |
console.log(`Caught an err as ${err}`); | |
agent.add(err); | |
}); | |
} | |
function movieStatsOther(agent) { | |
return getMovieDataFromOMDb(agent.parameters.movie).then(movie => { | |
let ratingDetails = `${movie.Title} scored `; | |
movie.Ratings.forEach(rating => { | |
ratingDetails += `${rating.Value} on ${rating.Source} ` | |
}); | |
agent.add(`Sure! Here are the stats.`); | |
agent.add(ratingDetails); | |
agent.add(new Suggestion(`Another movie`)); | |
return Promise.resolve(agent); | |
}, error => { | |
console.log(`Got an error as ${error}`); | |
agent.add(`Sorry bout that! An error prevented getting data for: ${agent.parameters.movie || 'the requested movie'}` | |
); | |
}) | |
.catch(function (err) { | |
console.log(`Caught an err as ${err}`); | |
agent.add(err); | |
}); | |
} | |
function getMovieDataFromOMDb(movieName) { | |
const movieToSearch = movieName || 'The Godfather'; | |
const options = { | |
uri: 'https://www.omdbapi.com/', | |
json: true, | |
qs: { | |
t: movieToSearch, | |
apikey: API_KEY | |
} | |
}; | |
return rp(options); | |
} | |
// Run the proper handler based on the matched Dialogflow intent | |
let intentMap = new Map(); | |
intentMap.set('Default Welcome Intent', welcome); | |
intentMap.set('Default Fallback Intent', fallback); | |
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) { | |
intentMap.set(null, googleAssistantOther); | |
// intentMap.set('More Details', googleAssistantMoreDetails); | |
// intentMap.set('Movie Stats', googleAssistantMovieStats); | |
} else { | |
intentMap.set('Get Movie Details', getMovieDetailsOther); | |
intentMap.set('More Details', moreDetailsOther); | |
intentMap.set('Movie Stats', movieStatsOther); | |
} | |
agent.handleRequest(intentMap); | |
}); | |
server.listen(process.env.PORT || 8000, () => { | |
console.log('Server is up and running...'); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment