Facebook Messenger 不显示机器人的 lambda 返回的消息
Facebook Messenger doesn't display messages returned by bot's lambdas
我使用 Amazon Lex 创建了一个聊天机器人并将其与 Facebook Messenger 集成。 Lex 控制台(Response 部分)中定义的响应被 returned 发送给 Messenger(参见图 1 的右上图),但 lambda 函数生成的响应(写在 Python) 未收到(参见图 1 的右下图)——三点图标显示 30 秒后消失。
我使用 this video and AWS documentation 将机器人与 FB 集成。在 Webhooks 订阅中(在 FB 开发人员面板上)我选择了以下事件:messages、messaging_postbacks、messaging_optins、message_deliveries、message_reads、messaging_payments ,message_echoes,待机,messaging_handovers。该应用程序尚未通过 FB 批准,但申请状态为 Live。
图一:
(来源:imggmi.com)
图二:
(来源:imggmi.com)
import json
user_invoices = ['1/2019', '2/2019', '3/2019']
invoice_status = {'1/2019' : 'Paid', '2/2019' : 'Unpaid', '3/2019' : 'Unpaid'}
def elicit_slot(session_attributes, intent_name, slots, slot_to_elicit, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'ElicitSlot',
'intentName': intent_name,
'slots': slots,
'slotToElicit': slot_to_elicit,
'message': message
}
}
def close(session_attributes, fulfillment_state, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'Close',
'fulfillmentState': fulfillment_state,
'message': message
}
}
def handle(event, context):
intent_request = event
session_attributes = intent_request['sessionAttributes']
slots = intent_request['currentIntent']['slots']
if intent_request['currentIntent']['name'] == 'CheckInvoiceStatus':
session_attributes['lastIntent'] = intent_request['currentIntent']['name']
try:
inv_no = slots['invoiceNo']
if inv_no == None and intent_request['invocationSource'] == 'DialogCodeHook':
return elicit_slot(
session_attributes,
intent_request['currentIntent']['name'],
slots,
'invoiceNo',
{
'contentType': 'PlainText',
'content': 'Please enter invoice number.'
}
)
session_attributes['invoiceNo'] = inv_no
if not inv_no in user_invoices:
return delegate(session_attributes, intent_request['currentIntent']['slots'])
inv_status = invoice_status[inv_no]
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': 'Invoice no. {} is {}.'.format(inv_no, inv_status.lower())
}
)
except KeyError as e:
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': 'error: {}, input: {}.'.format(e, event)
}
)
elif intent_request['currentIntent']['name'] == 'AutoWelcomeMessage':
if 'userName' in session_attributes:
content = 'Hello ' + session_attributes['userName'] + '. How can I help you?'
else:
content = 'Hello. How can I help you?'
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': content
}
)
我希望 Lex 能够执行 lambda 函数和 return 给用户的值与在 Amazon Lex 控制台中测试机器人时发生的值相同。
已解决.
我的代码使用了 intent_request
中的 sessionAttributes
,问题是当没有会话属性时,相应的 JSON 元素被设置为空,即 "sessionAttributes" : {}
(如您在图 1 中所见),但如果是来自 Facebook 的消息,则此元素设置为 None
,即 "sessionAttributes" : None
(如您在图 2 中所见)。
这样我得到了如下错误:
[ERROR] TypeError: argument of type 'NoneType' is not iterable
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 104, in handle
if 'userName' in session_attributes:
或
[ERROR] TypeError: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 54, in handle
session_attributes['lastIntent'] = intent_request['currentIntent']['name']
我通过查看 lambda 函数日志发现了这一点(在 lambda 函数设计网页上单击 Monitoring
选项卡和 View logs in CloudWatch
)。
图片 1:
(来源:imggmi.com)
图 2:
(来源:imggmi.com)
我使用 Amazon Lex 创建了一个聊天机器人并将其与 Facebook Messenger 集成。 Lex 控制台(Response 部分)中定义的响应被 returned 发送给 Messenger(参见图 1 的右上图),但 lambda 函数生成的响应(写在 Python) 未收到(参见图 1 的右下图)——三点图标显示 30 秒后消失。
我使用 this video and AWS documentation 将机器人与 FB 集成。在 Webhooks 订阅中(在 FB 开发人员面板上)我选择了以下事件:messages、messaging_postbacks、messaging_optins、message_deliveries、message_reads、messaging_payments ,message_echoes,待机,messaging_handovers。该应用程序尚未通过 FB 批准,但申请状态为 Live。
图一:
(来源:imggmi.com)
图二:
(来源:imggmi.com)
import json
user_invoices = ['1/2019', '2/2019', '3/2019']
invoice_status = {'1/2019' : 'Paid', '2/2019' : 'Unpaid', '3/2019' : 'Unpaid'}
def elicit_slot(session_attributes, intent_name, slots, slot_to_elicit, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'ElicitSlot',
'intentName': intent_name,
'slots': slots,
'slotToElicit': slot_to_elicit,
'message': message
}
}
def close(session_attributes, fulfillment_state, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'Close',
'fulfillmentState': fulfillment_state,
'message': message
}
}
def handle(event, context):
intent_request = event
session_attributes = intent_request['sessionAttributes']
slots = intent_request['currentIntent']['slots']
if intent_request['currentIntent']['name'] == 'CheckInvoiceStatus':
session_attributes['lastIntent'] = intent_request['currentIntent']['name']
try:
inv_no = slots['invoiceNo']
if inv_no == None and intent_request['invocationSource'] == 'DialogCodeHook':
return elicit_slot(
session_attributes,
intent_request['currentIntent']['name'],
slots,
'invoiceNo',
{
'contentType': 'PlainText',
'content': 'Please enter invoice number.'
}
)
session_attributes['invoiceNo'] = inv_no
if not inv_no in user_invoices:
return delegate(session_attributes, intent_request['currentIntent']['slots'])
inv_status = invoice_status[inv_no]
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': 'Invoice no. {} is {}.'.format(inv_no, inv_status.lower())
}
)
except KeyError as e:
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': 'error: {}, input: {}.'.format(e, event)
}
)
elif intent_request['currentIntent']['name'] == 'AutoWelcomeMessage':
if 'userName' in session_attributes:
content = 'Hello ' + session_attributes['userName'] + '. How can I help you?'
else:
content = 'Hello. How can I help you?'
return close(
session_attributes,
'Fulfilled',
{
'contentType': 'PlainText',
'content': content
}
)
我希望 Lex 能够执行 lambda 函数和 return 给用户的值与在 Amazon Lex 控制台中测试机器人时发生的值相同。
已解决.
我的代码使用了 intent_request
中的 sessionAttributes
,问题是当没有会话属性时,相应的 JSON 元素被设置为空,即 "sessionAttributes" : {}
(如您在图 1 中所见),但如果是来自 Facebook 的消息,则此元素设置为 None
,即 "sessionAttributes" : None
(如您在图 2 中所见)。
这样我得到了如下错误:
[ERROR] TypeError: argument of type 'NoneType' is not iterable
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 104, in handle
if 'userName' in session_attributes:
或
[ERROR] TypeError: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 54, in handle
session_attributes['lastIntent'] = intent_request['currentIntent']['name']
我通过查看 lambda 函数日志发现了这一点(在 lambda 函数设计网页上单击 Monitoring
选项卡和 View logs in CloudWatch
)。
图片 1:
(来源:imggmi.com)
图 2:
(来源:imggmi.com)