使用Python部署Facebook Messenger Bot

本文概述

  • 将聊天机器人包装在http服务器中
  • 向用户发送消息
如果操作正确, 通过人类语言与计算机进行交互的功能将非常强大, 而且非常有趣。消息传递和语音控制设备是下一个大型平台, 而对话计算在创建引人入胜的增强和虚拟现实体验中将发挥重要作用。构建此类程序存在许多独特的挑战, 例如:如何使我的聊天机器人可供外界使用?
在本教程中, 你将完成在拥有超过10亿活跃用户的Facebook Messenger上部署聊天机器人所需的步骤。仅需几行代码, 你就可以吸引大量的受众。
有3个主要步骤可完成此操作。你需要:
  • 创建一个服务器来侦听来自Facebook的消息(使用flask)
  • 定义一个将消息发送回用户的功能(使用请求)
  • 将https连接转发到本地计算机(使用ngrok)
如果你想进一步了解如何将人类语言转化为机器指令, 请查看Python srcmini中的” 构建聊天机器人” 课程。
请注意, 你在这篇文章中不会涉及的是你的机器人如何理解人们在说什么并做出适当的响应。要了解有关此内容的更多信息, 请查看Rasa NLU, Rasa Core和刚才提到的srcmini课程。
将聊天机器人包装在http服务器中第一步是创建一个http服务器, 该服务器侦听Facebook发送的消息, 获取对该消息的响应, 最后将响应发送回Facebook上的用户。我们将使用flask创建此服务器。基本思想如下:
  • 创建一个烧瓶应用程序, 侦听发送到localhost:5000 / webhook的消息。在Facebook上发送消息时, 它们将以http请求的形式到达此URL。
  • listen()函数处理这些http请求并检查它们是否包含有效的Facebook消息
  • 如果消息有效, 则调用get_bot_response()函数, 并将响应发送回Facebook Messenger
另外, 你将创建一个称为verify_webhook()的函数, 该函数处理Facebook和你的应用程序之间的初始身份验证。
最终脚本如下所示(将其保存在server.py下):
from flask import Flask, requestapp = Flask(__name__)FB_API_URL = 'https://graph.facebook.com/v2.6/me/messages' VERIFY_TOKEN = ''# < paste your verify token here> PAGE_ACCESS_TOKEN = ''# paste your page access token here> "def get_bot_response(message): """This is just a dummy function, returning a variation of what the user said. Replace this function with one connected to chatbot.""" return "This is a dummy response to '{}'".format(message)def verify_webhook(req): if req.args.get("hub.verify_token") == VERIFY_TOKEN: return req.args.get("hub.challenge") else: return "incorrect"def respond(sender, message): """Formulate a response to the user and pass it on to a function that sends it.""" response = get_bot_response(message) send_message(sender, response)def is_user_message(message): """Check if the message is a message from the user""" return (message.get('message') and message['message'].get('text') and not message['message'].get("is_echo"))@app.route("/webhook") def listen(): """This is the main function flask uses to listen at the `/webhook` endpoint""" if request.method == 'GET': return verify_webhook(request)if request.method == 'POST': payload = request.json event = payload['entry'][0]['messaging'] for x in event: if is_user_message(x): text = x['message']['text'] sender_id = x['sender']['id'] respond(sender_id, text)return "ok"

在上面的脚本中, 尚未定义VERIFY_TOKEN和PAGE_ACCESS_TOKEN变量-因此你必须进行设置。 VERIFY_TOKEN可以是任何字符串, 它用作一种密码, 以使Facebook知道该服务器想要接收消息。使用长随机字符串是个好主意。你可以通过在终端中运行openssl rand -base64 32来快速执行此操作。
不必担心PAGE_ACCESS_TOKEN-你将在下面看到如何获得它!
向用户发送消息接下来, 你将编写一个函数, 该函数使用称为请求的python库将响应发送回Facebook Messenger。特别是, 你使用post()方法创建一个HTTP POST请求。 POST请求是将信息发送到服务器的典型方法。
你的函数应如下所示:
import requestsdef send_message(recipient_id, text): """Send a response to Facebook""" payload = { 'message': { 'text': text }, 'recipient': { 'id': recipient_id }, 'notification_type': 'regular' }auth = { 'access_token': PAGE_ACCESS_TOKEN }response = requests.post( FB_API_URL, params=auth, json=payload )return response.json()

公开一个https端点并连接一个Facebook页面
【使用Python部署Facebook Messenger Bot】url localhost:5000仅适用于与正在运行的服务器在同一台计算机上创建的请求。因此, 你需要让Facebook知道如何访问烧瓶服务器。为此, 请首先安装ngrok。
转到此页面并为你的操作系统安装版本。如果你使用的是Mac并且使用自制软件, 则最快的安装ngrok的方法是使用brew cask install ngrok。
使用ngrok http 5000在终端中启动ngrok服务器。这将设置一个https终结点, 以转发到端口5000上的计算机, 例如https://51b6b3fa.ngrok.io。
请注意, 如果退出ngrok并重新启动, 则此URL将更改。
创建一个Facebook应用程序和页面
下一步是在Facebook上创建一个应用程序和一个页面。 Facebook提供了很好的文档, 但是你将在此处逐步完成主要步骤。
要创建该应用, 请转到此处
  • 点击我的应用-> 添加新应用并输入名称
  • 你将被重定向到该应用程序的仪表板
  • 在产品下, 找到添加产品, 然后单击Messenger-> 设置
要创建页面, 你必须:
  • 进行Messenger的设置, 向下滚动到Token Generation, 然后单击链接为你的应用创建新页面
创建页面后, 请返回令牌生成设置, 然后从下拉菜单中选择此页面。将页面访问令牌复制到上述server.py中PAGE_ACCESS_TOKEN的占位符中。
启动你的机器人服务器
现在你已完成所有设置, 现在该启动你的聊天机器人服务器了!在单独的终端选项卡中, 运行
FLASK_APP=server.py flask run

设置网络挂钩
最后, 你需要在Facebook开发人员页面上注册Webhook。
  • 再次转到产品中的Messenger选项卡, 然后向下滚动到Webhooks, 单击” 设置Webhooks”
  • 在” 回调URL” 下方, 输入你的ngrok URL, 例如https://51b6b3fa.ngrok.io/webhook。此时, 必须运行烧瓶应用程序, 这一点很重要, 因为在下一步中将调用verify_token()
  • 在” 验证令牌” 字段中, 将你指定的值放在server.py文件中
  • 在” 订阅字段” 中, 确保已选中message和messages_postbacks。单击” 验证并保存” 以执行身份验证。
重要说明:返回至产品-> Messenger, 然后在” 选择页面以将Webhook订阅到页面事件” 下选择你的页面, 然后单击” 订阅” 。
你的机器人现在可以通过Facebook Messenger发送和接收消息了。现在, 你的get_bot_response()函数仍然非常简单, 并且还不像真正的聊天机器人!要了解有关构建聊天机器人的所有信息, 请查看” Python srcmini中的构建聊天机器人” 课程, 以及Rasa NLU和Rasa Core python库。

    推荐阅读