パーソナライズを試してみた。
スキルをパーソナライズするとは
1つのAmazonアカウントに複数のEchoデバイスが登録されていて、さらに複数人(家族とか)で使用する場合、複数人のプロファイルを登録しておくと、Alexaはユーザーを識別することができるようになる。
スキルのパーソナライズ機能を使用すると、共有アカウントを使用せず、それぞれのスキルユーザーが各自のアカウントにリンクできるようになるので、その人にあったエクスペリエンスが提供できるようになる。
パーソナライズ機能を使うには
パーソナライズ機能を有効にする
Alexa Developer Consoleで ツール
アクセス権限
から スキルのパーソナライズ
をオンにする。
Alexa Developer Console を使ってない場合は、skill.json
の、permissions
に alexa::person_id:read
を追加することで使用できるようになる。
"permissions": [
{
"name": "alexa::person_id:read"
}
],
パーソナライズを有効することで以下のように user
オブジェクトのほかに、person
オブジェクトがAlexaからのリクエストに含まれるようになる。
"person": {
"personId": "amzn1.ask.person.AKYSF36TDUMFU2FR55OJTXO5B53QVL2RZY37C5AOFV6FG2TORRK574KTJ62BAFTP32HZGGSX3SPNLLTMZM4ZBOSMKDGRGU7RGDMUKU3E",
"authenticationConfidenceLevel": {
"level": 200
}
},
"user": {
"userId": "amzn1.ask.account.AG3ULPXTOC7KLBQJVJMISQX6L25DVFQXO2ZYTOKDDWES3M2UTH5WDCTSY2SAKNFSGI7BDQWWRFS5NOEQMCPY3LBOE5NN2M6QIS43RBKGDQG3PV6QLNJMQSXONM6HUTIFG7GK4MWEB7RDDZ32NDVMVRFXP6L6ZI433SCXBEM3XNX57XT4MB25T4UA3EPJZ6UAWOBAH6RIY3NVODI"
},
user
がアカウントレベルなのに対して、person
が個人レベルの情報となる。
アクセス権限とレベルの関係は以下。スキルで使用したい権限を、Alexa Developer Console または、skill.json で設定する。
権限 | permissions | 同意レベル |
---|---|---|
名前 | alexa::profile:given_name:read | アカウントレベルと個人レベル |
姓名 | alexa::profile:name:read | アカウントレベルと個人レベル |
携帯電話番号 | alexa::profile:mobile_number:read | アカウントレベルと個人レベル |
メール | alexa::profile:email :read | アカウントレベルのみ |
郵便番号 | alexa:devices:all:address:country_and_postal_code:read | アカウントレベルのみ |
位置情報 | alexa::devices:all:geolocation:read | アカウントレベルのみ |
タイマー | alexa::alerts:timers:skill:readwrite | アカウントレベルのみ |
リマインダー | alexa::alerts:reminders:skill:readwrite | アカウントレベルのみ |
個別にアカウントリンクも可能
アカウントリンクすることで、オブジェクトのaccessToken
にトークンが含まれるようになる。個人レベルでアカウントリンクを設定しておくことで、個別にアカウントリンクが可能となる。アカウントと個人が同じ場合はトークンも同じ。違う場合はトークンも別となる。
"person": {
"personId": "amzn1.ask.person.AISODKWGQZUAKL5ONZHR7DRR7576FTWATG6IZRSGM6OJXLHD4RJMV6KRXZQHBNFMIYVUE5AGBZLE4K2G2WFJXEAHWMZF3LYZZ6WPS7ZW",
"accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5NzIyNzJmMC1iN2I4LTQxNjgtYjdjNi1jMGZiMmQ4NGJiYWYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NzkzOTcsImV4cCI6MTY1Nzk4Mjk5NywiaWF0IjoxNjU3OTc5Mzk3LCJqdGkiOiI4NGEwZjQ3MS1iYTI2LTRhNzktOTBlNC0zY2JmYWY3ZjQ1MmIiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFmM3pwejN6M3lsbDQyeTZ2eTV0enMzdHNoeHEifQ.imGLUyJRfFGOzOIV2s13LjKJiYYw6loRnFpQ6cKQpBiPzB8eskfVuqM8Su_WXl3tvkVeE7aEe-3PUG_dPbfyjUN4Ok_Iw_7uy2o3TvrH-6HqTWVluABPbdycwvL8sA81J-CEMs9YmlhG90NxirSRiMgnlqnve5iLvP9rBtVC0nu-eC9xhWNFYp95PBFsE1ZYwVNMLRIuaZN7eXsCa_8U_BZ2zIbndjTsSR1PXMXSt0tiV__yw0BrUkZ8Lrwi8y3J-jamL438CVimh3SOu83zfgtX_KSuet7rgXtYXqqURc4vokhvGr2oLgoY9mYRXybgZmeuAto0tn5wfCzQxJV99Q",
"authenticationConfidenceLevel": {
"level": 300
}
},
"user": {
"userId": "amzn1.ask.account.AFXWSL2YEKZJLNGKGF4ZP7BERCTML6SVOM5OAKZ5EPD5HTMRFX4MEBCIKEKP2JBMR4WSXULIKSJU4ZYAHXXAJFGFZ5VG2XJTEV5FUJMTS5DKP6AK4UKSLDKBECOTSLTQHMWLK2XWSAZEWWRGJWCBWGGCPW4QFJNVXUOXXWKP57CJGNGGMN3GT5PVH724Y3LYVGG2EFQ3QL77K3I",
"accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5NzIyNzJmMC1iN2I4LTQxNjgtYjdjNi1jMGZiMmQ4NGJiYWYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NzkzOTcsImV4cCI6MTY1Nzk4Mjk5NywiaWF0IjoxNjU3OTc5Mzk3LCJqdGkiOiI4NGEwZjQ3MS1iYTI2LTRhNzktOTBlNC0zY2JmYWY3ZjQ1MmIiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFmM3pwejN6M3lsbDQyeTZ2eTV0enMzdHNoeHEifQ.imGLUyJRfFGOzOIV2s13LjKJiYYw6loRnFpQ6cKQpBiPzB8eskfVuqM8Su_WXl3tvkVeE7aEe-3PUG_dPbfyjUN4Ok_Iw_7uy2o3TvrH-6HqTWVluABPbdycwvL8sA81J-CEMs9YmlhG90NxirSRiMgnlqnve5iLvP9rBtVC0nu-eC9xhWNFYp95PBFsE1ZYwVNMLRIuaZN7eXsCa_8U_BZ2zIbndjTsSR1PXMXSt0tiV__yw0BrUkZ8Lrwi8y3J-jamL438CVimh3SOu83zfgtX_KSuet7rgXtYXqqURc4vokhvGr2oLgoY9mYRXybgZmeuAto0tn5wfCzQxJV99Q",
"permissions": {
"consentToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLmZkMmU3NGJkLTY2MWItNDk4MS04NDkxLWJiYjA5ZmUwNmMxOSIsImV4cCI6MTY1Nzk4NTA3OCwiaWF0IjoxNjU3OTgxNDc4LCJuYmYiOjE2NTc5ODE0NzgsInByaXZhdGVDbGFpbXMiOnsiaXNEZXByZWNhdGVkIjoidHJ1ZSIsIm5vbkx3YVNjb3BlcyI6ImFsZXhhOjphdXRoZW50aWNhdGU6MjptYW5kYXRvcnksYWxleGE6OnBlcnNvbl9pZDpyZWFkIiwiY29uc2VudFRva2VuIjoiQXR6YXxJd0VCSUF5OE5DTzZpS2lkOGt5UEFIbWduSUJzNGlTOHhJOUlCa0NNd2JXb3RCbU1aU09UTlJZaE9FTFVaWThYLVdpS3F5RUxmeUtBbHpFQjZqZ2Ixc2JqaWFidTJnbXZObE9WTkozWW1MVTJBS3lXMXU2QTFxQ1BUQTJ0YmE4aUdFWC1BY253WnQxcHV1eGQ3T2tzRGVxZjhaTGtNOEtmMlJ5RGw4RS1mRFNRTmV1WERfU1dNSkJJbmZFdHpsZThZVWY4SGpkLVFKNU1mcjIyU3hFcjVKN1lCbVl6YkxBVHM4N2g0Tm85N1NNYk4xNlp0eTBNM2UyVlpqZm40UE9GRmJ5bHBvMXdRQ2p6VDNsSXpyZTNBcGxQbVRHU1FuWElkODRJVXZySmo2Y3lvVk1MTldfbHpRZGFKa0Z6TWNOVUpDZEE3YVFRVFFzZzB6UlkxSjRjUlFMM2xEUUYiLCJkZXZpY2VJZCI6ImFtem4xLmFzay5kZXZpY2UuQUVXQUNZT0dRQ1RTVEFaUjdEVk9JNU1DVVIzTFNZSFBMNEhYQkJCUFZNSFIzNlZOSEU2N01ZTERHWDJPS1lFSk5RRDM2NzdXRTRRQVlFRElGWjJDVEtXUkVVWTZHRVNBRVVKWEhBMlNKMjNZTklTV001S1kzSUlXVUFPWkJBREZHTEpCUFRNUzc3TTRPWU9GVDZOVlQ1NDU2WkJCSk5PQ09ST1pQMlRPV0NGR1o0TEJLRVNYQSIsInVzZXJJZCI6ImFtem4xLmFzay5hY2NvdW50LkFGWFdTTDJZRUtaSkxOR0tHRjRaUDdCRVJDVE1MNlNWT001T0FLWjVFUEQ1SFRNUkZYNE1FQkNJS0VLUDJKQk1SNFdTWFVMSUtTSlU0WllBSFhYQUpGR0ZaNVZHMlhKVEVWNUZVSk1UUzVES1A2QUs0VUtTTERLQkVDT1RTTFRRSE1XTEsyWFdTQVpFV1dSR0pXQ0JXR0dDUFc0UUZKTlZYVU9YWFdLUDU3Q0pHTkdHTU4zR1Q1UFZINzI0WTNMWVZHRzJFRlEzUUw3N0szSSJ9fQ.foe0R-LEvW-Yp4uSKhSO94wJf3wXGZV5xNTCwDi8tuEtbPOGF2dXgZCly8uG1gbIFTtbeN4MfOhJFInhHDxxa7wg0ut4HUrTnUbAQaI8qz_zD-9t4zpwDWCMtdoEm1AzarixTGfyLflztB5XbXRsiF8S6j1Oa16sZEzmGR9whqlpSVOTnfK1jcM_MY-8S7_nsXQVlJqMbSBZQujBnYr9Z1cagOfv5H2cXZrvdXJ6HwFdfwD6-aQosWwsrb3NIfCSQUhU6byPjCumMffqejpszzO5LJpLZvmrNhmyvpj_b-YHKF395TuIc46_ApFsH28cSoMes9bdG_JDygQL7p3JwA"
}
},
"person": {
"personId": "amzn1.ask.person.AI3DUTIDNDS7OICLU75YBHOKCTCVZGP5ZEGBIXS5HN3GJEFPZNL3KI2PKC7YQTW46I4EOOI5W5NNINCLBEWBJEKYOI3ZJHVVNNB2WV2I",
"accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNDI2NzYyNC0zM2U4LTQ3ZTAtYTJjYy1jZTY3OTg3N2JhMTYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5NDY1MjksImV4cCI6MTY1Nzk3ODg0OCwiaWF0IjoxNjU3OTc1MjQ4LCJqdGkiOiI0ZjFiN2ZkNS1mYjdlLTRkMDItYmY4Yy03ZDU0OWZhNGQ2YTYiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFleGlwYTVwa3Vwd2R3MjR4NmZ4YjR0MnlndGEifQ.gCfjUXPYWAMttnLHWgyOy7xQ_k0PwOM47eIRC5wKNJmfasbzJihL-Udco6bT075y4ND4mx3JemZRXF_UTg0HWr9S31ZZWD8AX6DSwq8NrOkZhGc8lNLyao6BGhywKijd8ZkRmyErf0YiHXdVStEddrtvarweN7ue350Lho-BFErshzyyjKI5-yPt8BpmS13GwQdfu4vB2_3boahtJZBSVKxYVdr83jALs_EZYQCcJMJuaTUIxE8ZNcax8x8kXmYYA-BHvdGd1zdbUn8iMs3BUvKW7jVB3PhCydocNaokzffFr5QUjX-geRwUtAjpovw-l1eOGmY0VfFPiioHt3Z8vg",
"authenticationConfidenceLevel": {
"level": 300
}
},
"user": {
"userId": "amzn1.ask.account.AG2ORE4QGWIFWQR362EG2TWAQRYZQ7URETA4A7VHIBKOMAQ3SV2GMCZW4PHAKBAAYSRBYUTYM3BQRUVWXQRTP6ITWLBBUVNVM5YE476EXJP2LIUR3X4DJ2FMSLFZA3BJL44HCC5A4MA76WUULMPDLBOHLSN3HP3NDF6P3VQXGU3H57ZOJ6BCWIKBGQE373EH4RGUMZD5KYUS2BQ",
"accessToken": "eyJraWQiOiI0YWI0Y29yaG4wcXBzWG0wSDh4UHJzRldiZW5vN3dEdmVGSEVvbDdNMlwvOD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI2MmUzNDI1MS0wZjg1LTRiMDAtODU5NS03MTA1YzA4NTk0MmIiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGRfTG9naW5XaXRoQW1hem9uIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMV9UTjg0TG1vMGQiLCJ2ZXJzaW9uIjoyLCJjbGllbnRfaWQiOiIzc2UxdXRsaDJvNjhsaWdnY2xkdjB0dmhhNCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4gb3BlbmlkIHByb2ZpbGUiLCJhdXRoX3RpbWUiOjE2NTc5MzkxOTQsImV4cCI6MTY1Nzk3NzU5NiwiaWF0IjoxNjU3OTczOTk2LCJqdGkiOiJiZGNkZmFjMC05Yjg4LTQ0MjUtOWZjZC0yOTc3YTBhNzAyNjkiLCJ1c2VybmFtZSI6ImxvZ2lud2l0aGFtYXpvbl9hbXpuMS5hY2NvdW50LmFlNzN5Z3ZqZWl5eGp5aDNndWQ1MmJiY2FqZ2EifQ.CUIpggDSue7TtRlUofq-tnyVfZGTSLYYtT5XUyrgBKSWM6YTZy-GQ-acARjgB7FTal8HR4GZKtYU1mNXVfjIHJ2TIbhtvHTAztXuFOo2kcz46q_Ur8fvym6FN6h-HpxJ9x5JZgW3PINOKfL0iKTHhwXtFs4QURezEK49ugyB9FvY6Hd4KbHy_gzbjMF8E3OgnTFdz8ejKLUnM-7cE3Q0wsJKWLZf8CmadPTh39rkXYfOQg-DN2TyfkuSBnFybSCXmsQK6XFRt1r0FNREQhPmsvrLaAC7AwXtHETGxqgwkuVAr9m9AlukSf8THxeKk4aFYattbOv0HgLAWKjQFd9yqw",
"permissions": {
"consentToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLmZkMmU3NGJkLTY2MWItNDk4MS04NDkxLWJiYjA5ZmUwNmMxOSIsImV4cCI6MTY1Nzk4MDIyNywiaWF0IjoxNjU3OTc2NjI3LCJuYmYiOjE2NTc5NzY2MjcsInByaXZhdGVDbGFpbXMiOnsiaXNEZXByZWNhdGVkIjoidHJ1ZSIsIm5vbkx3YVNjb3BlcyI6ImFsZXhhOjpwZXJzb25faWQ6cmVhZCIsImNvbnNlbnRUb2tlbiI6IkF0emF8SXdFQklGdW9pbzdCSXk1TElxcGNlMHp5SmprbVRqWnVpODFTWUhBeWowNlhDZUNKWDFhV2RPd25leUF1cFNJX2RKNG5OQTdnWUwzWVdMMHJlc1lOczQyZGx2RXhtYXdMZDAyS2Y1bkRiYW4zX09OS29fWUhYaUdVQXVSdnMyUmxNNklNUTVjRTdIVS1KOHllblJXMGFZU3BHSjJLdnI0bWR1Z3pZNnlVNXBtREpqZk5wTnNweVpSM0tnU3RWb3ZsQmY5VzBBd2ZYcExOMFdJNHlaRHRVSEN1RG1aNnRKSHlzd2FYdnpSWkV3ZHZVWlU1cjFuam41ZGZnRlJGN2FlQThFSDVlWTB1OXNDcTYwZVhlWjJ0UF9uLWtHUkdSWGViRnROcU91b1lVNl9IeEFiWEJrY2YwSW5HMDlyREN6NWFwUlc5VE5hSHNEbVFwWWFMTms3MHo0MlQtV2JZIiwiZGV2aWNlSWQiOiJhbXpuMS5hc2suZGV2aWNlLkFGRVZCTU5ENTRZSUVYU1VZTUZHVDVXWlU0UVBMMkJCV09aU1RMQ0ZOMk9SVlJITkwyS0ZRM0ZSR0JDUlNXRFdPUUk0VlIyR0FWMzNJUFRXQlJWSTZFWjNOQURFNkoyQkZEQVU2Q0JYS042UFA2QVpLS1BFTDU1VUlIU0FISFVMSENQM0ZZNldSUEdMVkhXN0szU1NTNjYzM1VHWkg1VFU3VU5LSEZKSUo2UTRNVlZIVkMzTFkiLCJ1c2VySWQiOiJhbXpuMS5hc2suYWNjb3VudC5BRzJPUkU0UUdXSUZXUVIzNjJFRzJUV0FRUllaUTdVUkVUQTRBN1ZISUJLT01BUTNTVjJHTUNaVzRQSEFLQkFBWVNSQllVVFlNM0JRUlVWV1hRUlRQNklUV0xCQlVWTlZNNVlFNDc2RVhKUDJMSVVSM1g0REoyRk1TTEZaQTNCSkw0NEhDQzVBNE1BNzZXVVVMTVBETEJPSExTTjNIUDNOREY2UDNWUVhHVTNINTdaT0o2QkNXSUtCR1FFMzczRUg0UkdVTVpENUtZVVMyQlEifX0.ZQJo0Z0mf_Uz9pHPKnBfiwJ4wZPeVxRi_uiJE3g8YGPHf7wnIEWGJLbLRBZILX1I0vQbJZfa-H1M2WbeaTW4qh2Zdkxx9QrdihKSV6Ow43gDDBP2Rj3gxHVfNJTy065pPxhUDkGQJIlwUF8IDfeZrhKk8t_8zweah4WYtvfOVXENCzfrvVFmvTgvzFZwI8E9P2yVjSVOqPop8OScSYQyr6zIoBV0kM0Lnu7q4Cjicn8GVYcJIeRArIUZKQsCrONzVE9TZ8YP7oCYNVyAct-LNiiqlsXXlZezmitOS1jSeD633LKkPAeWodwGpuwQ3olzFLi5pxhuQpzQEQHT8H9Fow"
}
},
個別にPIN設定も可能
PINを有効にすることで、個人レベルでPINが使えるようになる。
ただし、現在は日本のスキルではPIN登録できないみたい。Alexaアプリのスキルページに PIN が表示されない。
実装
- Alexaアプリで
音声ID
を追加する -
スキルのパーソナライズ
をオンにする - 取得したい権限をオンにする
- バックエンドコードを書く
-
person
オブジェクトを取得する - 権限情報を取得する
-
- (デプロイ)
- Alexaアプリでスキルを有効にする
- 権限の参照を許可する
音声IDを追加する
Alexaアプリから音声IDをセットアップする。アプリの指示に従ってIDを登録する。

