はじめに
健康はあらゆる物事の前提
というわけで、最近 Fitbit を使って自分の健康管理をしているのですが、最近こんなツールを見つけました
概要欄にも書かれているとおり
毎晩23時にFitbit APIを使って健康情報をTwitterに投稿する。プログラムの実行は、サーバのcronで登録する。
というアプリです
非常に魅力的なのですが、自前のサーバーを持っていない私としてはこれが Github Action でやれたら最高、と思っていたので自分でこのアプリを拡張して Github Action で自動的にその日の健康情報サマリーをTwitterに投稿してくれるアプリを作りました
こちらです
拡張したと言ってもやったことはシンプルで
の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 はこちらになります
🏃くろみーの日報
— Hiroyuki Kuromiya (@khiroyuki1993) 2023年10月6日
[2023-10-6]
👟運動情報👟
歩数: 12038
消費cal: 3553
💤睡眠情報💤
ベッド時間: 6時間33分
深い睡眠: 1時間23分
浅い睡眠: 3時間26分
レム睡眠: 33分
覚醒: 1時間11分#Fitbit #Fitbit_Web_API pic.twitter.com/A1kf0W0iBa
みなさんも Fitbit API を活用して健康を高めていきましょう