1

私はfacebookミニチャットのボットに取り組んでいますが、ボットには既に同じメッセージを繰り返し返信するという問題が発生しています。メッセージ。Facebook chat bot同じメッセージを複数回送信する(Python)

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、メッセージ、messaging_optins、messaging_postbacks、絵

私はそれが問題だと思ったので、私はmessaging_echoesを削除し、私は関数を記述し、私のWeb APIサービスで重複メッセージをチェックすることにより、この問題を解決していない

+0

をチェックして、私はこれがあなたの問題である疑いが、私のために、私はエラーがあるとき、Facebookは時間の間隔を増やすことで、メッセージを数回送信します。私はそれを言いたいと思った。 – user2322082

+0

@ user2322082これはログにあります。同じテキストを何度も受信しているので、ボットは何度も何度もそれを処理しています。 – kaizer

+0

あなたの質問に単一のメッセージを送信したときに表示されるprintステートメントを含めると、それは人々があなたの問題を解決するのを助けるかもしれない – user2322082

答えて

2

になりました。

ここでは、Facebookから受信したペイロードまたはメッセージのいずれかでユーザーがクリックしたり入力したりして、コンカレント辞書の以前に保存された固有値と比較するメッセージ固有IDを生成しています。

_messageUniqueKeysBySenderはConcurrentDictionaryであり、送信者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; 
     } 
+0

私のコードを見ることができますか、同じ問題があります。しかし、私はそれをデータベースの作成のように解決したくありません。あなたはそれを解決するための他の方法を見つけましたか?私はいつも、PythonがFB webhookにステータス200を送信していないためだと思っていました。 https://stackoverflow.com/questions/44848406/facebook-webhook-maiking-multiple-calls-for-the-same-message –

関連する問題