Facebook chat-bot het verzenden van hetzelfde bericht meerdere keren (Python)

stemmen
1

Ik ben bezig met een Facebook mini-chat-bot en ik ben geconfronteerd met een probleem dat bestaat op het bot om dezelfde boodschap over en ook al is het bericht al heeft beantwoord ontvangen.

het blijft ontvangen van de dezelfde tekst van het FB en beantwoorden het over en 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}
    )

Ik krijg dat ik nodig om de status 200 elke keer, wat ik deed sturen, maar nog steeds het ontvangen van de zelfde tekst over en voorbij

Hier zijn de gebeurtenissen die ik ben geabonneerd op

gesprekken, message_deliveries, message_reads, berichten, messaging_optins, messaging_postbacks, foto

Ik verwijderde messaging_echoes omdat ik dacht dat het probleem was bleek niet

De vraag is gesteld op 15/07/2016 om 18:30
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Ik heb dit probleem opgelost door het schrijven van een functie en het controleren van dubbele berichten in mijn Web API service.

Hier ben ik het genereren van bericht unieke id hetzij door payload of bericht ontvangen van Facebook die gebruiker klikt of typen en vervolgens te vergelijken met eerdere opgeslagen unieke waarde van gelijktijdige woordenboek.

_messageUniqueKeysBySender is ConcurrentDictionary en ik caching waarden door Sender Id gedurende 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;
    }

En dan door te kijken in de belangrijkste code

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;
        }
antwoordde op 27/03/2017 om 02:02
bron van user

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