パーソナライズをオンにする
取得したい権限をオンにする
バックエンドコードでperson
オブジェクトを取得する
person
オブジェクトは handlerInput
から取得できる。名前を喋らせたいだけならこれだけでOK。
パーソナライズがオンにすることで、person
オブジェクトが取得できるようになるので、そのオブジェクトから personId
を取得する。
let user = handlerInput.requestEnvelope.context.System.user;
let userId = user.userId;
let person = handlerInput.requestEnvelope.context.System.person;
let personId = (person === undefined) ? '' : person.personId;
個人レベルの情報が取得できるかは、person
オブジェクトのありなしで判断する。
person
オブジェクトからpersonId
が取得できたら、SSMLを使って名前を発話させることができる。
<alexa:name type="first" personId="<personId>" />
if (person === undefined) {
speakOutput = '<speak>おはようございます。今日の朝食用にパンケーキのレシピを用意しました。</speak>';
} else {
speakOutput = '<speak><alexa:name type="first" personId="' + personId + '" />さん、おはようございます。今日の朝食用にパンケーキのレシピを用意しました。</speak>';
}
バックエンドコードで権限情報を取得する
パーソナライズ情報を取得するには serviceClientFactory
を使用する。 SMAPIを使っても可能だが実装が簡単なので今回はこれを使用した。
try {
const client = handlerInput.serviceClientFactory.getUpsServiceClient();
const name = await client.getPersonsProfileName();
} catch (error) {
if (error.name !== 'ServiceError') {
return handlerInput.responseBuilder
.speak('サービスクライアントエラーです')
.getResponse();
}
return handlerInput.responseBuilder
.speak('権限がありません。')
.getResponse();
}
SkillBuilders
に withApiClient
を追加しておかないと動かない。いつもこれを忘れてしまうのでメモしておく。
exports.handler = Alexa.SkillBuilders.custom()
:
.withApiClient(new Alexa.DefaultApiClient())
スキルの作成が完了したら、スキルをデプロイする。
Alexaアプリでスキルを有効化し権限の参照を許可する
スキルを有効にすると、プロフィールのアクセス権と、アカウントのアクセス権が聞かれる。
もちろん、アカウントリンクもできる。
ユーザーごとにアカウントリンクもできる。
2番目のユーザーがアカウントを追加
ではなく、普通にアカウントリンクをするとデフォルトが変わる。

これはいろいろ活用できそうだ。