【问题标题】:Facebook Messenger webhook setup, but not triggeredFacebook Messenger webhook 设置,但未触发
【发布时间】:2016-08-16 15:50:15
【问题描述】:

所以我正在尝试为新的 Facebook Messenger API 设置一个机器人。

我正在关注the quickstart

我设置好 webhook,并在我的 webhook 中看到它,

我称之为:

https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E

它没有抛出任何错误,

但是当我转到生成访问令牌的页面并发送消息时,它不会调用我的 webhook。 我检查了httpaccess,它没有调用它。

有什么方法可以调试这个或任何想法?

另外,我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?

【问题讨论】:

    标签: facebook facebook-graph-api webhooks facebook-messenger


    【解决方案1】:

    我最近使用了新的聊天机器人 API,但有很多地方可能会出错。所以,这里有一些想法。

    • 确保您已在产品设置选项卡下验证了您的 webhook。
    • 使用您的页面访问令牌将您的应用订阅到该页面。如果一切正常,它会返回 {"success" : "true"}

    重要

    • 确保您发送消息的 Facebook 用户在您的应用角色 (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
    

    【讨论】:

    • 另一个问题:PageId 必须是数字页面 id,而不是友好的 url id。我能找到的唯一方法是查看页面源并在 javascript 中搜索 page_id。
    • @Rick ... 或者您只需点击页面的“关于”标签,您的“Facebook 页面 ID”就会列在“页面信息”部分的底部。
    • 我的应用程序已上线,尚未开发。当我从管理员角色写入时,我可以触发 webhook,但当我从另一个 fb 帐户写入时则不能。可能是什么问题?
    【解决方案2】:

    所以我的问题是我在尝试订阅而不是 POST 时调用了 GET

    https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token
    

    GET 将返回当前订阅(空 {[]}),POST 返回 {"success" : "true"}

    我遇到的其他一些问题是,

    我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?

    【讨论】:

    • 只是提醒您,您可以接受自己的答案 (blog.stackoverflow.com/2009/01/accept-your-own-answers)。这会将其从“未答复”类别中删除。
    • “如果你的 webhook 抛出错误,Facebook 将暂时停止向你发送消息”对我来说是救命稻草
    【解决方案3】:

    另一件可以阻止某些响应发送到您的 webhook 的事情是消息类型在队列中被阻止。

    如果将特定类型的消息传递到您的 webhook,但在 20 秒内未收到它的 200 响应,它将继续尝试再次向您发送该消息数小时。

    更重要的是,facebook messenger 将停止向您发送任何该类型的消息,直到第一个消息被确认为止。它基本上将它们放入队列中。

    在此期间,其他消息类型将继续正常发送。

    当我不小心在我的代码中引入了一个处理标准消息的未声明变量时,这发生在我身上。这意味着回发消息都可以正常工作,但快速回复和正常消息永远不会发送到我的 webhook。一旦您修复了错误,它们就会立即堆积如山。

    正如其他人所提到的,使用诸如 POSTMAN 之类的服务向您的 webhook 发送消息是发现此类错误的好方法,否则,messenger 只会默默地失败。

    【讨论】:

    • 嘿!非常感谢!你拯救了我的一天!花了 10 多个小时处理一个 messenger API 问题,看到你的回答,意识到我的消息一直被 FB 阻止,因为我没有回复状态码 200。
    • 如何让 Messenger 恢复触发队列?似乎队列被卡住了,webhook 没有触发任何其他事件。修复代码后,有什么方法可以让 Messenger “重试”?
    • @Marchy 它应该已经继续在您的应用程序中触发这些请求。您无需执行任何操作即可告诉它重试。很可能它没有得到令人满意的 200 响应。我怀疑它最终会放弃,但那时将不再有队列,也不会被阻止。看看您是否可以复制 facebook 发送到您的 webhook 的内容并使用 CURL 或邮递员自己发送并检查响应。我怀疑还是有错误。
    • 我的应用程序正在运行,很可能有些消息被卡在队列中。偶尔会收到一两条消息。如何杀死这些消息以便至少发送新消息?
    【解决方案4】:

    如果您使用框架,则从 CSRF 验证中排除您的 bot rout 会有所帮助。这对我有帮助(Laravel 5.4,app/Http/Middleware/VerifyCsrfToken.php):

    protected $except = [
            '/your_bot_route'
        ];
    

    【讨论】:

      【解决方案5】:

      几天前我在开发机器人时也遇到了同样的问题。按照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);
              }
      
          }
      

      注意 :确保应用程序页面中的用户角色能够从网络钩子中获取响应。我设置了管理员和测试者用户。只有那里能够得到回应。其他用户将在此发布后获得。另外,相应地更改验证令牌和页面令牌。

      在发布应用程序时,系统会询问有关此机器人将要使用的业务数量的选项。但我不知道如何使用它。不过仍在搜索。

      【讨论】:

        【解决方案6】:

        如果您仍然无法解决问题,请尝试检查并更新您的隐私政策链接。

        我更新了隐私政策的担忧链接,即使 webhoob 已验证,Facebook 也会显示 404 错误...

        【讨论】:

          【解决方案7】:

          您可以在 Messenger 设置的添加或删除页面选项卡下将多个页面链接到您的应用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-25
            • 1970-01-01
            • 2016-08-04
            • 1970-01-01
            • 2016-11-09
            • 2016-08-11
            • 2016-10-12
            • 2017-01-28
            相关资源
            最近更新 更多