Кнопка быстрого ответа Facebook Messenger в Python

В настоящее время я пытаюсь добавить кнопки быстрого ответа в свой чат-бот для обмена сообщениями, который я разработал с помощью Amazon Lex и Python в Amazon Lambda. Я нашел это на сайте Facebook для разработчиков:

curl -X POST -H "Content-Type: application/json" -d '{
  "recipient":{
    "id":"<PSID>"
  },
  "message":{
    "text": "Here's a quick reply!",
    "quick_replies":[
      {
        "content_type":"text",
        "title":"Search",
        "payload":"<POSTBACK_PAYLOAD>",
        "image_url":"http://example.com/img/red.png"
      },
      {
        "content_type":"location"
      },
      {
        "content_type":"text",
        "title":"Something Else",
        "payload":"<POSTBACK_PAYLOAD>"
      }
    ]
  }
}' "https://graph.facebook.com/v2.6/me/messages?access_token=<PAGE_ACCESS_TOKEN>"

Я пробовал искать решения, но для них требуется библиотека fbmessenger. Я надеялся использовать библиотеку urllib вместо библиотек с открытым исходным кодом. Есть ли этому решение?

Кнопка быстрого ответа в Messenger

def helpMe(intent_request):

session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}

return close(
    session_attributes,
    'Fulfilled',
    {
        'contentType': 'PlainText',
        'content': 'It seems like you need help, let me save you from your misery.\n\n' 
         + '- If you want to find '
         + 'out what insurance plan is suitable for your dear self, try asking me "Which integrated Shield Plan is right for me?".\n\n '
         + '- If you want me to explain about your current plan, you could try asking me ' 
         + '"Explain my current plan".\n\n '
         + '- If you wanna listen to my extremely hilarious puns, just type in "joke" and you will not regret it hehe. '
    },
    'responseCard': {
    'version': '0',
    'contentType': 'application/vnd.amazonaws.card.generic',
    'genericAttachments': [
        {
        'title': 'Help',
        'subTitle': 'Select button of choice',
        'imageUrl': '',
        "buttons":[ 
             {
                "text":"recommend plan",
                "value":"Which integrated Shield Plan is right for me"
             },
             {
                "text":"current plan",
                "value":"Explain my current plan"
             },
             {
                "text":"tell me a joke",
                "value":"joke"
             }
            ]
        }
    ]
    }
)

person CJ See    schedule 17.01.2018    source источник


Ответы (2)


Примерно так можно получить и отправить.

Получить сообщение:

data = request.get_json()

if data["object"] == "page":

    for entry in data["entry"]:
        for messaging_event in entry["messaging"]:

            if messaging_event.get("message"):

                sender_id = messaging_event["sender"]["id"]
                recipient_id = messaging_event["recipient"]["id"]
                message_text = messaging_event["message"]["text"]

                send_message(sender_id, "roger that!")

            if messaging_event.get("delivery"):
                pass

            if messaging_event.get("optin"):
                pass

            if messaging_event.get("postback"):
                pass

return "ok", 200

Отправить сообщение:

Вы можете просто включить код кнопки быстрого ответа в

"сообщение"

def send_message(recipient_id, message_text):
    params = {
           "access_token": os.environ["PAGE_ACCESS_TOKEN"]
    }

    headers = {
            "Content-Type": "application/json"
    }

    data = json.dumps({
               "recipient": {
                      "id": recipient_id
               },
               "message": {
                  "text": message_text
                  "quick_replies":[{
                            "content_type":"text",
                            "title":"Search",
                            "payload":"<POSTBACK_PAYLOAD>",
                            "image_url":"http://example.com/img/red.png"
                            },
                            {
                             "content_type":"location"
                            },
                            {
                             "content_type":"text",
                             "title":"Something Else",
                             "payload":"<POSTBACK_PAYLOAD>"
                             }
                   ]
               }
    })
    r = requests.post("https://graph.facebook.com/v2.6/me/messages", params=params, headers=headers, data=data)

На самом деле вы можете настроить то, что хотите, на основе показанного здесь примера curl.

person Salehin Rafi    schedule 17.01.2018
comment
Привет Салехин, спасибо за ответ. У меня есть вопрос, где я должен использовать эту функцию в своих кодах, чтобы получить ответ слота? Это так? Текущий: 'def Insurance_bot(intent_request): национальность = try_ex(лямбда: намерение_request['currentIntent']['slots']['nation'])' Сейчас: ' def Insurance_bot (intent_request): национальность = r' - person CJ See; 17.01.2018
comment
вы можете проверить мой простой чат-бот, как получить значение намерения: github.com/salehinRafi/chatbot Но я использовать стороннюю библиотеку. Но я считаю, что в этом нет ничего серьезного. Я предпочитаю отдельный файл для приятного чтения. - person Salehin Rafi; 17.01.2018
comment
У вас есть идеи, как получить получателя_id? - person CJ See; 17.01.2018
comment
Салехин, вместо библиотеки запросов можно использовать библиотеку urllib из python? - person CJ See; 18.01.2018
comment
@CJSee, конечно, можешь. Вы можете обратиться к этому сообщению (stackoverflow.com/q/47384859/4216992), как я использую urllib, и вы можете манипулировать своим код. Игнорировать вопрос без ответа. Я уже нашел решение. - person Salehin Rafi; 18.01.2018

