Facebook Messenger 嵌套持久菜单错误

Posted

技术标签:

【中文标题】Facebook Messenger 嵌套持久菜单错误【英文标题】:Facebook Messenger Nested Persistent Menu Error 【发布时间】:2017-10-26 06:25:26 【问题描述】:

我正在尝试向我的聊天机器人添加一个 NESTED 持久菜单。 Facebook 限制为 3 个按钮,但您可以拥有最多 5 个按钮的嵌套按钮。

这是我运行代码时遇到的错误

响应正文错误

类型:'OAuthException',

错误: message: '(#100) 在参数“call_to_actions[0]”中发现无效键“call_to_actions”。',代码:100

这是我的代码:

function addPersistentMenu()
  request(
    url: "https://graph.facebook.com/v2.6/me/thread_settings",
    qs: access_token: token,
    method: "POST",
    json:
      setting_type : "call_to_actions",
      thread_state : "existing_thread",
      call_to_actions : [
        
          type: "nested",
          title: "Menu Item One",
          call_to_actions: [
            
              type: "postback",
              title: "Nested Item One",
              payload: "NESTED_ONE"
            ,
            
              type: "postback",
              title: "Nested Item Two",
              payload: "NESTED_TWO"
            
           ]
        ,
        
          type: "postback",
          title: "Menu Item Two",
          payload: "TWO"
        ,
        
          type: "postback",
          title: "Menu Item Three",
          payload: "THREE"
        
      ]
    
  , function(error, response, body) 
      if(error)
        console.log('sending error')
        console.log('Error sending messages: ', error)
      else if(response.body.error)
        console.log('response body error')
        console.log('Error: ', response.body.error)
      
   );

当我删除嵌套按钮时,会出现永久菜单,所以我不确定错误是什么。我的代码与 facebook 在persistent menu doc 中发布的示例非常相似。我正在使用托管在 heroku 上的 node.js 进行编程,我在 the code found here 之后建模了我的菜单功能。

问题:有没有人使用 nodejs webhook 使用 npm request 包向 messenger 发送请求?如何添加我的嵌套持久菜单,这个错误是什么意思?

编辑: 当我使用持久菜单文档中的确切命令通过终端使用直接 CURL POST 时,会添加嵌套的持久菜单。我不确定要在我的 nodejs webhook 版本中添加什么以使其正常工作。

这是 CURL 命令:

curl -X POST -H "Content-Type: application/json" -d '
  "persistent_menu":[
    
      "locale":"default",
      "composer_input_disabled":true,
      "call_to_actions":[
        
          "title":"My Account",
          "type":"nested",
          "call_to_actions":[
            
              "title":"Pay Bill",
              "type":"postback",
              "payload":"PAYBILL_PAYLOAD"
            ,
            
              "title":"History",
              "type":"postback",
              "payload":"HISTORY_PAYLOAD"
            ,
            
              "title":"Contact Info",
              "type":"postback",
              "payload":"CONTACT_INFO_PAYLOAD"
            
          ]
        ,
        
          "type":"web_url",
          "title":"Latest News",
          "url":"http://petershats.parseapp.com/hat-news",
          "webview_height_ratio":"full"
        
      ]
    ,
    
      "locale":"zh_CN",
      "composer_input_disabled":false
    
  ]
' "https://graph.facebook.com/v2.6/me/messenger_profile?access_token=YOUR_ACCESS_TOKEN_HERE"

【问题讨论】:

【参考方案1】:

Facebook Messenger API 已针对嵌套的持久菜单进行了更新。 'call_to_actions' 样式似乎仍然适用于非嵌套菜单。

不过,嵌套菜单需要不同的 API 调用。不同之处似乎是 URL 必须指向“messenger_profile”而不是“thread_settings”。出于某种原因,还需要一个“get_started”处理程序。最后,json 数组被命名为“persistent_menu”。

我在 gitub 上更新了示例 bot。键入“添加菜单”和“删除菜单”以查看永久菜单出现/消失。在某些浏览器上可能需要重新加载一两次页面。

这里有一些草率的 nodejs 代码应该可以解决问题。

  function addPersistentMenu()
 request(
    url: 'https://graph.facebook.com/v2.6/me/messenger_profile',
    qs:  access_token: PAGE_ACCESS_TOKEN ,
    method: 'POST',
    json:
  "get_started":
    "payload":"GET_STARTED_PAYLOAD"
   
 
, function(error, response, body) 
    console.log(response)
    if (error) 
        console.log('Error sending messages: ', error)
     else if (response.body.error) 
        console.log('Error: ', response.body.error)
    
)
 request(
    url: 'https://graph.facebook.com/v2.6/me/messenger_profile',
    qs:  access_token: PAGE_ACCESS_TOKEN ,
    method: 'POST',
    json:
"persistent_menu":[
    
      "locale":"default",
      "composer_input_disabled":true,
      "call_to_actions":[
        
          "title":"My Account",
          "type":"nested",
          "call_to_actions":[
            
              "title":"Pay Bill",
              "type":"postback",
              "payload":"PAYBILL_PAYLOAD"
            ,
            
              "title":"History",
              "type":"postback",
              "payload":"HISTORY_PAYLOAD"
            ,
            
              "title":"Contact Info",
              "type":"postback",
              "payload":"CONTACT_INFO_PAYLOAD"
            
          ]
        ,
        
          "type":"web_url",
          "title":"Latest News",
          "url":"http://foxnews.com",
          "webview_height_ratio":"full"
        
      ]
    ,
    
      "locale":"zh_CN",
      "composer_input_disabled":false
    
    ]
    

, function(error, response, body) 
    console.log(response)
    if (error) 
        console.log('Error sending messages: ', error)
     else if (response.body.error) 
        console.log('Error: ', response.body.error)
    
)


【讨论】:

谢谢!我尝试了节点 js 代码,但我不再看到我的开始按钮或菜单。我不再想那个错误信息了。并且发送的 JSON 响应只显示 "object": "Object" 而不是 "result": "Successfully added new_thread's CTA" 再试一次。没有做任何改变。刚刚删除了之前尝试添加的入门按钮和菜单 ID。它奏效了。 我注意到持久菜单缓存了它的状态。有时需要重新加载页面或重新启动应用程序才能看到更新

以上是关于Facebook Messenger 嵌套持久菜单错误的主要内容,如果未能解决你的问题,请参考以下文章

深度链接到 Facebook Messenger

Facebook Messenger 平台 ngrok

比微信落后了 Facebook Messenger上线移动支付

php Facebook Messenger聊天

html facebook messenger图标聊天

Facebook Messenger Delivery 回调随机丢失