我正在开发一个 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
我删除了messaging_echoes,因为我认为这是问题所在
最佳答案
我通过编写函数并检查 Web API 服务中的重复消息解决了此问题。
在这里,我通过用户点击或输入的有效负载或从 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;
}
关于python - Facebook 聊天机器人多次发送相同的消息(Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402931/