くろみーの日報テンプレ

日常のほのぼのした記録

Fitbit を使った健康報告パッチを Github Action に対応させた話

はじめに

健康はあらゆる物事の前提

というわけで、最近 Fitbit を使って自分の健康管理をしているのですが、最近こんなツールを見つけました

github.com

概要欄にも書かれているとおり

毎晩23時にFitbit APIを使って健康情報をTwitterに投稿する。プログラムの実行は、サーバのcronで登録する。

というアプリです

非常に魅力的なのですが、自前のサーバーを持っていない私としてはこれが Github Action でやれたら最高、と思っていたので自分でこのアプリを拡張して Github Action で自動的にその日の健康情報サマリーをTwitterに投稿してくれるアプリを作りました

こちらです

github.com

拡張したと言ってもやったことはシンプルで

  1. Github Actions のワークフローを作成
  2. Twitter API 連携のキーを環境変数
  3. Fitbit API 接続キーをGoogle Cloud Storage で管理する

の3つです

作成したワークフロー

以下のような yml ファイルを作成してワークフローを定義しました

name: Post Fitbit summary to Twitter
on:
  schedule:
   - cron: '5 14 * * 1-5' # 23:05 JST

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
      - name: Set up Python 3.8
        uses: actions/setup-python@v2
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install matplotlib
          pip install tweepy
          pip install google-cloud-storage
      - name: Post summary to Twitter
        run: |
          echo -n '${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}' > key.json
          python main.py
        env: 
          GOOGLE_APPLICATION_CREDENTIALS: key.json
          TW_CONSUMER_KEY: ${{ secrets.TW_CONSUMER_KEY }}
          TW_CONSUMER_SECRET: ${{ secrets.TW_CONSUMER_SECRET }}
          TW_ACCESS_TOKEN: ${{ secrets.TW_ACCESS_TOKEN }}
          TW_ACCESS_TOKEN_SECRET: ${{ secrets.TW_ACCESS_TOKEN_SECRET }}

元のスクリプトと同様に python main.py で実行する部分は同じですが、Github Actions に対応するために Twitter API の認証情報を環境変数化しました

元のスクリプトだと twitter_conf.json というファイルに認証情報を記載する設定になっていますが、Github Actions を使う場合、レポジトリ内のファイルに認証情報を記載することになり危険です

このように環境変数にすることで安全にAPIの認証情報を格納することができます

一方で難しかったのが Fitbit APIの認証キーの取り扱いです

Fitbit API の認証キーは有効期間が24時間と短く、期限が切れたらその都度 refresh token を使って新しい認証キーを取得し直す必要があります

これをActions の環境変数に設定した場合、Github の PAT (Personal Access Token) を作成して Github API を通して環境変数を更新する処理を入れ込む必要があるので面倒です

そこで今回はクラウドストレージを活用して認証キーの管理を行うことにしました

AWSのS3と迷ったのですが、Google 繋がりで Google Cloud Storage を採用しています

具体的には、元のスクリプトでファイルの書き込みを行う部分をこのように書き換えるだけです

    blob.upload_from_string(
        data=json.dumps(conf),
        content_type='application/json',
    )

この方法であればGoogle Cloud Storage の認証キーを一度入れるだけでFitbit APIの認証キーの更新を自動化できるので便利です

できたもの

作成したワークフローで投稿されたTweet はこちらになります

みなさんも Fitbit API を活用して健康を高めていきましょう