如何使用 Python Flask 创建 Facebook Messenger 机器人
机器人革命已席卷全球,人人都在构建机器人。本文将指导您使用 Python/Flask 创建您的第一个机器人。代码库可在Github上找到。
需要创建一个轻量级的 Web 应用程序来补充我们的机器人。
我们将要使用的不同技术如下:
- 服务器后端:Flask
- 安全隧道到本地主机:Ngrok
- 自然语言处理平台:API AI
- 在 Facebook Messenger 上部署
- 用于天气报告的OpenWeatherMap Web API的Python 包装器
我们将演示一个非常简单的功能:
询问某个地点的当前天气,聊天机器人应该返回天气信息。
例子:
问:新德里现在的天气怎么样?
回复:新德里当前天气报告:最高温度: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())
如果您有开放天气地图的专业订阅,请使用以下命令:
owm = pyowm.OWM(API_key='your-API-key', subscription_type='pro')
3. 设置Flask服务器
import apiai
添加客户端访问令牌、页面访问令牌和验证令牌
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)
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"
应用程序将解析 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"
使用 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}
}))
使用 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()
激活虚拟环境,安装所有软件包
pip install -r requirements.txt
并运行脚本
python fb-chatbot.py
设置到本地主机的隧道
我们已经使用 ngrok 将本地网络服务器公开到互联网,以便它可以用于使用带有 Facebook 应用程序的 webhook 进行的回调验证。
sudo apt-get update
sudo apt-get install ngrok-client
并运行 ngrok 客户端
./ngrok http -bind-tls=true 5000
请注意,验证需要安全回调 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