Chuyển đến nội dung chính

Triển khai Bot Facebook Messenger với Python

Hướng dẫn từng bước để triển khai dễ dàng chatbot Facebook Messenger bằng Python, sử dụng Flask, requests và ngrok.
· 7 phút đọc

Khám phá cùng AI

Khi được làm đúng cách, tương tác với máy tính bằng ngôn ngữ tự nhiên vừa mạnh mẽ vừa thú vị. Thiết bị Nhắn tin và Điều khiển bằng giọng nói là những nền tảng lớn tiếp theo, và điện toán hội thoại sẽ đóng vai trò quan trọng trong việc tạo ra trải nghiệm thực tế tăng cường và thực tế ảo hấp dẫn. Có nhiều thách thức riêng khi xây dựng các chương trình như vậy, chẳng hạn: làm thế nào để chatbot của tôi có thể truy cập được từ bên ngoài?

Trong hướng dẫn này, bạn sẽ đi qua các bước cần thiết để triển khai một chatbot trên Facebook Messenger, nền tảng có hơn 1 tỷ người dùng hoạt động. Bạn có thể tiếp cận một lượng khán giả khổng lồ chỉ với vài dòng mã.

Có 3 bước chính để thực hiện điều này. Bạn cần:

  • tạo một máy chủ lắng nghe tin nhắn từ Facebook (dùng flask)
  • xác định một hàm để gửi tin nhắn phản hồi cho người dùng (dùng requests)
  • chuyển tiếp một kết nối https tới máy cục bộ của bạn (dùng ngrok)

Nếu bạn muốn tìm hiểu thêm về cách chuyển ngôn ngữ tự nhiên thành chỉ thị cho máy, hãy xem khóa học Xây dựng Chatbot bằng Python trên DataCamp.

Lưu ý rằng bài viết này sẽ không đề cập đến việc làm sao để bot của bạn hiểu được người dùng nói gì và phản hồi phù hợp. Để tìm hiểu thêm, bạn nên xem Rasa NLU, Rasa Core, và khóa học DataCamp vừa được nhắc đến.

Chatbot Python

Đóng gói Chatbot của bạn trong một Máy chủ http

Bước đầu tiên là tạo một máy chủ http lắng nghe các tin nhắn do Facebook gửi tới, lấy phản hồi cho tin nhắn đó, và cuối cùng gửi phản hồi lại cho người dùng trên Facebook. Chúng ta sẽ dùng flask để tạo máy chủ này. Ý tưởng cơ bản như sau:

  • Tạo một ứng dụng flask lắng nghe các tin nhắn gửi tới localhost:5000/webhook. Khi tin nhắn được gửi trên Facebook, chúng sẽ đến dưới dạng các yêu cầu http tới URL này.
  • Hàm listen() xử lý các yêu cầu http này và kiểm tra xem chúng có chứa một tin nhắn Facebook hợp lệ hay không
  • Nếu tin nhắn hợp lệ, hàm get_bot_response() được gọi và phản hồi được gửi lại Facebook Messenger

Ngoài ra, bạn sẽ tạo một hàm tên verify_webhook() để xử lý bước xác thực ban đầu giữa Facebook và ứng dụng của bạn.

