Facebook συνομιλία bot αποστολή ίδιο μήνυμα πολλές φορές (Python)

ψήφοι
1

Είμαι εργάζονται για ένα facebook μίνι συνομιλία bot και είμαι αντιμετωπίζουν ένα πρόβλημα το οποίο συνίσταται στο bot για να λάβετε το ίδιο μήνυμα ξανά και ξανά, ακόμη και αν έχει ήδη απαντηθεί το μήνυμα.

κρατά λαμβάνει το ίδιο κείμενο από το FB και απάντηση σε αυτό ξανά και ξανά

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

Παίρνω ότι πρέπει να στείλουμε ένα καθεστώς 200 κάθε φορά που το έκανα, αλλά εξακολουθούν να λαμβάνουν το ίδιο κείμενο ξανά και ξανά

Εδώ είναι τα γεγονότα που είμαι συνδρομητής

συζητήσεις, message_deliveries, message_reads, μηνύματα, messaging_optins, messaging_postbacks, εικόνα

Αφαίρεσα messaging_echoes γιατί νόμιζα ότι ήταν το πρόβλημα αποδείχθηκε ότι δεν

Δημοσιεύθηκε 15/07/2016 στις 18:30
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Έχω λυθεί αυτό το πρόβλημα με το γράψιμο μια λειτουργία και τον έλεγχο διπλά μηνύματα στην υπηρεσία Web API μου.

Εδώ είμαι δημιουργώντας μήνυμα μοναδικό αναγνωριστικό είτε με ωφέλιμο φορτίο ή το μήνυμα που έλαβε από το Facebook το οποίο ο χρήστης κάνει κλικ ή τύπων και, στη συνέχεια, σε σύγκριση με προηγούμενες αποθηκευμένες μοναδική τιμή από ταυτόχρονη λεξικό.

_messageUniqueKeysBySender είναι ConcurrentDictionary και είμαι προσωρινή αποθήκευση τιμές από αναγνωριστικό του αποστολέα για 30 λεπτά.

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

Και μετά από έλεγχο στο κύριο κωδικό

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;
        }
Απαντήθηκε 27/03/2017 στις 02:02
πηγή χρήστη

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