Поскольку вы работаете с Lex и Lambda, я думаю, вы хотите отправить кнопки ответа пользователю, чтобы он мог продолжить разговор.

Вот как это сделать в лямбда-функции:

'responseCard': {
    'version': '0',
    'contentType': 'application/vnd.amazonaws.card.generic',
    'genericAttachments': [
        {
        'title': 'title1',
        "buttons":[ 
             {
                "text":"button_1",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_2",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_3",
                "value":"value_to_be_sent_to_server_on_click"
             }
            ]
        }
    ]
}

Вы также можете иметь эти кнопки в сообщении «Закрыть» и сообщении ElicitSlot, кроме того, вы также можете иметь изображения вместе с кнопками.

Ниже приведен код для кнопок и изображений в сообщении «Закрыть».

'dialogAction': {
    'type': 'Close',
    'fulfillmentState': 'Fulfilled',
    'message': {
        'contentType': 'PlainText',
        'content': message
    },
    'responseCard': {
    'version': '0',
    'contentType': 'application/vnd.amazonaws.card.generic',
    'genericAttachments': [
        {
        'title': 'title1',
        'subTitle': 'subtitle1',
        'attachmentLinkUrl': 'link_that_will_open_on_click',
        'imageUrl': 'link_of_image_to_display',
        "buttons":[ 
             {
                "text":"button_1",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_2",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_3",
                "value":"value_to_be_sent_to_server_on_click"
             }
            ]
        },
        {
        'title': 'title2',
        'subTitle': 'subtitle2',
        'attachmentLinkUrl': 'link_that_will_open_on_click',
        'imageUrl': 'link_of_image_to_display',
        "buttons":[ 
             {
                "text":"button_1",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_2",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_3",
                "value":"value_to_be_sent_to_server_on_click"
             }
            ]
        },
        {
        'title': 'title3',
        'subTitle': 'subtitle3',
        'attachmentLinkUrl': 'link_that_will_open_on_click',
        'imageUrl': 'link_of_image_to_display',
        "buttons":[ 
             {
                "text":"button_1",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_2",
                "value":"value_to_be_sent_to_server_on_click"
             },
             {
                "text":"button_3",
                "value":"value_to_be_sent_to_server_on_click"
             }
            ]
        }
    ]
    }
}

ПРИМЕЧАНИЕ. В одной карусели может быть максимум 3 кнопки, хотя в одно сообщение можно добавить до 10 каруселей. Если у вас более 3 кнопок, вы не получите ошибку, а будут показаны только первые 3.

Чтобы кнопки карусели работали, вам нужно проверить messaging_postbacks событий в Webhooks настройках мессенджера в приложении Facebook.

Вы получите ответ в мессенджере следующего вида:
введите здесь описание изображения

Надеюсь, поможет.

person sid8491    schedule 18.01.2018
comment
Привет sid8491, спасибо за ответ. Собственно, я имею в виду кнопку быстрого ответа в мессенджере. Я добавил пример кнопки быстрого ответа в Messenger в свой вопрос. У вас есть решение? - person CJ See; 18.01.2018
comment
это добавит кнопку быстрого ответа только в мессенджере, я также обновил ответ с изображением, пожалуйста, проверьте. эти кнопки можно использовать для отображения информации, получения информации о слотах и ​​других вещей. - person sid8491; 18.01.2018
comment
Я изменил изображение, чтобы показать лучший пример. Может ли метод карточки ответов тоже работать? - person CJ See; 18.01.2018
comment
@CJSee да, это сработает. но то, как кнопки отображаются на FB, отличается, если мы используем Lex. попробуйте первый код, который я разместил в коде ElicitSlot, чтобы получить размер или цвет - person sid8491; 18.01.2018
comment
Привет, sid8491, я добавил коды в свой вопрос. Это то, что вы имели в виду? - person CJ See; 22.01.2018
comment
Ага. это завершает ваше требование? - person sid8491; 22.01.2018
comment
Но я получаю синтаксическую ошибку в строке 'responseCard': { Я не могу найти свою ошибку - person CJ See; 22.01.2018
comment
опубликуйте также свой метод close() - person sid8491; 22.01.2018