ASK UtilsのSkill CreatorでAlexaスキル開発を楽にする

少なくとも、自分の開発効率は上がったので、地球上でこのアップデートを喜ぶ人は最低一人いる様子です。 Alexaスキル開発がDRYじゃなくなるとき Alexaスキルのコードを書いていると、同じようなコードを何度も何度も書く […]

広告ここから
広告ここまで

目次

    少なくとも、自分の開発効率は上がったので、地球上でこのアップデートを喜ぶ人は最低一人いる様子です。

    Alexaスキル開発がDRYじゃなくなるとき

    Alexaスキルのコードを書いていると、同じようなコードを何度も何度も書く必要が出てきます。

    下のようなコードは、どのスキルでも書く必要があり、毎回コピー&ペーストした後にカスタマイズしていました。

    export const handler = SkillBuilders.custom()
        .addRequestHandlers(
            ...requestHandlers
        ).addRequestInterceptors(
            RequestLogger,
            SetLaunchCountInterceptor
        ).addResponseInterceptors(
            RecordTheResponseInterceptor,
            ResponseLogger
        )
        .withApiClient(new DefaultApiClient())
        .withPersistenceAdapter(
                new S3PersistenceAdapter({
                    bucketName: config.bucketName,
                    pathPrefix: config.bucketPathPrefix
                })
            )
         .lambda()

    しかしスキルを作るたびにこれらのコードを毎回コピー&ペーストなどで複製するのは非効率ですし、作ろうというやる気を削ぐ「作業」です。

    「いつもの設定のスキルちょうだい。DBはS3で、ISP対応ね」

    スキルを作る上で欲しかったのがこのようなリクエストに答えてくれるツールでした。本当はnpx create-alexa-app --db s3 --ispのようなコマンドでnpm installまで終わらせたいところです。

    ですが、千里の道も一歩からです。まずは先ほどお見せしたコードを生成するヘルパー関数を用意しました。

    import { createSkill, SkillHandlersFactory } from 'ask-utils'
    
    const handlers = SkillHandlersFactory.create()
      .addRequestHandlers(
        LaunchRequest,
        NextIntent,
        AnswerIntent,
        YesNextIntent,
        HelpIntent,
        ResumeIntent,
        StopIntent,
        NoIntent,
        CancelIntent,
        FallBackIntent
      )
      .addRequestInterceptors(
        MyRequestInterceptor1,
        MyRequestInterceptor2,
      )
      .addResponseInterceptors(
        MyResponseInterceptor1,
        MyResponseInterceptor2,
      )
      .addErrorHandlers(
        MyErrorHandler1,
        MyErrorHandler2,
      )
    
    export const handler = createSkill({
      persistanceType: 'S3',
      bucketName: process.env.BUCKET_NAME as string,
      bucketPathPrefix: process.env.PATH_PREFIX as string,
      isISP: false
    }, handlers.getHandlers()).lambda()

    ハンドラーの登録は、SkillHandlersFactoryを利用することで今までのように記述できます。

    しかし毎回ロギングのために設定していたInterceptorや、S3をDBにするためのadaptorの設定、AMAZON.RepeatIntentで復唱するためのハンドラー&Interceptorなどの実装はcreateSkillの内部で実行してくれます。また、ISPで必ず利用する「購入・返金・商品詳細の確認」といったリクエストを処理するハンドラーも、isISP=trueにすることで追加されます。

    β版のためフィードバック募集中

    この機能はベータ版です。「こういう設定も毎回書くから面倒だ」というものがあればぜひおしらせください。

    また、自分で実装していて「必要だ」と感じたものは随時追加されます。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark