Oura Ringの歩数データをGitHub ActionsでPixelaに記録する

· 167 words · 1 minute read

在宅ワーク&山形在住になって始めた散歩が2年間続いています。最近a-knowさんに倣って「じぶんリリースノート」をつけ始めたので、そこに歩数の草を生やしてみたくなりました。 やってみた結果がこちらです。

Pixela|歩数グラフ

やったこと

Mitsuyuki.ShiibaさんがCircleCIとFitbitでやっていたのとだいたい同じイメージです。

  1. Oura RingのAPIで歩数を取得する
  2. Pixelaに記録する
  3. GitHub Actionsで定期的に実行する

前にこの記事を読んで歩数をPixelaにつけるのいいな〜と思っていたのでまねしました。仕事で普段GitHub Actionsを利用しているので、GitHub Actionsでやってみました。

1. Oura Ring APIを利用する

Oura API v2を利用してデータを取得しました。 ちなみにgen 3からはサブスクリプションが導入され、サプスクリプションプランに入らないとAPIが利用できません。これがgen 3への乗り換えをためらっている理由の1つです。

まず、ログインして下記のURLにアクセスし、Personal Access Tokenを生成します。

Personal Access Tokens

あとはドキュメント通りに、このTokenをリクエストヘッダに付与してAPIを叩くだけです。今回は歩数のみ取り出したいのでjqで加工します。

$ curl --location --request GET \
          "https://api.ouraring.com/v2/usercollection/daily_activity" \
          --header "Authorization: Bearer {Oura Personal Access Token}" | jq ".data[].steps"

Oura API | Daily Activity

GitHub Actionsを利用する場合、jqはプリインストールされているので何もしなくてもそのまま使えます。


注) このエンドポイントはクエリパラメータをつけてデータ取得開始日とデータ取得終了日を指定できるのですが、 ?start_date=2022-10-08&end_date=2022-10-09 のようなパラメータをつけて前日のデータを取得しようとしたところnullが返ってきてデータが取得できませんでした。前々日のデータはうまく取得できました。デフォルトでデータ取得開始日にはUTCで今日の日付が、終了日にはUTCで前日の日付が設定されているので無理に上書きせずにそのまま利用しました。

2. piでPixelaに記録する

Pixelaに記録するのにはPixela公式のCLIツールpiを使いました。

最初にユーザー登録とPIXELA_USER_TOKENの設定、グラフの作成を済ませます。piの使い方については@a-knowさんによるとてもわかりやすい説明があります。

PIXELA_USER_TOKEN、を先ほどと同じくGitHubのSettings > Secrets > Actionsに設定しておきます。

piを利用すると、↓のように簡単にPixelaへ記録できます。

$ export PIXELA_USER_TOKEN={生成したトークン}
$ pi pixel post -u {ユーザー名} -g {登録したグラフの名前} -d {記録したい日付(yyyy-mm-dd形式} -q {記録したいデータ(intかfloat}

3. GitHub Actionsで定期実行する

GitHub Actionsではこんな感じにcron形式で定期実行できます。

on:
  schedule:
    - cron: 55 14 * * *

毎日1回23:55に、当日の歩数データを取得するようにしています。

GitHub Actionsのymlの全体はこちらです。

https://github.com/mom0tomo/mom0tomo.github.io/blob/main/.github/workflows/put_steps_to_pixela.yml

3のおまけ:Slackに結果を通知する

ついでにrtCamp/action-slack-notify@v2を利用して、ふだん使っているSlackへ通知するようにしました。

先ほどと同じく、あらかじめSlackのWebHook URLをGitHubのSettings > Secrets > Actionsに設定しておきます。

Slack での Incoming Webhook の利用

- name: Notify Slack on Success
  uses: rtCamp/action-slack-notify@v2
  env:
    SLACK_CHANNEL: xxx
    SLACK_COLOR: ${{ job.status }}
    SLACK_MESSAGE: "Pixelaに歩数を記録しました :footprints:"
    SLACK_ICON_EMOJI: ":footprints:"
    SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}

rtCamp/action-slack-notify@v2はデフォルトで成功した場合には通知するようになっています。そのままだと失敗した場合は通知が来ないので、失敗した場合も通知するように処理を追加しました。

- name: Notify Slack on Failure
  if: failure()
  uses: rtCamp/action-slack-notify@v2
  env:
    SLACK_CHANNEL: xxx
    SLACK_COLOR: ${{ job.status }}
    SLACK_MESSAGE: "歩数の記録に失敗しました"
    SLACK_ICON_EMOJI: ":rotating_light:"
    SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}

おわりに

歩数に応じて草が生えるのはけっこううれしいです。Oura RingのAPIを使うといろいろな情報が取れるので、睡眠データなどでもっと遊んでみたいと思いました。