Device Address API를 사용하여 주소 얻기

Alexa에 장치 (Echo)에 등록 된 주소, 우편 번호 및 국가를 얻을 수 있습니다 Device Address API가 추가되었습니다.
이를 통해 사용자는 Skill을 실행한 장치에 연결된 위치 정보(주소, 우편 번호, 국가)를 Skill 측에서 검색할 수 있습니다.
지금까지는 우편번호밖에 없었기 때문에 세세한 위치를 알 수 있는 방법은 없었습니다만, 이것으로 개별 Skill로 주소를 질문하는 것 같은 Intent를 준비할 필요가 없어졌을까 생각합니다.

Echo에 주소를 연결



주소 정보를 얻으려면 사전에 사용자가 Alexa App에서 장치에 주소 정보를 등록해야 합니다.

Alexa App을 열고 SettingsDevices 에서 등록할 장치를 선택합니다.
h tp : /// 아. 아마존. 이 m/s파/그리고 x. HTML# 또는 rds



기본 상태라면 우편번호만 등록되어 있는 상태이므로 오른쪽의 Edit 를 클릭하여 입력합니다.
입력한 주소에 맞는 후보가 있으면 선택할 수 있습니다.


시험에 엠파이어 스테이트 빌딩의 주소를 넣어 보았습니다.

기기의 위치 정보를 검색하는 Skill 만들기



Amazon 개발자 콘솔에서 Skill 목록을 보고 Add a New Skill 를 클릭하여 새로 추가합니다.
htps : //에서 ゔぇぺぺr. 아마존. 이 m/에 dw/ 칭찬. HTML#/s

사용자 정의 Skill을 선택하고 적절한 이름을 지정합니다.
이 예에서는 Invocation Name을 address demo로 등록했습니다.


Configuration 위치에 이번 시도하는 Permissions가 추가되어 있으므로 Device Address 를 체크하고 Full Address 를 선택합니다.


주의)
여기에서 허가한 정보를 돌려주는 엔드포인트 밖에 이용할 수 없습니다.
FullAddress를 허용하더라도 국가, 우편 번호의 끝점을 두드리면 403 Forbidden이됩니다.

Skill 구현



기기에 연결된 주소는 Skill로 보내지는 않지만 전송된 정보를 바탕으로 다른 API를 두드려 얻어야 합니다.

Alexa에서 보낸 JSON은 다음과 같습니다.
{
  "session": {
    "new": true,
    "sessionId": "some session id",
    "user": {
      "userId": "amzn1.ask.account.some_user_id",
      "permissions": {
        "consentToken": "some_token"
      }
    },
    "application": {
      "applicationId": "amzn1.ask.skill.some_app_id"
    }
  },
  "version": "1.0",
  "request": {
    "locale": "en-US",
    "timestamp": "2017-04-08T05:52:11Z",
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.some_request_id"
  },
  "context": {
    "AudioPlayer": {
      "playerActivity": "IDLE"
    },
    "System": {
      "device": {
        "deviceId": "amzn1.ask.device.some_device_id",
        "supportedInterfaces": {
          "AudioPlayer": {}
        }
      },
      "application": {
        "applicationId": "amzn1.ask.skill.some_app_id"
      },
      "user": {
        "userId": "amzn1.ask.account.some_user_id",
        "permissions": {
          "consentToken": "some_token"
        }
      },
      "apiEndpoint": "https://api.amazonalexa.com"
    }
  }
}

이 JSON의 다음 항목을 사용합니다.


JSON 키
의미


context.System.device.deviceId
device id

context.System.user.permissions.consentToken
token

context.System.apiEndpoint
api endpoint



주소 전부 취득



이 정보를 취득하는 경우의 엔드 포인트는 다음과 같습니다.
/v1/devices/{deviceId}/settings/address

이제 echosim에서 Open address demo라고 말하면 검색한 주소에 응답합니다.
API를 두드려 얻은 JSON은 이런 정보
{
  "addressLine1": "5th Ave",
  "addressLine2": null,
  "addressLine3": null,
  "districtOrCounty": "New York",
  "stateOrRegion": "NY",
  "city": "New York",
  "countryCode": "US",
  "postalCode": "10016"
}

카드 표시



사용자가 주소 제공을 허용하지 않는 경우 Alexa의 요청에 consentToken가 포함되지 않습니다.
그러한 경우는 허가를 허가하여 카드가 새롭게 준비되었으므로, Alexa에 돌려주는 JSON에 그 카드를 지정해 줍니다.
'card': {
    'type': 'AskForPermissionsConsent',
    'permissions': [
        'read::alexa:device:all:address'
    ]
}

국가와 우편 번호만 사용하는 경우 read::alexa:device:all:address:country_and_postal_code를 permissions로 지정합니다.

이런 식으로 Alexa App에 카드가 표시됩니다.


샘플 소스


# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import json
import urllib2


def describe_device_address(api_host, device_id, access_token):
    req = urllib2.Request("{}/v1/devices/{}/settings/address".format(api_host, device_id))
    req.add_header("Authorization", "Bearer {}".format(access_token))
    response = urllib2.urlopen(req)
    if response.getcode() == 200:
        return json.loads(response.read())
    else:
        print(response.getcode())
        raise Exception(response.msg)

def lambda_handler(event, context):
    print(event)

    api_host = event["context"]["System"]["apiEndpoint"]
    device_id = event["context"]["System"]["device"]["deviceId"]
    token = event["context"]["System"]["user"]["permissions"]["consentToken"]

    address = describe_device_address(api_host, device_id, token)

    print(address)

    speech_output = "country is {0}. zipcode is {1}. Address is {2} {3} {4} ".format(
        address["countryCode"],
        address["postalCode"],
        address["addressLine1"],
        address["city"],
        address["stateOrRegion"]
        )
    response = build_response(build_speechlet_response(speech_output))

    return response


def build_speechlet_response(output):
    title = 'Address Demo'

    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'AskForPermissionsConsent',
            'permissions': [
                'read::alexa:device:all:address'
            ]
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': title
            }
        },
        'shouldEndSession': True
    }


def build_response(speechlet_response):
    return {
        'version': '1.0',
        'response': speechlet_response
    }

좋은 웹페이지 즐겨찾기