Я создал чат-бота с Amazon Lex и интегрировал его с Facebook Messenger. Ответы, определенные в консоли Lex (раздел Ответ ), возвращаются в мессенджер (см. Верхнее правое изображение на рисунке 1), но ответы, генерируемые лямбда-функциями (написанными на Python), не принимаются (см. Правое нижнее изображение) на рисунке 1) - значок тройной точки отображается в течение 30 секунд и исчезает.
Я интегрировал бота с FB, используя это видео и Документация AWS . В подписках Webhooks (на панели разработчиков FB) я выбрал следующие события: сообщения, сообщения сообщений, сообщения, сообщения, сообщения, сообщения, сообщения, платежи, сообщения, сообщения, ожидания, сообщения сообщения . Приложение еще не одобрено FB, но статус приложения Live .
Изображение 1:
Изображение 2:
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
}
)
Я ожидаю, что Лекс сможет выполнять лямбда-функции и возвращать значения пользователю так же, как это происходит при тестировании бота в консоли Amazon Lex.