Facebook-Chat-Bot gleiche Nachricht mehrfach zu senden (Python)

stimmen
1

Ich arbeite an einem Facebook Mini-Chat-Bot und mir ein Problem habe zu begegnen, die auf dem Bot besteht die gleiche Nachricht immer und immer noch zu erhalten, obwohl er die Nachricht bereits beantwortet hat.

es hält den gleichen Text von FB zu empfangen und um es über und über die Beantwortung

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

Ich bekomme, dass ich einen Status 200 jedes Mal senden muß, was ich auch tat, aber immer noch den gleichen Text über und über Empfang

Hier sind die Ereignisse, die ich abonniert habe zu

Gespräche, message_deliveries, message_reads, Nachrichten, messaging_optins, messaging_postbacks, Bild

Ich entfernte messaging_echoes , weil ich dachte , es war das Problem nicht stellte sich heraus ,

Veröffentlicht am 15/07/2016 um 18:30
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Ich habe dieses Problem gelöst, indem eine Funktion zu schreiben und Überprüfung doppelte Nachrichten in meinem Web-API-Service.

Hier bin ich zu erzeugen Nachricht eindeutige ID entweder durch Nutzlast oder eine Nachricht von Facebook erhalten, die Benutzer klickt oder Typen und dann mit früher gespeicherten eindeutigen Wert von Concurrent-Wörterbuch zu vergleichen.

_messageUniqueKeysBySender ist ConcurrentDictionary und ich bin die Caching Wert von Sender ID für 30 Minuten.

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

Und dann durch in Hauptcode überprüft

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;
        }
Beantwortet am 27/03/2017 um 02:02
quelle vom benutzer

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