【GoogleAppsScript】SESAME API を使ってGASから施錠・解錠する
はじめに
この記事は過去に投稿したSlackからNatureRemoのAPIを叩く記事の延長編です。
外出時に電化製品の電源オフったあとに、そのまま鍵の解錠→再施錠を実施するためにSESAME APIを使用します:)
やること
過去記事の延長線なのでSlackとの連携部分は省略します。
1. SESAME APIの準備
https://partners.candyhouse.co/login から SESAME に登録済みのメールアドレスでログイン
ログインしたらメールが来るので認証などを済ませる
https://partners.candyhouse.co/ が閲覧可能になるので施錠・解錠に使用したい登録デバイスをクリック
API キー・SecretKey・UUID を UUID をコピる
2. GASの作成
施錠・解錠には以下の API を使用
RequestBody には以下が必要
①操作コマンド
command | 操作内容 |
---|---|
88 | トグル(施錠状態 → 解錠する・解錠状態 → 施錠する) |
82 | 施錠 |
83 | 解錠 |
②履歴に表示される識別子
アプリの操作履歴↓に表示される文字列を base64 形式で指定する
// 履歴に表示される名前を"GoogleAppsScript"にしたい場合 Utilities.base64Encode("GoogleAppsScript"); // "R29vZ2xlQXBwc1NjcmlwdA==";
最初、Utilities.base64Encode()
があるの知らなくて、ずっと btoa()
使ってたよ...
③AES-CMAC 方式で暗号化したタイムスタンプ
暗号化において、以下の記事を参考にさせていただきました。
AES-CMAC での暗号化には CryptoJS を使用
CryptoJS のうち、以下のファイルを使うので GAS のコード.gs
にコピペ
(参考記事だと別ファイルでのスクリプトになってるけど、呼び出せなかったので全部コード.gs
に書いた...)
SESAME の API 仕様書に書かれてる 1,2,3 の部分は以下だと思う(多分)
// 1. timestamp (SECONDS SINCE JAN 01 1970. (UTC)) // 1621854456905
// 2. timestamp to uint32 (little endian) //f888ab60
// 3. remove most-significant byte //0x88ab60
// 1. timestampのミリ秒を切り捨て const ts = Math.floor(Date.now() / 1000); // ビューの作成 const view = new DataView(new ArrayBuffer(4)); // 2. 32bitにしてリトルエンディアンで格納 view.setUint32(0, ts, true); // 3. hexにして最上位ビットを削除 const src = view.getUint32(0).toString(16).slice(2, 8); // 暗号化 const sign = CryptoJS.CMAC( CryptoJS.enc.Hex.parse(SECRET_KEY), CryptoJS.enc.Hex.parse(src) ).toString();
これを関数にして解錠 →40 秒後に再施錠をする
const CMD = { lock: 82, unlock: 83 }; changeSesameCmd(CMD.unlock); Utilities.sleep(40000); // 40秒後に再施錠する changeSesameCmd(CMD.lock);