移交协议未传递线程所有权-但它带来了“成功”响应-似乎是错误

Posted

技术标签:

【中文标题】移交协议未传递线程所有权-但它带来了“成功”响应-似乎是错误【英文标题】:Handover Protocol not passing thread ownership - But it brings "success" response - seems like Bug 【发布时间】:2019-01-02 07:14:57 【问题描述】:

我正在尝试为我的 Messenger 机器人实施 Messenger 移交协议,但 Pass_Thread_Control 并未将所有权从主要接收方移交给次要接收方(收件箱)。

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

    获取 Facebook 页面 - 次要接收者(收件箱)ID 和线程所有者响应(通常主要接收者 [FB 应用程序] 是线程所有者) 使用正确的输入 "success":true 执行 Graph API Pass_Thread_Control 再次调用Graph API Thread Owner,发现Primary Receiver仍然是线程所有者(而应该是Secondary Receiver,应该是线程所有者)

因此,用户消息不会自动从 Facebook 页面“完成”文件夹转移到“收件箱”。

其他配置: [1] FB Page 已订阅 FB App [2] 为 FB 页面选择的事件:messaging、messaging_postbacks、messaging_handovers、standby、messaging_policy_enforcement [3] FB Page --> Primary Receiver: FB APP, Secondary Receiver: Page Inbox

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 

预期结果-->

    当前线程所有者(通过线程调用之前)-> 214020109069642(FB 应用程序是主要接收者)----> 'data': ['thread_owner': 'app_id': '214020109069642']

    通过线程控制---> "success":true

    再次成为当前线程所有者 ---> 263902037430900(FB 页面收件箱 ID)。次要接收者应接替主要接收者的角色

    传递线程控制 JSON 有效负载应存在于 Webhook 响应中

实际结果 -->

    当前线程所有者(通过线程调用之前)-> 214020109069642(FB 应用程序是主要接收者) 'data': ['thread_owner': 'app_id': '214020109069642']---->正确

    通过线程控制 ---> "success":true--> 正确

    再次成为当前线程所有者 ---> 214020109069642(FB 应用程序 ID)####After 运行通过线程控制 API,辅助接收器 ID:263902037430900 | NAME: 页面收件箱 --> 错误

    传递线程控制 JSON 有效负载应该存在于 Webhook 响应中 --> 不来

【问题讨论】:

这对我来说很好用。您可能希望确保为您的调用使用当前的 API 版本(v2.6 已被弃用),但这可能不是您的实际问题的原因。除了确定当前线程所有者的调用之外,将线程控制传递给收件箱本身是否有效?将线程控制传递给收件箱后,您是否在收件箱文件夹中看到对话? 感谢拉斯的评论。我刚刚尝试使用 v3.2(之前也尝试过),但没有成功。结果和以前一样。我不知道我会怎么做。有效载荷也不是来自信使响应,这也很奇怪。 "pass_thread_control": "new_owner_app_id":"123456789", "metadata":"调用者要设置的附加内容" 【参考方案1】:

我想我已经解决了这个问题。这不是错误。而是没有在此处传递参数(标头),从而导致此处出现错误的响应。对于这样一个愚蠢的错误,我很抱歉(并为此浪费了 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)

只有一个查询: 一旦机器人待命(人类与收件箱中的用户交谈),它不会响应聊天命令来控制线程(例如:如果用户单击“返回机器人”按钮,机器人在待机模式下保持沉默且没有 webhook进一步生成响应)。

只有“标记为完成”点击才能再次启用机器人。 用户有什么方法可以再次通过机器人调用线程控制(无需管理员点击“标记为完成”)?由于它没有响应任何命令,调用“Request Thread Owner”或“Take Thread Control”API 也不起作用。

【讨论】:

以上是关于移交协议未传递线程所有权-但它带来了“成功”响应-似乎是错误的主要内容,如果未能解决你的问题,请参考以下文章

facebook messenger切换协议take_thread_control

数据未在 dio 中正确发送,颤动

数据未保存在会话变量中

http协议中各个响应状态返回值的含义

gcm推送通知:先成功,后IOS未注册

填充数据以控制另一页上的成功响应