【GoogleAppsScript】SESAME API を使ってGASから施錠・解錠する

はじめに

この記事は過去に投稿したSlackからNatureRemoのAPIを叩く記事の延長編です。

iliiliiiliili.hatenablog.jp

外出時に電化製品の電源オフったあとに、そのまま鍵の解錠→再施錠を実施するためにSESAME APIを使用します:)

やること

  1. SESAME APIの準備
  2. GASの作成

過去記事の延長線なのでSlackとの連携部分は省略します。

1. SESAME APIの準備

https://partners.candyhouse.co/login から SESAME に登録済みのメールアドレスでログイン

SESAME APIログイン画面

ログインしたらメールが来るので認証などを済ませる

https://partners.candyhouse.co/ が閲覧可能になるので施錠・解錠に使用したい登録デバイスをクリック
API キー・SecretKey・UUID を UUID をコピる

SESAME APIキー画面

2. GASの作成

施錠・解錠には以下の API を使用

doc.candyhouse.co

RequestBody には以下が必要

①操作コマンド

command 操作内容
88 トグル(施錠状態 → 解錠する・解錠状態 → 施錠する)
82 施錠
83 解錠

②履歴に表示される識別子

アプリの操作履歴↓に表示される文字列を base64 形式で指定する

SESAME アプリ画面

// 履歴に表示される名前を"GoogleAppsScript"にしたい場合
Utilities.base64Encode("GoogleAppsScript"); // "R29vZ2xlQXBwc1NjcmlwdA==";

最初、Utilities.base64Encode()があるの知らなくて、ずっと btoa()使ってたよ...

③AES-CMAC 方式で暗号化したタイムスタンプ

暗号化において、以下の記事を参考にさせていただきました。

zmzlz.blogspot.com

AES-CMAC での暗号化には CryptoJS を使用

CryptoJS のうち、以下のファイルを使うので GAS のコード.gsにコピペ

(参考記事だと別ファイルでのスクリプトになってるけど、呼び出せなかったので全部コード.gsに書いた...)

SESAMEAPI 仕様書に書かれてる 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);

コード全文

最後に

SESAME APIでRequestが間違ってたときのステータスコードが500エラーなのしんどい画期的ですごい