Alexaセッション外サービスクライアント



Alexaセッション外サービスクライアント

一部のAlexa Skills KitサービスAPIは、スキルのロジックの外で使用することもできます。たとえば、スキルメッセージAPIを使って、スキルにメッセージを送信できます。こうしたセッション外のサービスリクエストを通じて送信されるイベントを処理できるよう、スキルを設定してください。

この場合、サービスの呼び出しはユーザーのスキルコンテキストのセッション外で行われるため、スコープがサービスに依存するよう正しく設定されたアクセストークンを指定する必要があります。そのため、SDKを使わずにサービスを呼び出すには、以下の手順を実行します。

  • 開発者コンソールでスキル>アクセス権限タブからクライアントIDとクライアントシークレットを取得し、正しいスコープを指定してAlexaエンドポイントを呼び出し、Alexaから必要なアクセストークンを取得します。
  • 適切な入力パラメーターと認可済みのアクセストークンを指定して、サービスAPIを呼び出します。

SDKには、この両方の手順が1回のサービス呼び出しで行われるサービスクライアントが用意されています。クライアントは、クライアントIDとクライアントシークレットを受け取り、サービスに関する必要なスコープを設定してアクセストークンを取得し、そのトークンを使ってAlexaサービスを呼び出して、目的の応答オブジェクトを提供します。これによって、サービスを呼び出すためだけにボイラープレートコード(毎回書かなければならないお決まりのコード)を設定する手間をが省略できます。

利用可能なサービスクライアント

  • プロアクティブイベントask_sdk_model.services.proactive_events.proactive_events_service_client.ProactiveEventsServiceClient
  • スキルメッセージask_sdk_model.services.skill_messaging.skill_messaging_service_client.SkillMessagingServiceClient

サービスクライアントのコンストラクターにはask_sdk_model.services.api_configuration.ApiConfigurationask_sdk_model.services.authentication_configuration.AuthenticationConfigurationのインスタンスが必要です。

AuthenticationConfiguration

ask_sdk_model.services.authentication_configuration.AuthenticationConfigurationはコンフィギュレーションクラスであり、Alexaからアクセストークンを取得するためにクライアントIDとクライアントシークレットを受け取ります。

ApiConfiguration

ask_sdk_model.services.api_configuration.ApiConfigurationは、api_client(サービスを呼び出すために使用)、serializer(リクエスト/応答オブジェクトのシリアル化/逆シリアル化に使用)、api_endpoint(呼び出し先)の設定に必要です。

ProactiveEventsServiceClient

プロアクティブイベントAPIを使用すると、Alexaスキル開発者はAlexaにイベントを送信できます。イベントとは、ユーザーが興味を持つと考えられる事実に基づくデータのことです。イベントを受信すると、Alexaは、これらのイベントを受け取るようサブスクリプションを行ったユーザーに、プロアクティブに情報を配信します。

現在、このAPIは、Alexa通知というプロアクティブチャネルを1つサポートしています。将来的にプロアクティブチャネルが追加されると、開発者は新しいAPIを統合しなくても、追加のチャネルを利用できるようになります。

インターフェース

class ask_sdk_model.services.proactive_events.ProactiveEventsServiceClient:
    def __init__(self, api_configuration, authentication_configuration):
        # type: (ApiConfiguration, AuthenticationConfiguration) -> None

    def create_proactive_event(self, create_proactive_event_request, stage):
        # type: (CreateProactiveEventRequest, SkillStage) -> Union[Error]

class ask_sdk_model.services.proactive_events.CreateProactiveEventRequest:
    def __init__(self, timestamp=None, reference_id=None, expiry_time=None, event=None, localized_attributes=None, relevant_audience=None):
        # type: (Optional[datetime], Optional[str], Optional[datetime], Optional[Event], Optional[List[object]], Optional[RelevantAudience]) -> None

class ask_sdk_model.services.proactive_events.SkillStage(Enum):
    DEVELOPMENT = "DEVELOPMENT"
    LIVE = "LIVE"

class ask_sdk_model.services.proactive_events.Event:
    def __init__(self, name=None, payload=None):
        # type: (Optional[str], Optional[object]) -> None

class ask_sdk_model.services.proactive_events.RelevantAudience:
    def __init__(self, object_type=None, payload=None):
        # type: (Optional[RelevantAudienceType], Optional[object]) -> None

class ask_sdk_model.services.proactive_events.RelevantAudienceType(Enum):
    Unicast = "Unicast"
    Multicast = "Multicast"

モデルの詳細については、こちら(英語)を参照してください。

サンプルコード

以下の例で、天気のプロアクティブイベントをAlexaに送信する方法を示します。Alexaは受信したイベントを、スキルに登録されているすべてのユーザーにマルチキャストします。

from datetime import datetime, timedelta

from ask_sdk_model.services.proactive_events import (
    ProactiveEventsServiceClient, CreateProactiveEventRequest,
    RelevantAudienceType, RelevantAudience, SkillStage, Event)
