跳至主要内容

使用 Python 部署您的 Facebook Messenger 机器人

逐步指南:使用 Flask、requests 和 ngrok 轻松部署一个 Facebook Messenger 聊天机器人。
· 7分钟 阅读

使用 AI 探索

当方式得当时,通过人类语言与计算机交互既强大又有趣。消息与语音控制设备正成为下一代重要平台,而对话式计算在打造引人入胜的增强与虚拟现实体验中将发挥重要作用。构建此类程序有不少独特挑战,例如:如何让我的聊天机器人对外可用?

在本教程中,您将逐步完成在 Facebook Messenger(其拥有逾 10 亿活跃用户)上部署聊天机器人的流程。只需几行代码,您就能触达海量受众。

完成此事主要有 3 个步骤。您需要:

  • 创建一个侦听来自 Facebook 消息的服务器(使用 flask)
  • 定义一个将消息发回给用户的函数(使用 requests)
  • 将一个 https 连接转发到您的本地机器(使用 ngrok)

如果您想进一步了解如何将人类语言转化为机器指令,请查看 DataCamp 课程 Building Chatbots in Python。

请注意,本文不会涉及让您的机器人理解用户表达并做出恰当回应的方法。若要了解这方面内容,请查看 Rasa NLU、Rasa Core,以及刚刚提到的 DataCamp 课程。

Python chatbot

将您的聊天机器人封装到一个 http 服务器中

第一步是创建一个 http 服务器,用于侦听由 Facebook 发送的消息,获取对此消息的响应,并最终将响应发回 Facebook 上的用户。我们将使用 flask 创建这个服务器。基本思路如下:

  • 创建一个 flask 应用,侦听发送到 localhost:5000/webhook 的消息。当在 Facebook 上发送消息时,它们会以 http 请求的形式到达该 URL。
  • listen() 函数处理这些 http 请求,并检查其是否包含有效的 Facebook 消息
  • 如果消息有效,则调用 get_bot_response() 函数,并将响应发送回 Facebook Messenger

此外,您将创建一个名为 verify_webhook() 的函数,用于处理 Facebook 与您的应用之间的初始身份验证。

最终脚本如下所示(将其保存为 server.py):

from flask import Flask, request

app = 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——稍后您将看到如何获取它!

将消息发回给用户

接下来,您将编写一个函数,使用名为 requests 的 Python 库将响应发回 Facebook Messenger。具体而言,您将使用 post() 方法,它会创建一个 HTTP POST 请求。POST 请求是向服务器发送信息的典型方式。

您的函数应如下所示:

import requests

def 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 专页

localhost:5000 这个 URL 只对在与服务器同一台电脑上发起的请求有效。因此,您需要让 Facebook 知道如何访问您的 flask 服务器。为此,首先安装 ngrok。

前往 此页面 并安装适用于您操作系统的版本。如果您在 Mac 上并已安装 homebrew,最快的安装 ngrok 的方式是运行 brew cask install ngrok。

在终端中使用 ngrok http 5000 启动 ngrok 服务器。这会设置一个 https 端点,转发到您机器的 5000 端口,例如 https://51b6b3fa.ngrok.io。

注意:如果您退出并重启 ngrok,该 URL 会发生变化。

创建 Facebook 应用与专页

下一步是在 Facebook 上创建一个应用和一个专页。Facebook 提供了良好的文档,但这里也会带您走一遍主要步骤。

要创建应用,请前往 此处,然后

  • 点击 My Apps -> Add a New App 并输入名称
  • 您将被重定向至该应用的控制台
  • 在 Products 下找到 Add a Product,点击 Messenger -> Set Up

要创建专页,您需要:

  • 进入 Messenger 的设置,向下滚动到 Token Generation,点击链接为您的应用 create a new page

创建专页后,返回 Token Generation 设置,从下拉菜单中选择该专页。将 Page Access Token 复制到上述 server.py 中 PAGE_ACCESS_TOKEN 的占位位置。

启动您的机器人服务器

现在一切就绪,是时候启动您的聊天机器人服务器了!在另一个终端标签页中运行

FLASK_APP=server.py flask run

设置 webhook

最后,您需要在 Facebook 开发者页面上注册您的 webhook。

  • 再次进入 Products 中的 Messenger 选项卡,下拉到 Webhooks,点击 Setup Webhooks
  • 在 Callback URL 中输入您的 ngrok URL,例如 https://51b6b3fa.ngrok.io/webhook。此时务必确保您的 flask 应用正在运行,因为下一步会调用 verify_token()
  • 在 Verify Token 字段中,填写您在 server.py 文件中指定的值
  • 在 Subscription Fields 中,确保勾选 messages 和 messaging_postbacks,点击 Verify and Save 以完成认证

重要:返回 Products -> Messenger,在 Select a page to subscribe your webhook to the page events 下选择您的专页并点击 Subscribe。

大功告成!

您的机器人现在可以通过 Facebook Messenger 收发消息了。此刻,您的 get_bot_response() 函数仍然非常简单,还不像一个真正的聊天机器人!若想全面学习如何构建聊天机器人,请查看 DataCamp 课程 Building Chatbots in Python 和教程 Building a Chatbot using Chatterbot in Python,以及 Python 库 Rasa NLU 与 Rasa Core。 

主题