Search code examples
dialogflow-esactions-on-googledialogflow-es-fulfillment

Webhook stopped working. Has there been a deprication or requirements change?


I'm revisiting a Dialogflow Essentials app set up a few years ago that suddenly stopped working at the webhook calls. The URLs that respond to the webhooks are still functioning perfectly. Has there been a change in webhook requirements or a Google deprication that might account for this?

The "help" and "goodbye" functions internal to the app are still working, but when a webhook call is executed we get a reply that the app "isn't responding right now. Please try again soon." and the app leaves the conversation.

The relevant code is NodeJS version 8 (which should still be functional, though depricated) and is applied using the Inline Editor within Dialogflow. Here are the functions:

function get_keywords(agent) {
   const keywords = agent.parameters.keywords;
   const site_id = agent.parameters.site_id;
   return axios.get(`https://www.FutureOfNews.com/AdEverywhere/SI/PR/AN/GA_API/StorySummary_API.cfm?SiteID=${site_id}&Keywords=${keywords}`)
      .then((result) => {
         console.log(result.data);

         if (response.statusCode != 200) {
            agent.add(`Error. Could not connect to news server.`);
         } else {

            if (result.data.storyFound.length < 1) {
               agent.add(result.data.speech);
            } else {

               if (result.data.storyPhotoURL.length > 1) {
                  agent.add(result.data.speech);
                  agent.add(new Card({
                     title: result.data.storyHeadline,
                     imageUrl: result.data.storyPhotoURL,
                     buttonText: 'Full Story',
                     buttonUrl: result.data.storyURL,
                     imageDisplayOptions: "WHITE"
                  }));

               } else {
                  agent.add(result.data.speech);
                  agent.add(new Card({
                     title: result.data.storyHeadline,
                     buttonText: 'Full Story',
                     buttonUrl: result.data.storyURL,
                     imageDisplayOptions: "WHITE"
                  }));
               }
            }
         }
      });
}

function get_rss_feed_id(agent) {
   const rss_feed_id = agent.parameters.rss_feed_id;
   const site_id = agent.parameters.site_id;
   return axios.get(`https://www.FutureOfNews.com/AdEverywhere/SI/PR/AN/GA_API/NewsHeadlines_API.cfm?SiteID=${site_id}&RSSFeedID=${rss_feed_id}`)
      .then((result) => {
         agent.add(result.data.speech);
      });
}

Here are versions of the URLs called by the webhooks (with real/live parameter values):

Headlines Group

Specific news item

I'm not seeing any activity in logs relating to these calls, and I see no billing/credit-card issues.

Any thoughts on why this is suddenly failing would be greatly appreciated!


Solution

  • I cannot create a NodeJS 8 environment since it is already deprecated. Instead, I tested your code in NodeJS 10 and it works fine for me.

    For testing, I used an intent that is triggered with "Test" and I hard coded values for keywords,site_id,rss_feed_id. And it returned the expected result from the code.

    Code used for testing:

    'use strict';
    
    const functions = require('firebase-functions');
    const {WebhookClient} = require('dialogflow-fulfillment');
    const {Card} = require('dialogflow-fulfillment');
    const axios = require('axios');
    
    process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
    
    exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
      const agent = new WebhookClient({ request, response });
      
    function yourFunctionHandler(agent) {
       const keywords = 'investigation';
       const site_id = 15;
       return axios.get(`https://www.FutureOfNews.com/AdEverywhere/SI/PR/AN/GA_API/StorySummary_API.cfm?SiteID=${site_id}&Keywords=${keywords}`)
          .then((result) => {
             console.log(result.data);
             if (response.statusCode != 200) {
                agent.add(`Error. Could not connect to news server.`);
             } else {
                if (result.data.storyFound.length < 1) {
                   agent.add(result.data.speech);
                } else {
                  if (result.data.storyPhotoURL.length > 1) {
                      agent.add(result.data.speech);
                      agent.add(new Card({
                         title: result.data.storyHeadline,
                         imageUrl: result.data.storyPhotoURL,
                         buttonText: 'Full Story',
                         buttonUrl: result.data.storyURL,
                         imageDisplayOptions: "WHITE"
                      }));
    
                   } else {
                      agent.add(result.data.speech);
                      agent.add(new Card({
                         title: result.data.storyHeadline,
                         buttonText: 'Full Story',
                         buttonUrl: result.data.storyURL,
                         imageDisplayOptions: "WHITE"
                      }));
                   }
                }           
             }
         
       });
       }
    function get_rss_feed_id(agent) {
       const rss_feed_id = 1;
       const site_id = 15;
       return axios.get(`https://www.FutureOfNews.com/AdEverywhere/SI/PR/AN/GA_API/NewsHeadlines_API.cfm?SiteID=${site_id}&RSSFeedID=${rss_feed_id}`)
          .then((result) => {
             agent.add(result.data.speech);
          });
    }
      
      // Run the proper function handler based on the matched Dialogflow intent name
      let intentMap = new Map();
      intentMap.set('test intent', yourFunctionHandler);
      //intentMap.set('test intent', get_rss_feed_id);
      agent.handleRequest(intentMap);
    });
    
    

    Package.json:

    {
      "name": "dialogflowFirebaseFulfillment",
      "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
      "version": "0.0.1",
      "private": true,
      "license": "Apache Version 2.0",
      "author": "Google Inc.",
      "engines": {
        "node": "10"
      },
      "scripts": {
        "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
        "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
      },
      "dependencies": {
        "firebase-functions": "^2.0.2",
        "firebase-admin": "^5.13.1",
        "googleapis": "^27.0.0",
        "actions-on-google": "2.2.0",
        "dialogflow-fulfillment": "0.6.1",
        "axios": "0.21.1"
      }
    }
    

    Test using get_keywords():

    enter image description here

    Test using get_rss_feed_id():

    enter image description here

    What I could suggest is to upgrade to NodeJS 10 to ensure that the function is on a supported version of Node.js. See migration guide.