معرفی
در این مقاله در مورد مهارت های الکسای سفارشی، من قصد دارم نحوه دریافت شماره موبایل کاربر برای استفاده در مهارت الکسای سفارشی در سرور node.js میزبانی شده Alexa را نشان دهم. برای آن، من یک مهارت الکسا سفارشی به نام اطلاعات کاربر ایجاد خواهم کرد. با کمک این مهارت، کاربران میتوانند از الکسا شماره موبایل کاربر را بخواهند تا در مهارت الکسای سفارشی استفاده شود و الکسا شماره موبایل کاربر را از حساب آمازون مرتبط با آن مهارت خاص الکسا دریافت میکند و شماره موبایل را به عنوان بخشی از اطلاعات برمیگرداند. در مورد کاربر
کاربران میتوانند با گفتن برخی از جملات نمونه مانند «شماره موبایل من چیست» شماره موبایل را از الکسا بخواهند، الکسا با واکشی و درخواست شماره موبایل کاربر پاسخ میدهد. الکسا همچنین میتواند با درخواست لطفاً مجوزهای نمایه را از برنامه الکسا آمازون فعال کنید. کد پشتیبان مورد نیاز برای کار مهارت الکسا در یک تابع لامبدا در داخل کنسول توسعه دهنده آمازون ذخیره می شود.
ایجاد مهارت الکسا
برای ایجاد یک مهارت جدید، ابتدا باید وارد کنسول توسعه دهنده الکسا شویم. سپس باید نام مهارت منحصر به فرد را ذکر کنیم و زبان پیش فرض را با توجه به موقعیت مکانی خود انتخاب کنیم.
پس از آن می توانیم مدلی را انتخاب کنیم تا به مهارت خود بیافزاییم. برای ایجاد یک مهارت سفارشی، می توانیم مدل سفارشی را انتخاب کنیم.
![](http://pezhvak24.ir/dl/codenevis/firstcode/article/getting-mobile-number-in-an-alexa-skill/Images/custom.jpg)
همچنین میتوانیم روش یا الگوی را برای میزبانی کد پشتیبان مهارت در داخل تابع لامبدا انتخاب کنیم.
![](http://pezhvak24.ir/dl/codenevis/firstcode/article/getting-mobile-number-in-an-alexa-skill/Images/node.jpg)
میتوانیم الگوی node.js میزبان الکسا یا پایتون را انتخاب کنیم. همچنین میتوانیم نقطه پایانی یا سرور خود را برای ذخیره منابع پشتیبان برای مهارتهای الکسا مورد نیاز ذکر کنیم.
مرحله بعدی انتخاب یک قالب برای افزودن به مهارت است که بعداً مطابق نیاز خود آن را سفارشی می کنیم و روی دکمه ایجاد مهارت کلیک می کنیم.
اکنون که یک مهارت ایجاد شده است، باید تنظیماتی را در پیشانی مهارت ایجاد کنیم. در حال حاضر من قصد دارم، اسلات ها، و انواع اسلات سفارشی برای ایجاد پیشانی مهارت ایجاد کنم. ابتدا باید نام فراخوان را ذکر کنیم. کاربران برای شروع تعامل با یک مهارت سفارشی خاص، نام فراخوانی یک مهارت را میگویند.
![](http://pezhvak24.ir/dl/codenevis/firstcode/article/getting-mobile-number-in-an-alexa-skill/Images/invocation.jpg)
حالا باید قصد ایجاد کنیم.
![](http://pezhvak24.ir/dl/codenevis/firstcode/article/getting-mobile-number-in-an-alexa-skill/Images/mobileintent.jpg)
در اینجا، من یک intent جدید به نام MobileIntent را به همراه چند عبارات نمونه مانند شماره موبایل، شماره موبایل من و شماره موبایل من اضافه کرده ام. هیچ اسلات و انواع اسلات سفارشی برای این مهارت الکسا تعریف نشده است.
پس از ایجاد یک مدل برای یک مهارت خاص، می توانیم با کلیک بر روی دکمه ذخیره مدل و ساخت مدل در بالا، مدل را ذخیره و بسازیم.
کد Json برای frontend فوق به شرح زیر است:
- {
- "interactionModel": {
- "languageModel": {
- "invocationName": "contact info",
- "intents": [
- {
- "name": "AMAZON.NavigateHomeIntent",
- "samples": []
- },
- {
- "name": "AMAZON.CancelIntent",
- "samples": []
- },
- {
- "name": "AMAZON.HelpIntent",
- "samples": []
- },
- {
- "name": "AMAZON.StopIntent",
- "samples": []
- },
- {
- "name": "MobileIntent",
- "slots": [],
- "samples": [
- "mobile",
- "phone",
- "mobile number",
- "what is my mobile number",
- "what is my phone number"
- ]
- }
- ],
- "types": []
- }
- }
- }
ایجاد منبع Backend برای مهارت الکسا
برای ایجاد کد باطن در داخل تابع لامبدا، میتوانیم داخل فایل index.js node.js کد بنویسیم. کد مهارت الکسای سفارشی به شرح زیر است:
- const Alexa = require('ask-sdk-core');
- const messages = {
- NOTIFY_MISSING_PERMISSIONS: 'Please enable profile permissions in the Amazon Alexa app.',
- ERROR: 'Uh Oh. Looks like something went wrong.'
- };
- const MOBILE_PERMISSION = "alexa::profile:mobile_number:read";
- const LaunchRequestHandler = {
- canHandle(handlerInput) {
- return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
- },
- handle(handlerInput) {
- const speechText = `Hello. You can say: what's my mobile number.`;
- const reprompt = `say: what's my mobile number.`;
- return handlerInput.responseBuilder
- .speak(speechText)
- .reprompt(reprompt)
- .getResponse();
- },
- };
- const MobileIntentHandler = {
- canHandle(handlerInput) {
- return handlerInput.requestEnvelope.request.type === 'IntentRequest'
- && handlerInput.requestEnvelope.request.intent.name === 'MobileIntent';
- },
- async handle(handlerInput) {
- const { serviceClientFactory, responseBuilder } = handlerInput;
- try {
- const upsServiceClient = serviceClientFactory.getUpsServiceClient();
- const profileMobileObject = await upsServiceClient.getProfileMobileNumber();
- if (!profileMobileObject) {
- const errorResponse = `It looks like you are not having a mobile number set. You can set your mobile number from the companion app.`
- return responseBuilder
- .speak(errorResponse)
- .getResponse();
- }
- const profileMobile = profileMobileObject.phoneNumber;
- const speechResponse = `Your mobile number is, ${profileMobile}`;
- return responseBuilder
- .speak(speechResponse)
- .getResponse();
- } catch (error) {
- console.log(JSON.stringify(error));
- if (error.statusCode === 403) {
- return responseBuilder
- .speak(messages.NOTIFY_MISSING_PERMISSIONS)
- .withAskForPermissionsConsentCard([MOBILE_PERMISSION])
- .getResponse();
- }
- console.log(JSON.stringify(error));
- const response = responseBuilder.speak(messages.ERROR).getResponse();
- return response;
- }
- },
- }
- const HelpIntentHandler = {
- canHandle(handlerInput) {
- return handlerInput.requestEnvelope.request.type === 'IntentRequest'
- && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent';
- },
- handle(handlerInput) {
- const speechText = 'You can say hello to me!';
- return handlerInput.responseBuilder
- .speak(speechText)
- .reprompt(speechText)
- .withSimpleCard('Hello World', speechText)
- .getResponse();
- },
- };
- const CancelAndStopIntentHandler = {
- canHandle(handlerInput) {
- return handlerInput.requestEnvelope.request.type === 'IntentRequest'
- && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent'
- || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent');
- },
- handle(handlerInput) {
- const speechText = 'Goodbye!';
- return handlerInput.responseBuilder
- .speak(speechText)
- .getResponse();
- },
- };
- const SessionEndedRequestHandler = {
- canHandle(handlerInput) {
- return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
- },
- handle(handlerInput) {
- console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);
- return handlerInput.responseBuilder.getResponse();
- },
- };
- const ErrorHandler = {
- canHandle() {
- return true;
- },
- handle(handlerInput, error) {
- console.log(`Error handled: ${error.message}`);
- return handlerInput.responseBuilder
- .speak('Sorry, I can't understand the command. Please say again.')
- .reprompt('Sorry, I can't understand the command. Please say again.')
- .getResponse();
- },
- };
- const skillBuilder = Alexa.SkillBuilders.custom();
- exports.handler = skillBuilder
- .addRequestHandlers(
- LaunchRequestHandler,
- MobileIntentHandler,
- HelpIntentHandler,
- CancelAndStopIntentHandler,
- SessionEndedRequestHandler
- )
- .addErrorHandlers(ErrorHandler)
- .withApiClient(new Alexa.DefaultApiClient())
- .lambda();