Протокол передачи обслуживания не передает владение потоком - но он приносит ответ "успеха" - похоже на ошибку - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь реализовать протокол передачи сообщений Messenger для моего бота-мессенджера, но Pass_Thread_Control не передает права владения из основного приемника во вторичный приемник (входящие).

Я пробовал более 100 раз с разными комбинациями, прежде чем открывать эту тему. Когда пользователь нажимает на быстрый ответ «Перейти в папку« Входящие »», бот (Dialogflow, интегрированный в Python) запускает Webhook и делает следующее:

  1. Получить страницу Facebook - ID вторичного получателя (Входящие) и ответ владельца потока (в основном Основной получатель [FB App] является владельцем потока)
  2. Выполнить API-интерфейс Graph Pass_Thread_Control с правильными входными данными {"success": true}
  3. Снова вызовите владельца потока API-интерфейса Graph и обнаружите, что основной приемник по-прежнему является владельцем потока (тогда как это должен быть вторичный приемник, который должен быть владельцем потока)

В результате пользовательское сообщение не было автоматически перенесено из папки «Готово» на странице Facebook в «Входящие».

Другая конфигурация: [1] Страница FB подписана на приложение FB [2] События, выбранные для страницы FB: сообщения, messaging_postbacks, messaging_handovers, standby, messaging_policy_enforcement [3] Страница FB -> Основной получатель: приложение FB, Дополнительный получатель: Входящие страницы

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. Pass Thread Control ---> {"success": true}

  3. Снова текущий владелец темы ---> 263902037430900 (идентификатор папки входящих на странице FB). Вторичный получатель должен взять на себя роль основного получателя

  4. Pass Thread Control JSON Полезная нагрузка должна присутствовать в ответе Webhook

Фактический результат ->

  1. Текущий владелец потока (до вызова потока передачи) -> 214020109069642 (приложение FB, являющееся основным получателем) {'data': [{'thread_owner': {'app_id': '214020109069642'}}]} ----> Исправить

  2. Пропустить управление потоком ---> {"success": true} -> Correct

  3. Снова текущий владелец потока ---> 214020109069642 (идентификатор приложения FB) #### После запуска Pass API управления потоком, идентификатор ВТОРИЧНОГО ПОЛУЧАТЕЛЯ: 263902037430900 | ИМЯ: Входящие страницы -> Неправильно

  4. Передать управление потоком JSON Полезная нагрузка должна присутствовать в ответе Webhook -> Not Coming

1 Ответ

0 голосов
/ 04 января 2019

Я думаю, что решил проблему. Это не ошибка. Скорее параметр не передавал (заголовки) здесь, вызывая неправильный ответ здесь. Я извиняюсь за такую ​​глупую ошибку (и потратил 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)

Всего один запрос: Когда бот находится в режиме ожидания (человек общается с пользователем из папки «Входящие»), он не отвечает на команду чата, чтобы получить контроль над нитью (например: если пользователь нажимает кнопку «Назад к боту», бот молчит в режиме ожидания и нет веб-крюка) ответ генерируется дальше).

Только клик «Пометить как выполнено» снова включает бота. Есть ли какой-нибудь способ, которым пользователь может снова вызвать бот-контроль (без кликов администратора на «Пометить как выполненное»)? Поскольку он не отвечает ни на какую команду, вызов API-интерфейса «Запросить владельца потока» или «Взять управление потоком» также не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...