Facebook Messenger не отображает сообщения, возвращаемые лямбдами бота - PullRequest
0 голосов
/ 17 января 2019

Я создал чат-бота с Amazon Lex и интегрировал его с Facebook Messenger. Ответы, определенные в консоли Lex (раздел Ответ ), возвращаются в мессенджер (см. Верхнее правое изображение на рисунке 1), но ответы, генерируемые лямбда-функциями (написанными на Python), не принимаются (см. Правое нижнее изображение) на рисунке 1) - значок тройной точки отображается в течение 30 секунд и исчезает.

Я интегрировал бота с FB, используя это видео и Документация AWS . В подписках Webhooks (на панели разработчиков FB) я выбрал следующие события: сообщения, сообщения сообщений, сообщения, сообщения, сообщения, сообщения, сообщения, платежи, сообщения, сообщения, ожидания, сообщения сообщения . Приложение еще не одобрено FB, но статус приложения Live .

Изображение 1: pic1

Изображение 2: pic2

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.

1 Ответ

0 голосов
/ 18 января 2019

решаемые .

Мой код использовал sessionAttributes из intent_request, и проблема заключалась в том, что при отсутствии атрибутов сеанса соответствующий элемент 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']

Я обнаружил это, просмотрев журналы лямбда-функций (на веб-странице описания лямбда-функций щелкните вкладку Monitoring и View logs in CloudWatch).

Изображение 1:

image1

Изображение 2:

image2

...