[PYTHON] L'histoire de la création d'une compétence (probablement) minimale qui implémente la personnalisation et la facturation des compétences

Eh bien, j'ai vu le twitter de Miso Tanaka et j'ai essayé de participer au calendrier de l'avent d'Alexa avec un grand élan, mais j'étais pressé car c'était juste avant l'événement sans préparer de matériel. ..

Je me demandais quoi faire, mais laissez-moi simplement en faire un article explicatif sur les compétences que j'ai récemment créées.

cible

――Je souhaite utiliser complètement la fonction de personnalisation --Je veux voir la source de la facturation en compétences en python --Je veux utiliser python avec ask cli

Est-ce un endroit comme ça?

Quoi dire

** «Mon père Noël» ** À propos des compétences

https://www.amazon.co.jp/dp/B081YJTLJS/

Il n'y a pas longtemps, j'ai sorti une petite compétence appelée "Mon Père Noël". Le but de cette compétence est ...

... C'était comme ça. C'est simple. Grosso modo

  1. Le rôle du Père Noël s'inscrit dans la compétence
  2. Le côté qui veut un cadeau fait un vœu
  3. Le rôle du Père Noël confirme le souhait

C'est une compétence. Le fait est que vous utilisez la fonction de personnalisation pour identifier le rôle du Père Noël. La personne qui fait un vœu l'utilise également si la personnalisation est efficace. De plus, la fonction de facturation est implémentée de force, et si vous facturez, la limite supérieure de vos souhaits augmentera.

ask-cli for python

J'ai utilisé ask-cli, mais j'ai toujours utilisé node. J'ai pensé essayer d'utiliser python une fois, donc cette fois j'utilise python.

Qu'est-ce que ask-cli

Il utilise le kit de compétences alexa sur la ligne de commande. Avec lui, vous pouvez créer des compétences sans ouvrir la console développeur. C'est incroyablement utile lorsque vous souhaitez supprimer du code pour une compétence existante avec ʻask clone` ou partager du code entre équipes. Bon, il y a beaucoup de choses qui conviennent à la console, et au moment de l'application, je finis par ouvrir la console.

Quant à son utilisation, le didacticiel suivant est tel quel.

