1

Je travaille sur un bot facebook mini-chat et je rencontre un problème qui consiste pour le bot à recevoir le même message encore et encore même s'il a déjà répondu message.Robot de messagerie Facebook envoyant le même message plusieurs fois (Python)

it keeps receiving the same text from FB and replying to it over and over

def message_handler(request): 
    data = json.loads(request.body.decode('utf-8')) 

    if data and data['object'] == 'page': 
     for pageEntry in data['entry']: 
      print "nombre de message", len(pageEntry['messaging']) 
      for messagingEvent in pageEntry['messaging']: 

       if messagingEvent.get('optin'): 
        print "optin", messagingEvent 
        receivedAuthentication(messagingEvent) 
       elif messagingEvent.get('message'): 
        print "message", messagingEvent 
        receivedMessage(messagingEvent) 
       elif messagingEvent.get('delivery'): 
        print "delivery", messagingEvent 
        receivedDeliveryConfirmation(messagingEvent) 
       elif messagingEvent.get('postback'): 
        print "postback", messagingEvent 
        receivedPostback(messagingEvent) 
       else: 
        print "UnHandled" 
    return HttpResponse(status=200) 

def receivedMessage(event): 
    senderID = event.get('sender').get('id') 
    message = event.get('message') 

    messageText = message.get('text') 
    messageAttachments = message.get('attachments') 

    if messageText: 
     if messageText == 'image': 
      sendImageMessage(senderID) 

     elif messageText == 'button': 
      sendButtonMessage(senderID) 

     elif messageText == 'generic': 
      sendGenericMessage(senderID) 

     elif messageText == 'receipt': 
      sendReceiptMessage(senderID) 
     elif messageText == 'hey': 
      sendTextMessage(senderID, "Get it. Gimme a moment to process it :). Will get back to you in a moment") 
      send_seen() 
      send_typing() 
      words = words_gen() 
      sendTextMessage(senderID, words) 


def callSendAPI(messageData): 
    requests.post(
      url='https://graph.facebook.com/v2.6/me/messages?access_token=' + config.page_token, 
      data=json.dumps(messageData), 
     headers={"Content-Type":"application/json"} 
    ) 

Je reçois que je dois envoyer un état 200 à chaque fois que je l'ai fait, mais en recevant le même texte et plus

Voici les événements que je suis abonné à

conversations, message_deliveries, message_reads, messages, messaging_optins, messaging_postbacks, image

J'ai enlevé messaging_echoes parce que je pensais que c'était le problème avéré ne

+0

Je doute que c'est votre problème, mais pour moi chaque fois que j'ai une erreur, facebook envoie le message plusieurs fois avec des intervalles de temps. Je suppose que je le mentionnerais. – user2322082

+0

@ user2322082 la chose est dans les journaux que je peux voir que je reçois le même texte plusieurs fois afin que le bot le traite encore et encore – kaizer

+0

Si vous incluez les instructions d'impression qui s'affichent lorsque vous envoyez un seul message dans votre question, il peut aider les gens à résoudre votre problème – user2322082

Répondre

2

J'ai résolu ce problème en écrivant une fonction et la vérification des messages en double dans mon service API Web.

Ici, je génère un identifiant unique de message, soit par charge utile, soit par message reçu de Facebook, que l'utilisateur clique ou tape, puis compare avec la valeur unique stockée précédemment du dictionnaire concurrent.

_messageUniqueKeysBySender est ConcurrentDictionary et je mets en cache les valeurs par Id de l'expéditeur pendant 30 minutes.

private bool IsDuplicate(Messaging messaging) 
    { 
     var messageUniqueId = string.Empty; 
     var messageMessaging = messaging as MessageMessaging; 
     if (messageMessaging != null) 
      messageUniqueId = messageMessaging.Message.Id + messageMessaging.Message.SequenceNumber; 
     else if (messaging is PostbackMessaging) 
      messageUniqueId = ((PostbackMessaging)messaging).Postback.Payload + 
           ((PostbackMessaging)messaging).TimestampUnix; 
     if (string.IsNullOrEmpty(messageUniqueId)) return false; 
     string existingUniqueId; 
     if (_messageUniqueKeysBySender.TryGetValue(messaging.Sender.Id, out existingUniqueId)) 
     { 
      if (existingUniqueId == messageUniqueId) 
      { 
       return true; 
      } 
      else 
      { 
       _messageUniqueKeysBySender.TryUpdate(messaging.Sender.Id, messageUniqueId, existingUniqueId); 
       return false; 
      } 
     } 
     _messageUniqueKeysBySender.TryAdd(messaging.Sender.Id, messageUniqueId); 
     return false; 
    } 

Et puis en vérifiant dans le code principal

try 
     { 
      if (!IsDuplicate(messaging)) 
      { 
       var conversation = _conversationRepository[messaging.Sender.Id] ?? new Conversation(messaging.Sender.Id); 
       message = await _bot.RespondToMessagingAsync(conversation, messaging); 
       _conversationRepository[messaging.Sender.Id] = conversation; 
       _logger.ForContext("FacebookMessage", messagingJson).LogDuration("Processing Facebook message", sw); 
      } 
      else 
       _logger.ForContext("FacebookMessage", messagingJson).Warning("Duplicate message skipped"); 
     } 
     catch (Exception ex) 
     { 
      _logger.ForContext("FacebookMessage", messagingJson).Error(ex, "Failed to process message"); 
      message = new TextMessage(Resources.Error); 
      hasError = true; 
     } 
+0

Pourriez-vous également regarder mon code J'ai le même problème. Mais je ne veux pas le résoudre de cette façon pour créer une base de données. Avez-vous trouvé un autre moyen de le résoudre? J'ai toujours pensé que c'était parce que le python n'envoyait pas de statut 200 à FB webhook. https://stackoverflow.com/questions/44848406/facebook-webhook-maiking-multiple-calls-for-the-same-message –