Как персонализировать push-уведомления AoG с помощью пользовательских данных - PullRequest
0 голосов
/ 19 февраля 2019

Я реализовал действие AoG, которое отправляет push-уведомления (https://developers.google.com/actions/assistant/updates/notifications). У меня одно push-уведомление, т.е. я однажды запрашивал разрешение пользователя + у меня был один обработчик намерений Aog для пользовательских уведомлений. Проблема в том, что я хочу использовать push-уведомлениеуведомления в другом контексте, поэтому мне нужно передать некоторую пользовательскую нагрузку при создании push-уведомлений, чтобы я мог в обработчике намерений определить, что такое контекст и как с ним работать.

Очевидным решением является настройка нескольких push-уведомлений.с разными пользовательскими намерениями, обрабатывающими его, но для этого требуется запросить разрешение для каждого из них в отдельности, что неприемлемо из-за опыта конечного пользователя.

Я пытался применить такой же подход, как и репо https://github.com/actions-on-google/actionssdk-updates-nodejs/blob/master/functions/aog-webhook.jsдля ежедневных обновлений AoG, т. е. при регистрации обновления добавление параметра:

arguments: [{name: Parameters.CATEGORY, textValue: category}]

и последующая запись в обработчик намерений

function tellRandomTip(conv, category) {
  console.log('tellRandomTip for category - ' + category);
  return getRandomTip(category)
  .then(renderTip.bind(null, conv))
  .then(() => {
    if (!conv.user.storage[DAILY_NOTIFICATION_ASKED]) {
      conv.ask(new Suggestions(DAILY_NOTIFICATION_SUGGESTION));
      conv.user.storage[DAILY_NOTIFICATION_ASKED] = true;
    }
  });
}

к сожалению, это не работает, параметр никогда не передается

Мой орудиеДействие выглядит следующим образом:

определение намерения с включенным push-уведомлением

  {
    "description": "Generic AoG push command intent",
    "name": "AoG Push",
    "fulfillment": {
      "conversationName": "myhome-cc-google-assistant"
    },
    "intent": {
      "name": "custom.intent.AoGPush",
      "parameters": [{
        "name": "commandText",
        "type": "org.schema.type.Text"
      }],
      "trigger": {
        "queryPatterns": [
          "$org.schema.type.Text:commandText"
        ]
      }
    }
  }   

Запрос разрешения следующим образом

this.conv.ask(
 new UpdatePermission({
   intent: 'custom.intent.AoGPush',
   arguments: [{
   name: 'commandText',
   textValue: 'list sections' 
 }]
})

Обработка намеренного обработчика, когда пользователь нажимает на уведомление

  async aogPushHandler (conv: ActionsSdkConversation, commandText: string) {  
      // do something with custom payload in commandText
     // unfortunatelly commandText is always empty/undefined! 
  }

Наконец отправка push-уведомления из кода

        const jwtClient = new google.auth.JWT(
            config.pushAoG.clientEmail, undefined, config.pushAoG.privateKey,
            ['https://www.googleapis.com/auth/actions.fulfillment.conversation'],
            undefined
        )

        const tokens: Credentials = await jwtClient.authorize()
        // code to retrieve target userId and intent
        const notifPayload = {
            userNotification: {
                title: title,
            },
            target: {
                userId: userId,
                intent: 'custom.intent.AoGPush',
                locale: locale
            }
        }

        const httpClient = new HttpClient()

        const payload = {
            customPushMessage: notifPayload
        }
        const bearer = 'Bearer ' + tokens.access_token

        const headers = { Authorization: bearer }
        await httpClient.sendPost('https://actions.googleapis.com/v2/conversations:send', payload, headers)
        logger.debug('push notification sent for user ' + userId)

Есть ли способ, как я могу поместить пользовательскую полезную нагрузку при отправке уведомления и затем извлечь ее в свой обработчик намерений (aogPushHandler)?Когда я пытался добавить произвольную пользовательскую полезную нагрузку в notifPayload выше, я получаю HTTP 400, кажется, что Google выполняет строгую проверку данных, передаваемых в полезной нагрузке, во время отправки push-уведомления.

...