如何使用 Python Flask 创建 Facebook Messenger 机器人

2025-06-08

如何使用 Python Flask 创建 Facebook Messenger 机器人

机器人革命已席卷全球,人人都在构建机器人。本文将指导您使用 Python/Flask 创建您的第一个机器人。代码库可在Github上找到。

图像的替代文本

需要创建一个轻量级的 Web 应用程序来补充我们的机器人。

我们将要使用的不同技术如下:

我们将演示一个非常简单的功能:

询问某个地点的当前天气,聊天机器人应该返回天气信息。

例子:

问:新德里现在的天气怎么样?

回复:新德里当前天气报告:最高温度:42.0 最低温度:40.0 当前温度:40.95 风速:2.6 湿度 20%

图像的替代文本

1. 设置 AI API

API AI 是一个对话式体验平台。在API AI注册并创建一个帐户。创建一个代理来访问测试控制台。导航到代理的“设置”并获取客户端访问令牌。

图像的替代文本

创建意图

意图是用户表达和期望响应之间的映射。

我们添加了一个意图,其中包含用户表达“新加坡的天气如何?”

图像的替代文本

其中,新加坡被标记为@ sys.geo-city类型的实体。此参数在对话中可以取任意值,并用于确定我们应用程序中的响应。

我们为用户表达式添加以下响应:“$geo-city 的当前天气报告:”

图像的替代文本

API AI Python 客户端

我们可以使用API​​ AI python SDK进行自然语言处理。

2. 设置开放天气地图

Open Weather Map 提供API,用于访问地球上任何位置的当前天气数据。有一个优秀的Python 包装器可用于使用这些 API。注册 Open Weather Map 并获取 API 密钥以获取天气数据。

owm = pyowm.OWM('your_open_weather_map_api_key')  # You MUST provide a valid API key

forecast = owm.daily_forecast(input_city)

observation = owm.weather_at_place(input_city)
w = observation.get_weather()
print(w)                      
print(w.get_wind())                 
print(w.get_humidity())      
max_temp = str(w.get_temperature('celsius')['temp_max'])  
min_temp = str(w.get_temperature('celsius')['temp_min'])
current_temp = str(w.get_temperature('celsius')['temp'])
wind_speed = str(w.get_wind()['speed'])
humidity = str(w.get_humidity())
Enter fullscreen mode Exit fullscreen mode

如果您有开放天气地图的专业订阅,请使用以下命令:

owm = pyowm.OWM(API_key='your-API-key', subscription_type='pro')
Enter fullscreen mode Exit fullscreen mode

3. 设置Flask服务器

import apiai
Enter fullscreen mode Exit fullscreen mode

添加客户端访问令牌、页面访问令牌和验证令牌

CLIENT_ACCESS_TOKEN = 'your_client_access_token_from_api_ai'
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
VERIFY_TOKEN = 'verification_token_for_facebook_chatbot_using_python'

ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN)
Enter fullscreen mode Exit fullscreen mode

Facebook webhook 将请求发送到应用程序,如果应用程序返回的令牌与 Facebook 应用程序中输入的令牌匹配,则验证完成

@app.route('/', methods=['GET'])
def handle_verification():
    if (request.args.get('hub.verify_token', '') == VERIFY_TOKEN):
        print("Verified")
        return request.args.get('hub.challenge', '')
    else:
        print("Wrong token")
        return "Error, wrong validation token"
Enter fullscreen mode Exit fullscreen mode

应用程序将解析 Facebook Messenger 发送的所有消息

