Facebook聊天机器人多次发送同一条消息(Python)

2024-06-02 08:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个facebook微型聊天机器人,我遇到了一个问题,就是机器人反复接收相同的消息,即使它已经回复了消息。在

it keeps receiving the same text from FB and replying to it over and 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"}
    )

我得到我需要发送一个状态200,我做了,但仍然收到相同的短信一遍又一遍

以下是我订阅的活动

conversations, message_deliveries, message_reads, messages, messaging_optins, messaging_postbacks, picture

我删除了消息回音,因为我认为问题最终不是这样的


Tags: andto消息messagedatagetifdef
1条回答
网友
1楼 · 发布于 2024-06-02 08:27:39

通过编写一个函数并检查webapi服务中的重复消息,我已经解决了这个问题。在

在这里,我通过有效载荷或从Facebook接收到的消息生成消息唯一id,用户单击或键入这些消息,然后与先前从并发字典中存储的唯一值进行比较。在

_messageUniqueKeysBySender是concurrentdiction,我按发送者Id缓存值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;
    }

然后签入主代码

^{pr2}$

相关问题 更多 >