如何在Alexa中检索用户的名字

时间:2018-10-25 08:13:42

标签: alexa alexa-skills-kit alexa-voice-service

我正在创建alexa应用,为此,我有权使用用户的位置和客户的名字。我的第一个问题是客户的名字是用户的名字,还是不同的名字。但是,如果要输入用户的名字,那么请先获取该名字。对于位置信息,我们使用ConsentToken,是否有任何方法可以删除用户名?

我可以询问用户名并存储它,然后可以问候用户。但是我必须问用户每次启动该应用程序。我正在使用php。

2 个答案:

答案 0 :(得分:0)

首先,用户必须将其帐户与您的技能相关联并接受许可 (您需要在技能配置中进行设置)

用户登录后,您将只能使用访问/刷新令牌从Alexa输出中获取用户名

检查此内容,可能最清楚:https://developer.amazon.com/fr/docs/custom-skills/request-customer-contact-information-for-use-in-your-skill.html

答案 1 :(得分:0)

除了Neryuk's answer正确地指出文档之外,我还在NodeJS中提供了一些代码示例。

假设您已经从Alexa Skill Developer Portal授予了所有必需的权限,则可以通过以下方式在意向处理程序中要求用户信息:

const PERMISSIONS = ['alexa::profile:name:read', 'alexa::profile:email:read', 'alexa::profile:mobile_number:read'];

const MyIntentHandler = {
      canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        // checks request type
        return request.type === 'LaunchRequest'
          || (request.type === 'IntentRequest'
            && request.intent.name === 'MyIntent');
      },
      async handle(handlerInput) {
        const { requestEnvelope, serviceClientFactory, responseBuilder } = handlerInput;
        const requestAttributes = handlerInput.attributesManager.getRequestAttributes();

        const consentToken = handlerInput.requestEnvelope.context.System.apiAccessToken;
        if (!consentToken) {
          return responseBuilder
            .speak('Missing permissions')
            .withAskForPermissionsConsentCard(PERMISSIONS)
            .getResponse();
        }

        const client = serviceClientFactory.getUpsServiceClient();
        const userName = await client.getProfileName();
        const userEmail = await client.getProfileEmail();
        const userMobileNumber = await client.getProfileMobileNumber();

        console.log('Name successfully retrieved '+ userName);
        console.log('Email successfully retrieved '+ userEmail);
        console.log('PhoneNumber successfully retrieved '+ JSON.stringify(userMobileNumber));

        const speakOutput = 'The username is '+userName;
        return handlerInput.responseBuilder
          .speak(speakOutput)
          .withSimpleCard('MyFavSkill')
          .getResponse();
      },
    };

请注意,您必须将 handlerInput 代码声明为 async ,因为您正在调用异步请求,因此必须在方法内等待。 代码缺少“ try-catch”块以简化其读取,但是您应该管理意外的错误。 希望这会有所帮助。