[Démarrage rapide: Interface de ligne de commande Alexa Skills Kit (ASK CLI)](https://developer.amazon.com/ja-JP/docs/alexa/smapi/quick-start-alexa-skills-kit-command-line- interface.html)

  1. ask init
  2. ask new
  3. ask deploy

Simplement fais-le. Vous pouvez cloner l'exemple de code de compétence avec ʻask new`, afin de pouvoir créer rapidement quelque chose.

ask-cli for python

Si vous sélectionnez python3 au moment de ʻask new`, vous pouvez créer une compétence alexa avec python.

$ ask new
? Please select the runtime Python3
? List of templates you can choose Hello World (using Classes)
? Please type in your skill name:  skill-sample-python-helloworld-classes
Skill "skill-sample-python-helloworld-classes" has been created based on the chosen template

(↑ Depuis le 19/12/18, j'ai eu une erreur lors du déploiement sauf si j'ai changé python3.6 dans .ask / config en python3.7.)

Au fait, vous pouvez créer une compétence hébergée en faisant quelque chose comme $ ask create-hosts-skill --runtime python3.7 --skill-name ExampleSkill --auto-clone true. En bref, la compétence qui héberge les ressources (lambda, DynamoDb, etc.) côté alexa. Cela suffit pour un peu de compétence. À l'origine, c'est une compétence hébergée que vous devez écrire du code à l'aide d'un navigateur, mais si vous utilisez cli, vous pouvez la développer localement, ce qui est super pratique.

Extrait de code et commentaire

Ceci est mon code du Père Noël. (Je suis désolé pour le code, mais je suis désolé pour le code.)

https://github.com/ikegam1/alexa-myhomesanta-ask-python37

--lambda / py / lambda_function.py Traitement backend général des compétences --lambda / py / vendor / alexa / data.py Mot de la partie parlée de la compétence --isps / subscription / my-home-santa.json Paramétrage des éléments de facturation --models / ja-JP.json Intention de la partie avant de la compétence, etc.

La partie de lambda_function.py est expliquée.

Flux (du nom de la description)

Je vais expliquer le long du flux comme ça

  1. Flux au premier démarrage
  2. Flux lors de l'enregistrement d'un souhait
  3. Flux de confirmation du souhait
  4. Flux lié à la facturation

Liste des fonctions, etc.

Une liste de classes et de fonctions. J'omets l'aide et le traitement normal

Numéro d'article Nom Contenu
1 class LaunchRequestHandler(AbstractRequestHandler) Intention de lancement. Traité lorsque la compétence est activée
2 class WishAddInIntentHandler(AbstractRequestHandler) Intention lors de l'enregistrement d'un souhait. Après cela, passez au traitement de confirmation
3 class WishDeleteIntentHandler(AbstractRequestHandler) Une intention qui supprime un souhait. Personnalisation requise. Vous pouvez supprimer ce que vous avez enregistré
4 class WishListIntentHandler(AbstractRequestHandler) Une intention de confirmer vos souhaits. Personnalisation requise. Vous pouvez vérifier ce que vous avez enregistré
5 class AnswerClassIntentHandler(AbstractRequestHandler) Intention d'enregistrer les utilisateurs en tant que père Noël
6 class PremiumInfoIntentHandler(AbstractRequestHandler) Introduction des éléments de facturation
7 class YesIntentHandler(AbstractRequestHandler) Le processus principal est la confirmation lors de l'enregistrement d'un souhait
8 class ShoppingIntentHandler(AbstractRequestHandler) Si vous avez acheté un élément de facturation
9 class BuyIntentHandler(AbstractRequestHandler) Intention lors de l'achat d'articles facturables
10 class CancelSubscriptionIntentHandler(AbstractRequestHandler) Intention lors de l'annulation d'un élément de facturation
11 class CancelResponseHandler(AbstractRequestHandler) Récupérez la réponse lors de l'annulation d'un élément de facturation
12 class BuyResponseHandler(AbstractRequestHandler) Récupérez la réponse lors de l'achat d'un élément de facturation
13 def is_santa(santa, person_id) Déterminez si vous êtes le Père Noël
14 def is_skill_product(handler_input) Déterminez s'il s'agit d'un élément de facturation ou valide
15 def in_skill_product_response(handler_input) Obtenez des informations valides ou de facturation via l'API côté Alexa

Flux au premier démarrage

1.LaunchIntent Les paramètres sont conservés dans DynamoDB. Si persistence_attr ['santa'] est vide, il est considéré comme le premier démarrage.

Vérifiez si la personnalisation est activée. Le contrôle peut être déterminé par la présence ou non d'un personId dans request_envelope.context.system.person. Si la personnalisation est désactivée -> Quitter avec "Activer" Si la personnalisation est activée -> "Voulez-vous vous inscrire en tant que Père Noël?" Flow. Permettez-moi de dire "Je suis le Père Noël" et conduisez à "Répondre à l'intention de classe"

  1. AnswerClassIntent Vérifiez d'abord si la personnalisation est activée.

Si la personnalisation est activée -> Enregistrez l'ID de cet utilisateur dans persistence_attr ['santa'] ['id']. Après cela, ce personId est traité comme le Père Noël.

Flux d'enregistrement des souhaits

1.LaunchIntent Si person_id est enregistré dans persistence_attr ['santa'] ['id'] et que c'est la personne elle-même, il est considéré comme le Père Noël. Sinon ** Utilisateurs généralistes qui font un vœu **. La vérification est déterminée par 13. def is_santa (santa, person_id).

Si ce n'est pas le Père Noël-> Permettez-moi de dire "fais un vœu" et conduis à "WishAddInIntent`

2.WishAddInIntent Une intention de répondre à vos souhaits. Puisque le souhait est capté dans Dialog, ** wish ** est capté au moment où il est traité par cette intention. Cependant, je veux le confirmer, donc je le répète et demande "oui" ou "non". Si oui, allez à «Oui intention». De plus, 3 souhaits seront Max quand il n'y a pas de frais. Cochez persistence_attr ['msg'] et si 3 éléments ont déjà été enregistrés, recommandez l'élément de facturation et terminez.

7.YesIntent Il entre en retournant confirmer lors de l'enregistrement d'un souhait. Je voulais utiliser Dialog, mais j'ai utilisé Build in Intent car cela semble compliqué. S'il y a une valeur dans persistence_attr ['session'] ['msg'] et qu'elle est dans la minute suivant l'enregistrement, elle est considérée comme une transition de WishAddInIntent.

Le message est enregistré dans persistence_attr ['msg'], mais si la personnalisation est activée, le personId est enregistré dans persistence_attr ['msg'] [idx] ['person_id'] et utilisé pour la vérification d'identité. Si vous pouvez confirmer votre identité, vous pouvez supprimer votre souhait

Flux de confirmation de souhait

  1. WishListIntentHandler

"Confirmez votre souhait" Il y a une branche si Père Noël ou non.

Si le Père Noël-> Énoncez les ** souhaits ** enregistrés dans l'ordre. De plus, "Supprimer le ○ e souhait" entraînera la suppression du souhait. Si Utilisateur général-> Personnalisation doit être activé pour confirmer, et si activé, vous pouvez confirmer vos souhaits enregistrés. Connectez-vous également à la suppression comme "Veuillez dire le mot de passe à 4 chiffres 1234 pour supprimer"

  1. WishDeleteIntent

Si Santa-> message_number Vérifiez l'emplacement. ** Supprimer le souhait ** Si Utilisateur général-> mot de passe Vérifiez l'emplacement. Si les mots de passe correspondent, supprimez votre souhait

Flux de facturation

Un produit d'abonnement appelé "My Santa Claus Premium Features" est défini.

9.BuyIntentHandler Transition depuis "Acheter des fonctionnalités premium".

En utilisant le productId de ce produit comme clé, nous jetons simplement le processus du côté alexa.

            return handler_input.response_builder.add_directive(
                SendRequestDirective(
                    name="Buy",
                    payload={
                        "InSkillProduct": {
                            "productId": product[0].product_id
                        }
                    },
                    token="correlationToken")
            ).response

L'intention suivante reçoit ceci

  1. BuyResponseHandler

Il renvoie Connections.Response au lieu de l'intention habituelle.

        return (ask_utils.is_request_type("Connections.Response")(handler_input) and
                handler_input.request_envelope.request.name == "Buy")

Après l'achat, il sera retourné avec le nom de paramètre «Buy», mais le statut est «PurchaseResult.ACCEPTED», «PurchaseResult.DECLINED», «PurchaseResult.ALREADY_PURCHASED», ou non. Je retourne également des choses comme s'il a été acheté ou non, donc je retourne l'énoncé en fonction de cela. Le traitement en cas d'annulation est presque le même que le simple changement d'Achat en Annuler.

La fin

C'est tout. Personnellement, je pense qu'il s'agit du volume d'un petit tutoriel.

Aussi, pour être honnête, la personnalisation est difficile à utiliser, et quand cela devient indispensable, je pense que le nombre d'utilisateurs diminuera fortement. ** Il peut être utilisé même s'il est désactivé, mais il est toujours pratique s'il est activé **. Attentes pour l'avenir. Facturation en compétences ... Il semble que les compétences japonaises soient encore assez strictes. Je pense que c'est un joli créneau dans lequel vivre.

Recommended Posts

L'histoire de la création d'une compétence (probablement) minimale qui implémente la personnalisation et la facturation des compétences
L'histoire de Python et l'histoire de NaN
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
L'histoire d'essayer deep3d et de perdre
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
Une histoire qui réduit l'effort de fonctionnement / maintenance
L'histoire de Python sans opérateurs d'incrémentation et de décrémentation.
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
Une histoire qui a analysé la livraison de Nico Nama.
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
L'histoire de la création d'un «espace de discussion sur l'esprit et le temps» exclusivement pour les ingénieurs de l'entreprise
L'histoire de sys.path.append ()
L'histoire de la création d'un canal VIP dans le chatwork en interne
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
L'histoire de la création d'un outil qui fonctionne sur Mac et Windows sur le site de développement de jeux
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python