Aynı mesajı birkaç kez gönderme Facebook sohbet bot (Python)

oy
1

Ben facebook mini sohbet bot üzerinde çalışıyorum ve ben tekrar zaten mesajı cevap olsa bile tekrar aynı mesaj almak için bot üzerinde oluşan bir sorunla karşılaşıyorum.

o FB den aynı metni alma ve tekrar kendisine yanıtlarken tutar

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

Ben yaptığım bir statü 200 her zaman göndermek gerekir ama yine de tekrar tekrar aynı metni aldıktan olsun

İşte abone am olaylardır

konuşmalar, message_deliveries, message_reads, mesajlar, messaging_optins, messaging_postbacks, resim

Ben kaldırıldı messaging_echoes Öyle olmadığını çıktı sorun olduğunu düşünmüş çünkü

Oluştur 15/07/2016 saat 18:30
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

Ben bir işlev yazma ve benim Web API hizmetinde yinelenen iletileri kontrol ederek bu sorunu çözdük.

İşte ben de bir yükün veya kullanıcı tıkladığında veya türleri ve ardından eşzamanlı sözlükten daha önce depolanmış benzersiz değeri ile karşılaştırarak Facebook alınan mesajla mesaj benzersiz kimliği oluştururken.

_messageUniqueKeysBySender ConcurrentDictionary ve ben 30 dakika boyunca Gönderen Kimlikle değerlerini önbelleğe ediyorum.

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

Ve sonra ana kod denetimi

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;
        }
Cevap 27/03/2017 saat 02:02
kaynak kullanıcı

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