Действия в Google - Push-уведомления на C #

Я пытаюсь получить базовое push-уведомление, отправленное моему действию.

Я получаю токен доступа как таковой

    private static async Task<string> GetAccessTokenFromJsonKeyAsync(string jsonKeyFilePath, params string[] scopes)
    {
        using (var stream = new FileStream(jsonKeyFilePath, FileMode.Open, FileAccess.Read))
        {
            return await GoogleCredential
                .FromStream(stream) // Loads key file  
                .CreateScoped(scopes) // Gathers scopes requested  
                .UnderlyingCredential // Gets the credentials  
                .GetAccessTokenForRequestAsync(); // Gets the Access Token  
        }
    }

который возвращает мне токен доступа.

Затем я отправляю следующее уведомление

{
    "customPushMessage": {
        "userNotification":{
            "title":"Notification Title"
        },
        "target":{
             "userId":"ID_FROM_UPDATES_USER_ID",
             "intent":"Notification Intent",
             "locale":"en-US"
        }
    }
}

используя следующий код

        try
        {
            var accessToken = await GetAccessTokenFromJsonKeyAsync("key.json", "https://www.googleapis.com/auth/actions.fulfillment.conversation");

            var serialized = JsonConvert.SerializeObject(proactiveMessage);
            var payload = "{\"customPushMessage\": " + serialized + "}";

            // Wrap our JSON inside a StringContent which then can be used by the HttpClient class
            var httpContent = new StringContent(payload, Encoding.UTF8, "application/json");

            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

            var httpResponseMessage = await _httpClient.PostAsync("https://actions.googleapis.com/v2/conversations:send", httpContent);

            Debug.WriteLine(httpResponseMessage.IsSuccessStatusCode ? "Successfully sent notification message." : $"Failed to send notification message with {httpResponseMessage.StatusCode}.");

            return httpResponseMessage;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Alexa API Service: Failed to send notification message with exception: {ex.Message}");
            return new HttpResponseMessage(HttpStatusCode.BadRequest);
        }

Я получаю код ответа 403 Forbidden.

Я не уверен, что код токена доступа неверен, неверна структура уведомлений или что-то еще отсутствует.


person NiteLordz    schedule 28.09.2018    source источник
comment
Есть ли текст в коде ответа? Иногда (хотя и не всегда) существует тело JSON, которое дает дополнительную информацию. И просто для смеха попробуйте Bearer с большой буквы.   -  person Prisoner    schedule 29.09.2018
comment
У меня было две проблемы. Во-первых, у меня не было нужной полезной нагрузки разрешения (отсутствовало (использовалось это - stackoverflow.com/questions/50725790/ - чтобы исправить эту проблему). Вторым было" b "на носителе. Теперь я получаю 200 откликается, когда я отправляю уведомление, однако на самом деле я не получаю уведомление на свой телефон. Есть мысли?   -  person NiteLordz    schedule 29.09.2018
comment
Поскольку мы прошли через ошибку аутентификации, я бы посоветовал вам задать этот новый вопрос с подробностями о том, как вы получили разрешение, что вы в данный момент отправляете и что происходит.   -  person Prisoner    schedule 29.09.2018
comment
Спасибо сделаю   -  person NiteLordz    schedule 29.09.2018
comment
Также неясно, как вы исправили другую проблему - я предлагаю вам опубликовать ее как подробный ответ, а не как комментарий.   -  person Prisoner    schedule 29.09.2018
comment
Спасибо, NiteLordz и @Prisoner получили push-уведомление, быстро работающее с веб-перехватчика C #, благодаря инструкциям на этой странице. Однако пользовательский опыт довольно плачевный. Уведомление приходит на мой телефон бесшумно, микроскопический значок сверху, невидимый на экране блокировки, вам нужно провести пальцем вниз, чтобы увидеть и щелкнуть по нему. Есть ли способ улучшить оповещение? Эти голосовые приложения предназначены для использования во время вождения или приготовления пищи, такое уведомление бесполезно. Лучше попросить моего пользователя периодически проверять голосом Есть новости для меня ?. Заходите в Google, можно лучше ... Есть мысли / советы?   -  person Anton M    schedule 19.01.2019


Ответы (2)


Тип токена должен быть "на предъявителя" с заглавной буквой B. Таким образом, эта строка должна быть

_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
person Prisoner    schedule 29.09.2018

Я неправильно запрашивал разрешение. Это предоставило недостающий кусок головоломки для меня.

Нужен был

        "updatePermission": {
            "intent": "notification.simple.text"
        }
person NiteLordz    schedule 29.09.2018