1

Je suis en train de créer un bot facebook messenger à l'aide d'AWS Lambda et du framework Serverless. Pour l'instant je veux juste qu'il répète tout ce qui est renvoyé directement à l'utilisateur. Voici le code:Fonction AWS Lambda s'exécutant plusieurs fois (sans serveur)

'use strict'; 
var https = require('https'); 
const axios = require('axios'); 


var VERIFY_TOKEN = "VERIFY"; 
var PAGE_ACCESS_TOKEN = "TOKEN"; 

module.exports.hello = (event, context, callback) => { 
    const response = { 
     statusCode: 200, 
     body: JSON.stringify({ 
      message: 'Go Serverless v1.0! Your function executed successfully!', 
      input: event, 
     }), 
    }; 

    callback(null, response); 

    // Use this code if you don't use the http event with the LAMBDA-PROXY integration 
    // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event }); 
}; 

// Receive user messages 
module.exports.botReply = (event, context, callback) => { 

    var data = JSON.parse(event.body); 
    console.log("BOT REPLY") 

    // Make sure this is a page subscription 
    if (data.object === 'page') { 

     // Iterate over each entry - there may be multiple if batched 
     data.entry.forEach(function(entry) { 
      var pageID = entry.id; 
      var timeOfEvent = entry.time; 
      // Iterate over each messaging event 
      entry.messaging.forEach(function(msg) { 
       if (msg.message) { 
        console.log("received message"); 
        const payload = { 
        recipient: { 
         id: msg.sender.id 
        }, 
        message: { 
         text: "test" 
        } 
        }; 
        const url = "https://graph.facebook.com/v2.6/me/messages?access_token=" + PAGE_ACCESS_TOKEN; 
        axios.post(url, payload).then((response) => callback(null, response)); 

       } else { 
        console.log("Webhook received unknown event: ", event); 
        var response = { 
         'body': "ok", 
         'statusCode': 200 
        }; 

        callback(null, response); 
       } 
      }); 
     }); 
    } 

} 

Ainsi, le bot ne fait pas écho avec succès des messages, mais dans mes journaux, je peux le voir CHAISE plusieurs fois. Parfois, le message n'a pas de clé "message" dans le JSON pour une raison quelconque, de sorte que les exécutions multiples ont des résultats différents. Je crois que cela a quelque chose à voir avec moi renvoyant le message à l'utilisateur parce que quand je commente l'axios.post, le problème s'arrête. Une idée de pourquoi cela se passe?

+0

En général, si la fonction Lambda lève une exception, Lambda réessayera la fonction avec un certain intervalle, êtes-vous sûr de ne pas échouer lors de la ré-essai? – kosa

+0

Eh bien, je ne vois pas dans les erreurs dans les journaux ... – Brandon

+0

Lorsque vous vous abonnez aux webhooks facebook messenger il ya plusieurs événements auxquels vous pouvez vous abonner. Dans le cas où vous vous êtes abonné à un événement livré par message, votre lambda peut être déclenché une fois que votre message a été livré avec succès. Vous pouvez obtenir plus d'informations à ce sujet sur https://developers.facebook.com/docs/messenger-platform/webhook-reference#setup – Asanka

Répondre

2

@Asanka l'a compris dans les commentaires. Fondamentalement, facebook envoyait plusieurs événements sur ce que je n'avais pas pris en compte dans mon code. Des choses comme "message délivré" et "message lu" étaient aussi des événements que je ne connaissais pas. Je devais juste me désabonner dans la console des développeurs.