切换协议没有传递线程所有权 - 但它带来了“成功”响应 - 看起来像Bug

问题描述 投票:0回答:1

我正在尝试为我的messenger机器人实现Messenger切换协议,但Pass_Thread_Control没有将所有权从主接收器移交给辅助接收器(收件箱)。

在打开这个帖子之前,我尝试了不同组合的100多次。当用户点击“传递到收件箱”快速回复时,僵尸程序(与Python集成的Dialogflow)启动Webhook并执行以下操作:

  1. 获取Facebook页面 - 辅助接收器(收件箱)ID和线程所有者响应(通常主接收器[FB App]是线程所有者)
  2. 使用适当的输入执行Graph API Pass_Thread_Control {“success”:true}
  3. 再次调用Graph API线程所有者并发现主接收者仍然是线程所有者(而它应该是应该是线程所有者的辅助接收者)

因此,用户消息未自动从Facebook页面“完成”文件夹传输到“收件箱”。

其他配置:[1] FB页面订阅FB App [2]为FB页面选择的事件:消息,messaging_postbacks,messaging_handovers,standby,messaging_policy_enforcement [3] FB页面 - >主接收器:FB APP,辅助接收器:页面收件箱

def human_control(req):

# GET ID OF INCOMING USER FROM WEBHOOK
id=req.get('originalDetectIntentRequest').get('payload').get('data').get('sender').get('id')

# CURRENT THREAD OWNER (BEFORE PASS_THREAD_CONTROL RUNS)

current_thread_owner = "https://graph.facebook.com/v2.6/me/thread_owner?recipient=" + id + "&access_token=" + ACCESS_TOKEN
result = urllib.request.urlopen(current_thread_owner).read()

# PASS_THREAD_CONTROL JSON Parameters:

target_payload = {
   "recipient": {"id": id},
   "target_app_id": "263902037430900",
   "metadata": req.get('queryResult').get('queryText') 
   }

# PASS_THREAD_CONTROL - To Secondary Inbox - via Graph API call
# BELOW FORMAT WORKS ONLY IN PYTHON & BRINGS SUCCESS
# FB SUGGESTED WAY: https://developers.facebook.com/docs/messenger-platform/handover-protocol/pass-thread-control

pass_control_result = requests.post("https://graph.facebook.com/v2.6/" + id + "?pass_thread_control&access_token=" + ACCESS_TOKEN, params=target_payload)

# CURRENT THREAD OWNER (BEFORE PASS_THREAD_CONTROL RUNS)

current_thread_owner = "https://graph.facebook.com/v2.6/me/thread_owner?recipient=" + id + "&access_token=" + ACCESS_TOKEN
result = urllib.request.urlopen(current_thread_owner).read()

res = { 
    "payload": {
        "facebook": {
           "text": "Wait a while. Our Admin will be in touch shortly.",
           "quick_replies": [
             {
              "content_type": "text",
              "title": "Back to Bot",
              "payload": "Back to Bot",
             }
          ]
       }
   },
 };
res = json.dumps(res, indent=4)
print (res)
r = make_response(res)
r.headers['Content-Type'] = 'application/json'
return r 

预期结果 - >

  1. 当前线程所有者(通过线程调用之前) - > 214020109069642(作为主接收器的FB应用程序)----> {'data':[{'thread_owner':{'app_id':'214020109069642'}}]}
  2. 传递线程控制---> {“成功”:true}
  3. 再次当前线程所有者---> 263902037430900(FB页面收件箱ID)。辅助接收器应接管主接收器的角色
  4. 传递线程控制JSON Payload应存在于Webhook响应中

实际结果 - >

  1. 当前线程所有者(通过线程调用之前) - > 214020109069642(作为主接收器的FB应用程序){'data':[{'thread_owner':{'app_id':'214020109069642'}}]} ---->正确
  2. 传递线程控制---> {“成功”:真} - >正确
  3. 再次当前线程所有者---> 214020109069642(FB应用程序ID)####运行通过线程控制API后,SECONDARY RECEIVER ID:263902037430900 | NAME:页面收件箱 - >错误
  4. 传递线程控制JSON Payload应该存在于Webhook响应 - > Not Coming中
python-3.x facebook-graph-api flask
1个回答
0
投票

我想我已经解决了这个问题。这不是一个错误。而是一个参数没有传递(标题)在这里导致错误的响应。我很抱歉这样一个愚蠢的错误(浪费了3天)。以下是正确的语法:

headers = {'Content-type': 'application/json'}

target_payload = {
"recipient": {"id": id},
"target_app_id": target_inbox_id ,
"metadata": req.get('queryResult').get('queryText')
}

pass_control_result = requests.post("https://graph.facebook.com/v3.2/me/pass_thread_control?access_token=" + ACCESS_TOKEN, data=json.dumps(target_payload), headers=headers)

只需一个查询:一旦机器人待命(人与来自Inbox的用户交谈),它就没有响应聊天命令来控制线程(例如:如果用户点击“返回僵尸”按钮,机器人在待机状态下保持静音模式&没有进一步生成webhook响应)。

只有“标记完成”单击才能再次启用僵尸程序。有没有办法用户可以再次调用bot的线程控制(没有管理员点击“标记完成”)?由于它没有响应任何命令,因此调用“Request Thread Owner”或“Take Thread Control”API也不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.