alexa-sdk-v2のリマインダーAPIのコードをgithubに上げときました

alexa-sdk-v2のリマインダーAPIのコードをgithubに上げときました

今後個人開発で作成したモジュール等はgithubで公開していきます

2017年6月からプログラミングを始めて、そろそろ2年が経とうとしているのですが、コーディング技術が極めて低い。なんで低いかっていうと、

  • 早く動くものを公開したいという気持ちが先走っている
  • 一つ上のレベルで書く努力をしていない
  • 自分しか見ないから恥ずかしいコード・メンテし辛いコードを良しとしてしまっている

ってのが原因かと。なので、今後個人開発で書いたコードは他のプログラマの方に何かしらの時短になるようにgithubに公開していこうと思います。そうすると自分自身「自分以外の人が読んでわかるコードを書こう」というインセンティブが働くはず!

実際にgithubに上げときました

集中モード」スキルを作成するのに、リマインダーAPIを叩くのに、結構苦戦したので、gitに上げときましたので、alexaエンジニアの方は宜しければご活用下さい。ホントは、登録したリマインダーの削除・編集・確認等の機能も付けてたのですが、人様に見せれる状態では無かったので、また整えてからcommitします。

クラスメソッド様のこちらのブログのTypeScriptのコードをjsに変更させていただいて、リマインダーAPIが結構時間がかかるため、プログレッシブ応答のAPI叩くためのコード追加してます。

クラスメソッド様のブログにも、Amazon公式のブログにもエンドポイントが

https://api.amazonalexa.com

となっているのですが、実際はユーザーのエリアに寄って異なりますので、alexaから返ってくるJSONの中の値を直接拾うのが良いかと思います。(僕はこれで2時間ぐらい死にました。)

https://github.com/masayuki0109/ReminderService

実際のコード

ヒドいなこのコードはって思った方、是非プルリクお待ちしております。絶賛修行中ですので、精進します。

const Alexa = require('ask-sdk')

class ReminderService {
    
    constructor(handlerInput){
        this.apiClient = new Alexa.DefaultApiClient();
        this.reminderApiPath = '/v1/alerts/reminders';
        this.token = handlerInput.requestEnvelope.context.System.apiAccessToken;
        this.apiEndpoint = handlerInput.requestEnvelope.context.System.apiEndpoint;
        this.requestId = handlerInput.requestEnvelope.request.requestId;
    }
    
    async create(message, offsetInSeconds)  {
 
        const body = {
            requestTime : (new Date()).toISOString(),
            trigger: {
                type : "SCHEDULED_RELATIVE",
                offsetInSeconds : offsetInSeconds,
            },
            alertInfo: {
                spokenInfo: {
                    content: [{
                        locale: "ja-JP",
                        text: message
                    }]
                }
            },
            pushNotification : {                            
                status : "ENABLED"                         
            }
        }
 
        const request  = {
            body : JSON.stringify(body),
            headers : [ {key : 'Authorization', value : `Bearer ${this.token}`} ,
            {key: 'Content-Type', value : 'application/json'}],
            method : 'POST',
            url : this.apiEndpoint + this.reminderApiPath,
        };

        const response =  await this.apiClient.invoke(request);
        // if(response.statusCode == 201){
        if(response.statusCode >= 200 && response.statusCode <= 210){

            return true;
        }
        const responsBody = JSON.parse(response.body)
        return false;
    }

    async directivesApi(message){
        const body = {
          "header":{ 
            "requestId": this.requestId
          },
          "directive":{ 
            "type":"VoicePlayer.Speak",
            "speech":`${message}`
          }
        }
        const request ={
            headers : [ {key : 'Authorization', value : `Bearer ${this.token}`} ,
            {key: 'Content-Type', value : 'application/json'}],
            body : JSON.stringify(body),
            method : "POST",
            url : this.apiEndpoint + '/v1/directives'
        };
        
        const response =  await this.apiClient.invoke(request);
        if(response.statusCode >= 200 && response.statusCode <= 210){
            return true;
        }
        return false;
    }
    
}

module.exports = ReminderService;

余談

いつもQittaに技術ネタを上げていたのですが、ふとワードプレスも使いたくなったのですが、プレーンなワードプレスだとコードがえげつなく見づらかったので、こちらのプラグイン使わせて頂きました。自分も早く人のためになるようなプロダクトを作りたい。今は誰かの応援くらいしか出来ないですが、腕磨きます!