from ask_sdk_model.services import (
    ApiConfiguration, AuthenticationConfiguration)
from ask_sdk_core.serialize import DefaultSerializer
from ask_sdk_core.api_client import DefaultApiClient


def create_notification():
    client_id = "XXXX"
    client_secret = "XXXX"
    user_id = "XXXX"

    proactive_client = ProactiveEventsServiceClient(
        api_configuration=ApiConfiguration(
            serializer=DefaultSerializer(),
            api_client=DefaultApiClient(),
            api_endpoint="https://api.amazonalexa.com"),
        authentication_configuration=AuthenticationConfiguration(
            client_id=client_id,
            client_secret=client_secret))

    weather_event = Event(
        name="AMAZON.WeatherAlert.Activated",
        payload={
            "weatherAlert": {
                "alertType": "SNOW_STORM",
                "source": "localizedattribute:source"
            }
        }
    )

    create_event = CreateProactiveEventRequest(
        timestamp=datetime.utcnow(),
        reference_id="1234",
        expiry_time=datetime.utcnow() + timedelta(hours=1),
        event=weather_event,
        localized_attributes=[{"locale": "ja-JP", "source": "Foo"}],
        relevant_audience=RelevantAudience(
            object_type=RelevantAudienceType.Multicast,
            payload={}
        )
    )

    proactive_client.create_proactive_event(
        create_proactive_event_request=create_event,
        stage=SkillStage.DEVELOPMENT)

SkillMessagingServiceClient

指定されたユーザーのスキルにメッセージリクエストを送信するにはスキルメッセージAPIを使います。

インターフェース

class ask_sdk_model.services.skill_messaging.SkillMessagingServiceClient:
    def __init__(self, api_configuration, authentication_configuration):
        # type: (ApiConfiguration, AuthenticationConfiguration) -> None

    def send_skill_message(self, user_id, send_skill_messaging_request):
        # type: (str, SendSkillMessagingRequest) -> Union[Error]

class ask_sdk_model.services.skill_messaging.SkillMessagingRequest:
    def __init__(self, data=None, expires_after_seconds=None):
        # type: (Optional[object], Optional[int]) -> None

モデルの詳細については、こちら(英語)を参照してください。

サンプルコード

以下に、スキルメッセージをスキルに送信する例を示します。スキルは、Messaging.MessageReceived型のリクエストを処理できるハンドラーにより、リマインダーを処理します。

from ask_sdk_core.api_client import DefaultApiClient
from ask_sdk_model.services import (
    ApiConfiguration, AuthenticationConfiguration)
from ask_sdk_core.serialize import DefaultSerializer
from ask_sdk_model.services.skill_messaging import (
    SkillMessagingServiceClient, SendSkillMessagingRequest)


def send_skill_messaging():
    reminder_id = "XXXX"
    client_id = "XXXX"
    client_secret = "XXXX"
    user_id = "XXXX"

    skill_messaging_client = SkillMessagingServiceClient(
        api_configuration=ApiConfiguration(
            serializer=DefaultSerializer(),
            api_client=DefaultApiClient(),
            api_endpoint="https://api.amazonalexa.com"),
        authentication_configuration=AuthenticationConfiguration(
            client_id=client_id,
            client_secret=client_secret)
    )

    message = SendSkillMessagingRequest(
        data={"reminder_id": reminder_id})

    skill_messaging_client.send_skill_message(
        user_id=user_id, send_skill_messaging_request=message)

LwaClient

LwaClientは、他のセッション外サービスクライアントが、サービスに固有の必要なスコープを設定してAlexaからアクセストークンを取得するために使用します。ただし、特定のスコープを指定すれば、スキル開発者がアクセストークンを取得するためにネイティブに使用することもできます。

インターフェース

class ask_sdk_model.services.lwa.LwaClient:
    def __init__(self, api_configuration, authentication_configuration):
        # type: (ApiConfiguration, AuthenticationConfiguration) -> None

    def get_access_token_for_scope(self, scope):
        # type: (str) -> str

モデルの詳細については、こちら(英語)を参照してください。

サンプルコード

以下に、alexa:abcスコープのアクセストークンを取得する方法の例を示します。

from ask_sdk_core.api_client import DefaultApiClient
from ask_sdk_model.services import (
    ApiConfiguration, AuthenticationConfiguration)
from ask_sdk_core.serialize import DefaultSerializer
from ask_sdk_model.services.lwa import LwaClient

def out_of_session_reminder_update():
    client_id = "XXXX"
    client_secret = "XXXX"
    scope = "alexa:abc"

    api_configuration = ApiConfiguration(
            serializer=DefaultSerializer(),
            api_client=DefaultApiClient(),
            api_endpoint="https://api.amazonalexa.com")

    lwa_client = LwaClient(
        api_configuration=api_configuration,
        authentication_configuration=AuthenticationConfiguration(
            client_id=client_id,
            client_secret=client_secret))

    access_token = lwa_client.get_access_token_for_scope(scope=scope)