1

Ich bin dabei, einen Facebook-Messenger-Bot mit AWS Lambda und dem Serverless-Framework zu erstellen. Für den Moment möchte ich nur wiederholen, was auch immer gesendet wird, direkt an den Benutzer zurück. Hier ist der Code:AWS Lambda-Funktion, die mehrere Male ausführt (Serverless)

'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); 
       } 
      }); 
     }); 
    } 

} 

So der Bot erfolgreich ist echo die Nachrichten zurück, aber in meinen Logs kann ich sehen, es mehrere Male immer ausgeführt. Manchmal hat die Nachricht aus irgendeinem Grund keine "Nachrichten" -Schlüssel im JSON, so dass die mehreren Ausführungen unterschiedliche Ergebnisse haben. Ich glaube, es hat etwas damit zu tun, dass ich die Nachricht an den Benutzer zurücksende, denn wenn ich die axios.post auszeichne, hört das Problem auf. Irgendeine Idee, warum das passiert?

+0

Im Allgemeinen, wenn die Lambda-Funktion eine Ausnahme auslöst, wird Lambda die Funktion mit einem bestimmten Intervall wiederholen. Sind Sie sicher, dass die Funktion nicht fehlschlägt, wenn ein erneuter Versuch stattfindet? – kosa

+0

Nun, ich sehe keine Fehler in den Protokollen ... – Brandon

+0

Wenn Sie Facebook Messenger-Webhooks abonnieren, gibt es mehrere Veranstaltungen, die Sie abonnieren können. Falls Sie das Ereignis "Message Delivered" abonniert haben, kann Ihr Lambda ausgelöst werden, sobald Ihre Lieferung erfolgreich war. Sie können mehr Informationen dazu erhalten von https://developers.facebook.com/docs/messenger-platform/webhook-reference#setup – Asanka

Antwort

2

@Asanka fand es in den Kommentaren. Im Grunde schickte Facebook mehrere Ereignisse über das, was ich in meinem Code nicht berücksichtigt hatte. Sachen wie "Nachricht geliefert" und "Nachricht gelesen" waren auch Ereignisse, von denen ich nichts wusste. Ich musste sie einfach in der Entwicklerkonsole abbestellen.