banner
Vinking

Vinking

你写下的每一个BUG 都是人类反抗被人工智能统治的一颗子弹

ブログにAppleのフィットネス記録を同期して表示する

前言#

Shiro テーマには 「個人状態展示」 機能があり、カスタマイズされた状態を表示できます。

この機能を最大限に活用するために、スマートフォンのフィットネスリングのデータを個人状態に同期して表示したいと思います。効果は以下の通りです:

効果図

最初は JavaScript スクリプトを作成し、Scriptable アプリを利用してこのアイデアを実現する予定でした。しかし、試してみた結果、Scriptable は HealthKit をサポートしていないため、健康データを取得できませんでした。Apple デバイスでは、アプリが HealthKit の API を通じて健康データにアクセスする必要があり、Scriptable は HealthKit の統合を試みましたが、Apple ストアに拒否されました。したがって、Apple のショートカットを使用してこの機能を実現することにしました。

状態展示の設定#

手動で個人状態を設定することで、コンソールに POST メソッドで https://{バックエンドサーバー}/api/v2/serverless/shiro/status にリクエストを送信したことが表示されます:

個人状態展示リクエスト

リクエストのリクエストボディは以下のような形式の JSON を含みます:

{
	"emoji": "😴", // アバターの右下の Emoji
	"desc": "消費0キロカロリー 運動0分 立っている0時間", // 展開された説明
	"ttl": 60 // 状態の持続時間(秒単位)
}

個人状態を更新する操作を完了するためには、まずアクセストークンを取得し、リクエストヘッダー Authorization: bearer {token} を構築してユーザー権限を検証する必要があります。

アクセストークンを取得する方法は 2 つあります。1 つ目は、状態を設定する前にログインリクエストを発行し、ログインリクエストの返却された JSON から xxxxx.xxxxxxxx 形式のアクセストークンを取得する方法です。

もう 1 つは、バックエンドの 設定 -> セキュリティ -> API トークン で新しい xxxxxxxxxxxxxx 形式のアクセストークンを作成する方法です。この方法をお勧めします。

アクセストークンを取得したら、コンソールで確認します:

const token = "xxxxxxxxx";
fetch("https://server.vinking.top/api/v2/serverless/shiro/status", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: token,
  },
  body: JSON.stringify({
    emoji: "✌️",
    desc: "テスト",
    ttl: 60,
  }),
})
  .then((response) => {
    if (response.ok) {
      return response.text().then(() => {
        console.log(`ユーザー状態設定成功、ステータスコード: ${response.status}`);
      });
    }
  })
  .catch((error) => console.error("ユーザー状態設定エラー:", error));

状態の設定に成功しました。

設定成功

ショートカットの設計#

健康データを自動的に個人状態に同期するには、健康データを取得し、リクエストを構築して API を呼び出すショートカットを設計する必要があります。設計の考え方は以下の通りです:

考え方

フローチャートをショートカットに変換する過程で、いくつか注意すべきポイントがあります:

  1. 特定のデータがその日に記録されていない場合(例:運動していない)、ショートカットは空の値を返し、0 ではありません。後続の説明テキストの結合に問題が発生しないように、事前に初期値 0 を設定する必要があります。
  2. データを Apple 健康のフィットネス記録パネルのデータと一致させたい場合、「立っている x 時間」(Stand Hours)の統計方法に特に注意が必要です。これは達成回数を反映しており、実際の立っている時間ではありません。その計算ロジックは、各時間内に累積立っている時間が 1 分以上であれば、1 時間達成と見なされます。例えば、08:00 - 08:01 に立っていて、09:30 - 09:31 に立っている場合、2 時間達成として記録されます。それに対して、ショートカットが取得する「立っている分数」(Stand Time)は、各立っている時間の実際の分数です。したがって、「立っている x 時間」を統計するには、カウントの方法で各時間が達成されているかを確認する必要があります。指示は以下のように表現します:

達成回数の統計

  1. インターフェースが状態を正常に設定した場合、204 ステータスコードのみを返し、内容は返されません。また、ショートカット自体は HTTP ステータスコードを直接詳細に判断することをサポートしていないため、返されたファイルのサイズが 0 であるかどうかを確認して設定が成功したかどうかを確認する必要があります。

ショートカットが非常に長いため、まずショートカットを前面に出します:

ショートカットの完全なフローは以下の通りです(超長い画像警告):

::: masonry
image
:::

この記事は Mix Space によって xLog に同期更新されました
元のリンクは https://www.vinking.top/posts/codes/sync-fitness-records-to-blog-status


読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。