Facebook Messenger webhook 设置,但未触发
Facebook Messenger webhook setup, but not triggered
所以我正在尝试为新的 Facebook Messenger 设置一个机器人 API。
我正在关注 the quickstart。
我设置了 webhook,并在我的 webhook 中看到了它,
我称之为:
https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E
它没有抛出任何错误,
但是当我转到生成访问令牌的页面并发送消息时,它不会调用我的 webhook。
我检查了 httpaccess,它没有调用它。
有什么调试方法或任何想法吗?
此外,我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?
我最近使用了新的聊天机器人 API,其中有很多地方可能会出错。所以,这里有一些想法。
- 确保您已经在产品设置选项卡下验证了您的网络钩子。
- 使用您的页面访问令牌将您的应用程序订阅到该页面。 returns
{"success" : "true"}
如果一切顺利的话。
重要
确保您发送消息的 Facebook 用户被列为 Admin 或 Developer或 测试员 在您的应用角色中 (https://developers.facebook.com/apps/YOUR_APP_ID/roles/)。除非您的应用获得批准并公开发布,否则来自其他用户的消息将无效。
你收到facebook的回电了吗api?还是只是消息?查看您的 Web 服务器的日志,并检查您是否在 webhook 上获得任何点击。还要检查错误日志。
尝试手动点击您的 webhook 并查看它是否响应。您可以使用
curl 生成手动请求。这是来自的请求
Facebook 看起来像:
命令:
curl -i -X POST -H 'Content-Type: application/json' -d '{"object":"page","entry":[{"id":43674671559,"time":1460620433256,"messaging":[{"sender":{"id":123456789},"recipient":{"id":987654321},"timestamp":1460620433123,"message":{"mid":"mid.1460620432888:f8e3412003d2d1cd93","seq":12604,"text":"Testing Chat Bot .."}}]}]}' https://www.YOUR_WEBHOOK_URL_HERE
所以我的问题是我在尝试订阅时调用的是 GET 而不是 POST
https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token
GET 将 return 当前订阅(空 {[]}),POST returns {"success" : "true"}
我遇到的其他一些陷阱是,
- 示例使用 https://graph.facebook.com/v2.6/me/.. but I seemed to need to use, https://graph.facebook.com/v2.6/:pageid
- 访问令牌是信使访问令牌,而不是您的API访问令牌
- 如果您的 webhook 抛出错误,Facebook 将停止向您发送消息一段时间
我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?
几天前我在做一个机器人时也遇到了同样的问题。按照这个 gist 修改代码如下,一切正常。
public function index()
{
$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];
// Set this Verify Token Value on your Facebook App
if ($verify_token === 'MyVerifyToken!') {
echo $challenge;
}
$input = json_decode(file_get_contents('php://input'), true);
// Get the Senders Graph ID
$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
// Get the returned message
$message = $input['entry'][0]['messaging'][0]['message']['text'];
//$senderName = $input['entry'][0]['messaging'][0]['sender']['name'];
$reply="Sorry, I don't understand you";
switch($message)
{
case 'hello':
$reply = "Hello, Greetings from MyApp.";
break;
case 'pricing':
$reply = "Sample reply for pricing";
break;
case 'contact':
$reply = "Sample reply for contact query";
break;
case 'webinar':
$reply = "Sample reply for webinar";
break;
case 'support':
$reply = "sample reply for support";
break;
default:
$reply="Sorry, I don't understand you";
}
//API Url and Access Token, generate this token value on your Facebook App Page
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=MYACCESSTOKEN';
//Initiate cURL.
$ch = curl_init($url);
//The JSON data.
$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},
"message":{
"text":"'.$reply.'"
}
}';
//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);
//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//Execute the request but first check if the message is not empty.
if (!empty($input['entry'][0]['messaging'][0]['message'])) {
$result = curl_exec($ch);
}
}
注意 : 确保应用程序页面中的用户角色可以从 web 挂钩中获取响应。我已经设置了管理员和测试用户。只有那里能够得到回应。一旦发布,其他用户将获得。此外,相应地更改验证令牌和页面令牌。
发布应用程序时,有一个选项会询问有关此机器人将被使用的企业数量。但我不知道如何使用它。不过还在搜索。
如果您使用框架,则从 CSRF 验证中排除您的船路会有所帮助。这对我有帮助 (Laravel 5.4, app/Http/Middleware/VerifyCsrfToken.php):
protected $except = [
'/your_bot_route'
];
另一种可能会阻止某些响应被发送到您的 webhook 的情况是当消息类型在队列中被阻塞时。
如果将特定类型的消息传送到您的网络钩子,但在 20 秒内未收到 200 响应,它将在数小时内继续尝试再次向您发送该消息。
此外,Facebook Messenger 将停止向您发送更多该类型的消息,直到第一个消息被确认。它实质上是将它们放入队列中。
在此期间,其他消息类型将继续正常发送。
当我不小心在处理标准消息的代码中引入了一个未声明的变量时,我就遇到了这种情况。这意味着回发消息都可以正常工作,但快速回复和普通消息永远不会发送到我的 webhook。一旦你修复了错误,它们就会立刻堆积起来。
正如其他人所提到的,使用 POSTMAN 等服务将消息发送到您的 webhook 是发现此类错误的好方法,否则,Messenger 只会默默地失败。
如果您仍然无法解决您的问题,请尝试检查并更新您的隐私政策link。
我将 worry link 更新为隐私政策,Facebook 显示 404 错误,即使 webhoob 已验证...
您可以 link 您的应用程序的多个页面,在 Messenger 设置的“添加或删除页面”选项卡下
所以我正在尝试为新的 Facebook Messenger 设置一个机器人 API。
我正在关注 the quickstart。
我设置了 webhook,并在我的 webhook 中看到了它,
我称之为:
https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E
它没有抛出任何错误,
但是当我转到生成访问令牌的页面并发送消息时,它不会调用我的 webhook。 我检查了 httpaccess,它没有调用它。
有什么调试方法或任何想法吗?
此外,我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?
我最近使用了新的聊天机器人 API,其中有很多地方可能会出错。所以,这里有一些想法。
- 确保您已经在产品设置选项卡下验证了您的网络钩子。
- 使用您的页面访问令牌将您的应用程序订阅到该页面。 returns
{"success" : "true"}
如果一切顺利的话。
重要
确保您发送消息的 Facebook 用户被列为 Admin 或 Developer或 测试员 在您的应用角色中 (https://developers.facebook.com/apps/YOUR_APP_ID/roles/)。除非您的应用获得批准并公开发布,否则来自其他用户的消息将无效。
你收到facebook的回电了吗api?还是只是消息?查看您的 Web 服务器的日志,并检查您是否在 webhook 上获得任何点击。还要检查错误日志。
尝试手动点击您的 webhook 并查看它是否响应。您可以使用 curl 生成手动请求。这是来自的请求 Facebook 看起来像:
命令:
curl -i -X POST -H 'Content-Type: application/json' -d '{"object":"page","entry":[{"id":43674671559,"time":1460620433256,"messaging":[{"sender":{"id":123456789},"recipient":{"id":987654321},"timestamp":1460620433123,"message":{"mid":"mid.1460620432888:f8e3412003d2d1cd93","seq":12604,"text":"Testing Chat Bot .."}}]}]}' https://www.YOUR_WEBHOOK_URL_HERE
所以我的问题是我在尝试订阅时调用的是 GET 而不是 POST
https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token
GET 将 return 当前订阅(空 {[]}),POST returns {"success" : "true"}
我遇到的其他一些陷阱是,
- 示例使用 https://graph.facebook.com/v2.6/me/.. but I seemed to need to use, https://graph.facebook.com/v2.6/:pageid
- 访问令牌是信使访问令牌,而不是您的API访问令牌
- 如果您的 webhook 抛出错误,Facebook 将停止向您发送消息一段时间
我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?
几天前我在做一个机器人时也遇到了同样的问题。按照这个 gist 修改代码如下,一切正常。
public function index()
{
$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];
// Set this Verify Token Value on your Facebook App
if ($verify_token === 'MyVerifyToken!') {
echo $challenge;
}
$input = json_decode(file_get_contents('php://input'), true);
// Get the Senders Graph ID
$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
// Get the returned message
$message = $input['entry'][0]['messaging'][0]['message']['text'];
//$senderName = $input['entry'][0]['messaging'][0]['sender']['name'];
$reply="Sorry, I don't understand you";
switch($message)
{
case 'hello':
$reply = "Hello, Greetings from MyApp.";
break;
case 'pricing':
$reply = "Sample reply for pricing";
break;
case 'contact':
$reply = "Sample reply for contact query";
break;
case 'webinar':
$reply = "Sample reply for webinar";
break;
case 'support':
$reply = "sample reply for support";
break;
default:
$reply="Sorry, I don't understand you";
}
//API Url and Access Token, generate this token value on your Facebook App Page
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=MYACCESSTOKEN';
//Initiate cURL.
$ch = curl_init($url);
//The JSON data.
$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},
"message":{
"text":"'.$reply.'"
}
}';
//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);
//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//Execute the request but first check if the message is not empty.
if (!empty($input['entry'][0]['messaging'][0]['message'])) {
$result = curl_exec($ch);
}
}
注意 : 确保应用程序页面中的用户角色可以从 web 挂钩中获取响应。我已经设置了管理员和测试用户。只有那里能够得到回应。一旦发布,其他用户将获得。此外,相应地更改验证令牌和页面令牌。
发布应用程序时,有一个选项会询问有关此机器人将被使用的企业数量。但我不知道如何使用它。不过还在搜索。
如果您使用框架,则从 CSRF 验证中排除您的船路会有所帮助。这对我有帮助 (Laravel 5.4, app/Http/Middleware/VerifyCsrfToken.php):
protected $except = [
'/your_bot_route'
];
另一种可能会阻止某些响应被发送到您的 webhook 的情况是当消息类型在队列中被阻塞时。
如果将特定类型的消息传送到您的网络钩子,但在 20 秒内未收到 200 响应,它将在数小时内继续尝试再次向您发送该消息。
此外,Facebook Messenger 将停止向您发送更多该类型的消息,直到第一个消息被确认。它实质上是将它们放入队列中。
在此期间,其他消息类型将继续正常发送。
当我不小心在处理标准消息的代码中引入了一个未声明的变量时,我就遇到了这种情况。这意味着回发消息都可以正常工作,但快速回复和普通消息永远不会发送到我的 webhook。一旦你修复了错误,它们就会立刻堆积起来。
正如其他人所提到的,使用 POSTMAN 等服务将消息发送到您的 webhook 是发现此类错误的好方法,否则,Messenger 只会默默地失败。
如果您仍然无法解决您的问题,请尝试检查并更新您的隐私政策link。
我将 worry link 更新为隐私政策,Facebook 显示 404 错误,即使 webhoob 已验证...
您可以 link 您的应用程序的多个页面,在 Messenger 设置的“添加或删除页面”选项卡下