我正在尝试为我的messenger机器人实现Messenger切换协议,但Pass_Thread_Control没有将所有权从主接收器移交给辅助接收器(收件箱)。
在打开这个帖子之前,我尝试了不同组合的100多次。当用户点击“传递到收件箱”快速回复时,僵尸程序(与Python集成的Dialogflow)启动Webhook并执行以下操作:
因此,用户消息未自动从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
预期结果 - >
实际结果 - >
我想我已经解决了这个问题。这不是一个错误。而是一个参数没有传递(标题)在这里导致错误的响应。我很抱歉这样一个愚蠢的错误(浪费了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也不起作用。