Alexa — Как отправить изображение пользователю?

#node.js #amazon-web-services #aws-lambda #alexa #alexa-skill

Вопрос:

Я использую функцию Лямбда для своего навыка Alexa. Для моего намерения запуска я запрашиваю DynamoDB и возвращаю строку, которую я сначала хочу преобразовать в QR-код, а затем я хочу вернуть ее на устройство Alexa в виде изображения внутри responseBuilder

Alexa отлично работает, отображая изображения с внешних URL-адресов, таких как

const rabbitImage = "https://i.imgur.com/U6eF0oH.jpeg";

 return responseBuilder
        .speak(say)
        .withStandardCard("Welcome to Alexa", "description", rabbitImage, rabbitImage)
        .reprompt('try again, '   say)
        .getResponse();
 

Но я застрял на том, как отправить QR-код обратно на устройство Alexa в responseBuilder .

Я использую nodejs библиотеку под названием qrcode , которая может преобразовать строку в QR-код, а затем в base64 .

https://www.npmjs.com/package/qrcode

Но , согласно документам Alexa для отправки a "card" aka image , обратно пользователю это должен быть URL-адрес.

https://developer.amazon.com/en-US/docs/alexa/custom-skills/include-a-card-in-your-skills-response.html

 The Alexa Skills Kit provides different types of cards:

A Standard card also displays plain text, but can include an image. You provide the text for the title and content, and the URL for the image to display.
 

Поэтому я не уверен, будет ли base64 сгенерированная qrcode библиотека работать в этом случае.

Каков наилучший способ отправить динамически сгенерированный QR-код обратно на устройство Alexa в качестве ответа в этом сценарии?

 const LaunchRequest_Handler = {
    canHandle(handlerInput) {
      const request = handlerInput.requestEnvelope.request;
      return request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
      const responseBuilder = handlerInput.responseBuilder;


      //Perform query to DynamoDB

      var stringToCreateQRWith = "8306e21d-0c9e-4465-91e9-0cf86fca110d";

      //Generate qr code and send back to user here
      //???Unsure how to do and what format to send it in
      var qrImageToSendToUser = ???

      return responseBuilder
        .speak(say)
        .withStandardCard("Welcome to Alexa", "description", qrImageToSendToUser , qrImageToSendToUser )
        .reprompt('try again, '   say)
        .getResponse();

    }

 

Комментарии:

1. Я бы, вероятно , даже не преобразовал его в base64, а скорее png загрузил это изображение в корзину S3 с открытым разрешением (что позволит вам использовать http-ссылку для каждого сохраненного объекта) и использовать эту ссылку для ссылки на изображение. Имейте в виду, что это не очень безопасное решение, технически все ваши QR-коды доступны в общедоступном Интернете! Однако, насколько я понимаю из приведенной документации, изображения в любом случае действительны только по URL-адресу, так что это может быть общей проблемой для вашего варианта использования.

2. Поскольку вы создаете QR-код, вам, вероятно, захочется использовать предварительно подписанный URL-адрес для защиты содержимого QR-кода и предотвращения сканирования любого qr-кода, который вы создаете, в открытой корзине S3. Таким образом, ваш процесс будет состоять в том, чтобы сгенерировать QR-код, загрузить файл изображения в S3, сгенерировать предварительно подписанный URL-адрес, а затем отправить предварительно подписанный URL-адрес Alexa. Информация о предварительно подписанных URL-адресах: boto3.amazonaws.com/v1/documentation/api/latest/guide/…

Ответ №1:

Как предложил @kopaka, это правильный путь. Нет никакого способа обойти это.

В соответствии с документацией

Это несколько вещей, которые вам нужно иметь в виду.

На самих изображениях вы захотите создать 2 изображения с 720px x 480px помощью и 1200px x 800px . Чтобы убедиться, что они хорошо отображаются на нескольких экранах разного размера. В противном случае они не гарантируют наилучший опыт для вашего пользователя, так как они могут масштабировать изображение вверх/вниз по размеру.

При выборе хранилища вам необходимо убедиться, что вы можете обслуживать эти изображения с помощью Https действительного ssl-сертификата, которому доверяет Amazon, и с его помощью.