Facebook chat bot envoyer même message plusieurs fois (Python)

voix
1

Je travaille sur un robot mini-chat facebook et je rencontre un problème qui se compose au bot de recevoir le même message et plus, même si elle a déjà répondu à un message.

il continue à recevoir le même texte de FB et de répondre à plus et plus

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é pas

Créé 15/07/2016 à 18:30
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
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 suis générer un message identifiant unique soit par la charge utile ou un message reçu de Facebook qui utilisateur clique ou types, pour ensuite comparer avec une valeur unique précédemment stockée dans le dictionnaire simultané.

_messageUniqueKeysBySender est ConcurrentDictionary et je les valeurs en cache par Sender ID 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;
        }
Créé 27/03/2017 à 02:02
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more