Alexa技能开发:如何将动态生成的二维码作为图像返回给用户
最优实现方案
Alexa标准卡片不支持base64格式的图像,仅接受可公网访问的HTTPS URL,因此你需要将动态生成的二维码先上传到可公开访问的存储服务,再返回对应的URL即可。最适配你现有AWS技术栈的方案是搭配S3存储实现,步骤如下:
- 给你的Lambda执行角色添加S3写入权限,提前创建一个用于存放二维码的S3存储桶,配置桶的公共访问权限(或使用S3预签名URL,避免公开桶配置),也可以给桶加生命周期规则,自动删除超过1天的二维码文件节省存储成本
- 安装所需依赖,除了现有的
qrcode库外,Lambda运行环境默认内置aws-sdk,不需要额外打包上传 - 修改意图处理逻辑,生成二维码后上传到S3,拿到URL后传入responseBuilder即可
完整代码示例
const AWS = require('aws-sdk'); const QRCode = require('qrcode'); // 配置S3实例 const s3 = new AWS.S3({ region: '你的S3桶所在区域', }); const S3_BUCKET_NAME = '你创建的S3桶名'; const LaunchRequest_Handler = { canHandle(handlerInput) { const request = handlerInput.requestEnvelope.request; return request.type === 'LaunchRequest'; }, async handle(handlerInput) { const responseBuilder = handlerInput.responseBuilder; const say = '欢迎使用本技能'; // 从DynamoDB查询得到要生成二维码的字符串 const stringToCreateQRWith = "8306e21d-0c9e-4465-91e9-0cf86fca110d"; // 1. 生成二维码buffer,尺寸适配Alexa卡片要求(小图推荐720*480px,大图推荐1200*800px) const qrBuffer = await QRCode.toBuffer(stringToCreateQRWith, { width: 720, margin: 2 }); // 2. 上传到S3 const fileName = `qr-${Date.now()}.png`; await s3.putObject({ Bucket: S3_BUCKET_NAME, Key: fileName, Body: qrBuffer, ContentType: 'image/png', ACL: 'public-read' // 用预签名URL的话可删除该行 }).promise(); // 3. 拿到二维码URL,也可调用s3.getSignedUrl生成预签名URL const qrImageUrl = `https://${S3_BUCKET_NAME}.s3.${AWS.config.region}.amazonaws.com/${fileName}`; // 4. 返回响应 return responseBuilder .speak(say) .withStandardCard("欢迎使用", "扫描下方二维码查看内容", qrImageUrl, qrImageUrl) .reprompt('请说出你需要的操作') .getResponse(); } }
可选轻量方案
如果你的二维码内容不涉及敏感信息,不想额外维护S3存储,也可以直接使用公开二维码生成服务的动态拼接URL,无需自行生成和存储二维码:
const stringToCreateQRWith = "8306e21d-0c9e-4465-91e9-0cf86fca110d"; const qrImageUrl = `https://api.qrserver.com/v1/create-qr-code/?size=720x720&data=${encodeURIComponent(stringToCreateQRWith)}`;
直接将上述URL传入withStandardCard方法即可。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