Tập lệnh cuối cùng như sau (lưu với tên 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"

Trong tập lệnh trên, các biến VERIFY_TOKEN và PAGE_ACCESS_TOKEN chưa được thiết lập — vì vậy bạn sẽ phải gán giá trị cho chúng. VERIFY_TOKEN có thể là bất kỳ chuỗi nào, nó được dùng như một dạng mật khẩu để cho Facebook biết rằng máy chủ này muốn nhận tin nhắn. Nên dùng một chuỗi ngẫu nhiên dài. Bạn có thể tạo nhanh bằng cách chạy openssl rand -base64 32 trong terminal.

Chưa cần lo về PAGE_ACCESS_TOKEN — bạn sẽ xem cách lấy nó ở bên dưới!

Gửi tin nhắn phản hồi cho người dùng

Tiếp theo, bạn sẽ viết một hàm gửi phản hồi về Facebook Messenger bằng thư viện Python tên requests. Cụ thể, bạn dùng phương thức post(), phương thức tạo một yêu cầu HTTP POST. Yêu cầu POST là cách điển hình để gửi thông tin tới máy chủ.

Hàm của bạn sẽ như sau:

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()

Công khai một điểm cuối https và kết nối Trang Facebook

URL localhost:5000 chỉ hoạt động cho các yêu cầu được tạo trên cùng máy tính đang chạy máy chủ. Vì vậy bạn cần cho Facebook biết cách truy cập máy chủ flask của mình. Để làm việc này, trước hết hãy cài đặt ngrok.

Truy cập trang này và cài đặt phiên bản phù hợp với hệ điều hành của bạn. Nếu bạn dùng Mac và có homebrew, cách nhanh nhất để cài ngrok là dùng brew cask install ngrok.

Khởi động máy chủ ngrok trong terminal với ngrok http 5000. Lệnh này sẽ thiết lập một điểm cuối https chuyển tiếp tới máy của bạn ở cổng 5000, ví dụ https://51b6b3fa.ngrok.io.

Lưu ý rằng nếu bạn thoát ngrok và khởi động lại, URL này sẽ thay đổi.

Tạo Ứng dụng và Trang Facebook

Bước tiếp theo là tạo một ứng dụng và một trang trên Facebook. Facebook có tài liệu hướng dẫn rất tốt tại đây, nhưng bạn sẽ đi qua các bước chính ngay sau đây.

Để tạo ứng dụng, vào đây và

  • nhấp vào My Apps -> Add a New App và nhập tên
  • bạn sẽ được chuyển hướng đến bảng điều khiển của ứng dụng
  • trong mục Products, tìm Add a Product và nhấp Messenger -> Set Up

Để tạo trang, bạn cần:

  • vào phần cài đặt cho Messenger, cuộn xuống Token Generation và nhấp vào liên kết để create a new page cho ứng dụng của bạn

Sau khi tạo trang, quay lại phần cài đặt Token Generation và chọn trang này từ menu thả xuống. Sao chép Page Access Token vào chỗ dành cho PAGE_ACCESS_TOKEN trong server.py ở trên.

Khởi động máy chủ bot của bạn

Bây giờ mọi thứ đã sẵn sàng, đã đến lúc khởi động máy chủ chatbot! Trong một thẻ tab terminal khác, chạy

FLASK_APP=server.py flask run

Thiết lập webhook

Cuối cùng, bạn cần đăng ký webhook trên trang dành cho nhà phát triển Facebook.

  • Quay lại tab Messenger trong mục Products và cuộn xuống Webhooks, nhấp Setup Webhooks
  • Tại Callback URL, nhập URL ngrok của bạn, ví dụ https://51b6b3fa.ngrok.io/webhook. Quan trọng là ứng dụng flask của bạn đang chạy ở thời điểm này, vì verify_token() sẽ được gọi ở bước tiếp theo
  • Trong trường Verify Token, nhập giá trị bạn đã chỉ định trong tệp server.py
  • Ở Subscription Fields đảm bảo đã chọn messages và messaging_postbacks rồi Click Verify and Save để thực hiện xác thực

Quan trọng: Quay lại Products -> Messenger, và dưới mục Select a page to subscribe your webhook to the page events chọn trang của bạn và nhấp Subscribe.

Hoàn tất!

Bot của bạn giờ đã sẵn sàng để gửi và nhận tin nhắn qua Facebook Messenger. Hiện tại, hàm get_bot_response() vẫn còn khá đơn giản và chưa giống một chatbot thực thụ! Để học đầy đủ về xây dựng chatbot, hãy xem khóa học Xây dựng Chatbot bằng Python trên DataCamp và hướng dẫn Xây dựng Chatbot dùng Chatterbot trong Python, cũng như các thư viện Python Rasa NLU và Rasa Core. 

Chủ đề

Liên quan