@app.route('/', methods=['POST'])
def handle_message():
    '''
    Handle messages sent by facebook messenger to the applicaiton
    '''
    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_response(sender_id, parse_natural_text(message_text)


     return "ok"
Enter fullscreen mode Exit fullscreen mode

使用 python 请求库调用 facebook Graph API 向 facebook 用户发送消息

def send_message(sender_id, message_text):
    '''
    Sending response back to the user using facebook graph API
    '''
    r = requests.post("https://graph.facebook.com/v2.6/me/messages",

        params={"access_token": PAGE_ACCESS_TOKEN},

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

        data=json.dumps({
        "recipient": {"id": sender_id},
        "message": {"text": message_text}
    }))
Enter fullscreen mode Exit fullscreen mode

使用 API AI 解析用户发送的消息,并接收来自 API AI 的机器人响应。从开放的天气地图客户端获取天气数据,并将机器人响应附加到报告中。

def parse_user_text(user_text):

    '''
    Send the message to API AI which invokes an intent
    and sends the response accordingly
    The bot response is appened with weaher data fetched from
    open weather map client
    '''

    request = ai.text_request()
    request.query = user_text

    response = json.loads(request.getresponse().read().decode('utf-8'))
    responseStatus = response['status']['code']
    if (responseStatus == 200):
        print("Bot response", response['result']['fulfillment']['speech'])

        weather_report = ''

        input_city = response['result']['parameters']['geo-city']

        #Fetching weather data
        owm = pyowm.OWM('edd197717da7951b85f8f6936fc27b13')  # You MUST provide a valid API key

        forecast = owm.daily_forecast(input_city)

        observation = owm.weather_at_place(input_city)
        w = observation.get_weather()
        print(w)                      
        print(w.get_wind())                 
        print(w.get_humidity())      
        max_temp = str(w.get_temperature('celsius')['temp_max'])  
        min_temp = str(w.get_temperature('celsius')['temp_min'])
        current_temp = str(w.get_temperature('celsius')['temp'])
        wind_speed = str(w.get_wind()['speed'])
        humidity = str(w.get_humidity())
        weather_report = ' max temp: ' + max_temp + ' min temp: ' + min_temp + ' current temp: ' + current_temp + ' wind speed :' + wind_speed + ' humidity ' + humidity + '%'
        print("Weather report ", weather_report)
        return (response['result']['fulfillment']['speech'] + weather_report)
    else:
        return ("Please try again")


def send_message_response(sender_id, message_text):
    sentenceDelimiter = ". "
    messages = message_text.split(sentenceDelimiter)

    for message in messages:
        send_message(sender_id, message)

if __name__ == '__main__':
    app.run()
Enter fullscreen mode Exit fullscreen mode

激活虚拟环境,安装所有软件包

pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

并运行脚本

python fb-chatbot.py
Enter fullscreen mode Exit fullscreen mode

设置到本地主机的隧道

我们已经使用 ngrok 将本地网络服务器公开到互联网,以便它可以用于使用带有 Facebook 应用程序的 webhook 进行的回调验证。

sudo apt-get update
sudo apt-get install ngrok-client
Enter fullscreen mode Exit fullscreen mode

并运行 ngrok 客户端

./ngrok http -bind-tls=true 5000
Enter fullscreen mode Exit fullscreen mode

请注意,验证需要安全回调 URL(https)。

设置 Facebook Messenger

创建Facebook 页面Facebook 应用程序。向应用程序添加 Webhook。

图像的替代文本

获取应用程序 ID 并在脚本中更新它。

将 Messenger 添加到应用程序并为必须用于聊天的页面生成令牌。

图像的替代文本

图像的替代文本

并选择页面订阅的事件

图像的替代文本

重启服务器,聊天机器人现在已准备就绪。Facebook 进一步提供了 UI 元素,您可以在这里试用

这篇文章将帮助你使用 API.AI 构建你自己的聊天机器人。如有任何疑问或需求,欢迎随时联系我们。

本文最初发表于Apcelent Tech Blog

鏂囩珷鏉ユ簮锛�https://dev.to/apcelent/how-to-create-a-facebook-messenger-bot-with-python-flask-50j2
PREV
模型上下文协议 (MCP) 初学者指南
NEXT
如何通过 5 个步骤从编程教程过渡到开发应用程序 问题 解决方案 从编程教程过渡到开发应用程序的 5 个步骤 要点