Я реализовал действие 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-уведомления.