【问题标题】:Facebook chat bot sending same message multiple times (Python)Facebook 聊天机器人多次发送相同的消息(Python)
【发布时间】:2016-07-15 18:30:08
【问题描述】:

我正在开发一个 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,我这样做了,但仍然一遍又一遍地收到相同的文本

这是我订阅的活动

对话、message_deliveries、message_reads、messages、messaging_optins、messaging_postbacks、图片

我删除了 messaging_echoes,因为我认为原来不是问题

【问题讨论】:

  • 我怀疑这是你的问题,但对我来说,每当我遇到错误时,facebook 会以越来越多的时间间隔多次发送消息。想我会提到它。
  • @user2322082 事情在日志中我可以看到我多次收到相同的文本,所以机器人一次又一次地处理它
  • 如果您在问题中包含发送单条消息时显示的打印语句,它可能会帮助人们解决您的问题
  • @user2322082 想一想,可能是 20s 回复帧的问题,我减小了字典的大小以加快 word_gen() 的速度,问题似乎走了
  • @user2322082 我已经 20 多岁了,因为生成器平均需要 40 秒来处理,现在我平均需要 12 秒,问题已经消失了

标签: python facebook facebook-messenger facebook-chat facebook-chatbot


【解决方案1】:

我已通过编写函数并检查我的 Web API 服务中的重复消息来解决此问题。

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

_messageUniqueKeysBySender 是 ConcurrentDictionary,我按 Sender 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;
    }

然后通过签入主代码

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

【讨论】:

  • 你能不能看看我的代码我也有同样的问题。但我不想通过创建数据库的方式来解决它。你有没有找到其他方法来解决它??我一直认为这是因为 python 没有向 FB webhook 发送状态 200。 stackoverflow.com/questions/44848406/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 2016-12-04
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多