我正在使用 Facebook Messenger 开发者平台创建一个聊天机器人。
我的问题来了,因为我正在尝试使用 ngrok 隧道作为 callback_url 设置 Webhook,并使用 figaro gem 将我的
access_token
和 verify_token
添加到我的应用程序。
不知何故,测试从未通过,我不知道为什么。
我的 ngrok 网站在浏览器中运行完美。但我认为问题源于 Webhook 没有收到它想要的信息,也就是我理解的
access_token
和 verify_token
。
我已经尝试将 ngrok 隧道重定向到一个页面,该页面返回两个(
ENV["ACCESS_TOKEN"]
&ENV["VERIFY_TOKEN"]
)的环境变量,但这不起作用。所以我只是不确定 API 期望什么以及为什么它没有得到它。
感谢您的帮助!!!!!
其实很简单,让我解释一下。
@app.route('/facebook/webhook', methods=['GET'])
def verify_webhook():
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
if mode and token and mode == 'subscribe' and token == fb_app_token:
return challenge
else:
return 'Error, wrong token', 403
@app.route('/facebook/webhook', methods=['POST'])
def handle_webhook():
data = request.json
print('were here')
print('we got here', data)
if data['object'] == 'page':
for entry in data['entry']:
messaging = entry['messaging']
for message in messaging:
if 'message' in message:
sender_id = message['sender']['id']
chatbot_response = chatbot_service.call_chatbot([message['message'].get('text', '')])
# Reply with the same text received
send_message(sender_id, chatbot_response)
假设您将这两个函数公开为端点。
verify_webhook() 有一个字符串叫做 fb_app_token,这只是一个任意值的字符串,我在这里使用了一个 GUID 值。
此外,handle_webhook() 是您还将公开的实际 callbackurl 函数。
注意 HTTP 方法,尽管端点命名约定相同。
Facebook 将向您提供的同一 CallbackUrl 发送 GET 请求。 所以当你进入你的开发者账户时,你将有这两个选项
回调网址:https://www.myweb_or_ngrok.com/facebook/webhook
验证令牌:您为 fb_app_token 生成的 GUID
Facebook 将在 GET 请求中的任何请求之前将 VerifyToken 值发送到您的 callbackurl。如果它们匹配,facebook 确认它已经到达正确的端点,它现在可以将实际的 POST 请求发送到您的 callbackurl。
过多提及 callbackurl 一词 :).
这应该让你用 FB 验证/注册你的 callbackurl。