🥷

自身の健康状態をLINEでお知らせしてくれるシステムを作りました!(Oura API × LINE API)

に公開

はじめに

今回はOura Ringから取得した自身の健康状態を定期的にLINEでメッセージ通知してくれるシステムを作成しました。
上記システムで使用しているAPIの設定の仕方、実装方法やデプロイ方法について記載しておりますので、健康データの自動通知にご興味のある方は、ぜひ本記事をご覧いただけると幸いです。
本システムではLINEでメッセージ通知するためにLINE API(Messaging API)を使用します。

LINEで以下のようなメッセージが送信されます。

Oura Ringとは

Oura Ringとは、指輪型のウェアラブルデバイス(スマートリング)で、睡眠、日中の活動量、心身の状態を24時間計測し、専用アプリで健康情報を分析したデータを確認することができます。同じウェアラブル端末で健康状態を計測できるデバイスであるスマートウォッチより手軽に装着でき、高精度センサーによるデータ計測が可能です。

以下のような専用アプリでOura Ringから取得した情報を確認することができます。

LINE APIとは

LINE APIとは、コミュニケーションアプリである「LINE」を外部サービスやシステムと連携させるための一連の RESTful API群です。主にチャットボット開発、ユーザー認証、Web アプリ埋め込みなど、多彩な機能をプログラムから操作・利用することができます。
今回はそんなAPIの中から、APIを介してLINEにメッセージを送信できる機能をもつ「Messaging API」を使用します。

Oura Ring API(Oura Cloud API)とは

Oura Ring APIは、指輪型ウェアラブルデバイス「Oura Ring」が計測した睡眠・活動・回復度などのヘルスデータを、外部アプリケーションやサービスからプログラム的に取得・活用できる RESTful API 群です。
Oura Ringから連携されたクラウド上に保存されているデータを取得することができます。

現状の問題と本システム作成動機

Oura Ringは専用のアプリを提供してくれているいるのですが、日常の動線に専用のアプリを開くということがなく、気づいたときにはOura Ringの充電が切れていて、健康状態が取得できていない期間があるなど問題があります。

上記の問題を解決するためにOura Ringの残電力情報や健康状態を自動通知してくれるシステムが欲しいなと思い今回のアプリケーションを作成しました。

詳細な情報は専用アプリを観ればいいので、健康情報の概要情報とOura Ringの残電力情報のみを自動送信させます。

システム概要

今回コードを書いて開発する部分は、定期的にOura Ring APIから健康情報を取得&整形し、LINE APIを経由してLINEアプリにメッセージを送信するバッチになります。

Oura Ringは専用アプリを起動した際に、リングからデータを連携され、そのタイミングでクラウド上にも保存されます。そのため画面を起動してない日はデータがクラウド上に連携されておらず、Oura Ring APIを叩いても、データが取得できないという問題があります。

そこでTaskerというスマホ自動化ツールを使い定期的にOura Ringの専用アプリを起動させ、データ連携を行います。

Oura API 設定

Oura Ringから取得した情報を取得することができるAPIが提供されています。
ここではそのAPIにアクセスするために必要なアクセストークンをOuraRing公式サイトから取得します。
以下のOura APIのドキュメントにアクセスし、左側にあるPersonal Access Tokensを選択します。

次に画面右上部にある[Create New Personal Acceess Token]ボタンを選択します。

画面遷移後、Noteに任意の名前を入力し、[Create Personal Access Token]ボタンを選択し、アクセストークンを発行します。

一度画面を離れてしまったり、リロードするとアクセストークンが表示&コピーすることができなくなるので、忘れないようにコピーしどこかにメモっておきます。

取得したアクセストークンは以下のようにAuthorizationヘッダー部分に付与してAPIを叩きます。
Authorization: Bearer PHCW3OVMXQZX5FXXXXXXXXXXXXXXXX
以下の公式ドキュメントを基に必要な情報を取得するためにAPIにリクエストを送信します。
https://cloud.ouraring.com/v2/docs

今回は以下のエンドポイントを使用します。

https://api.ouraring.com/v2/usercollection/daily_activity
https://api.ouraring.com/v2/usercollection/sleep
https://api.ouraring.com/v2/usercollection/daily_sleep

LINE API 設定

今回使用するのはMessaging APIの以下のユーザー、グループトーク、または複数人トークに、任意のタイミングでメッセージを送信するAPIです。
無料メッセージ数:200/月(2025年4月時点)

POST https://api.line.me/v2/bot/message/push

https://developers.line.biz/ja/reference/messaging-api/#send-push-message

上記のAPIを使用するために必要な設定を行います。概ね以下の公式サイトを参考にセットアップします。
https://developers.line.biz/ja/docs/messaging-api/getting-started/

LINE Developersコンソールログイン

以下のサイトからLINE Developersコンソールにログインします。

LINEビジネスIDを保持しているアカウントがあればそれでログインします。
今回はアカウントを作成を選択し、新たにLINEビジネスIDを保持するアカウントを作成します。

普段使っている個人LINEアカウントかメールアドレスを使ってアカウントを作成します。
個人用途向けに作成された本システムの性質上、普段使っている個人LINEアカウント(送り先)を使用して作成します。
本システムで使用している以下のAPIではメッセージ送信先のアカウントIDが必要であり、個人アカウントで作成するとLINE Developersコンソールからメッセージ送信先のアカウントIDが確認でき、そちらをAPIを叩く時の送り先として設定できるためです。

POST https://api.line.me/v2/bot/message/push

LINEアカウントを使用して作成する場合はQRコード読み取ってログインするだけで簡単に作成することができます。

ログイン後、プロバイダを作成します。

適当なプロバイダ名を入力し、[作成]ボタンを選択します。

プロバイダ作成後、以下の画面に遷移するのでMessageing APIを選択し、チャンネルを作成します。

LINE 公式アカウント作成&Messaging API有効化

以下の[LINE公式アカウントを作成する]ボタンからLINE公式アカウントを作成します。SMS認証が必要な場合は有効な電話番号を入力し、認証を行います。

LINE公式アカウントの作成画面で必要な情報を入力し、公式アカウントを作成します。


公式アカウント作成後[LINE Official Account Manager]からLINE Official Account Managerに遷移します。

LINE Official Account Managerのホーム画面左上部にある設定を選択します。

左側のナビゲーションエリアから設定>Messaging APIを選択し、[Messaging APIを利用する]ボタンを選択し利用設定を有効にします。

プロバイダを選択する子画面が表示されるので、先ほど作成作成したプロバイダを選択し[同意する]ボタンを選択します。

プライバシーポリシーと利用規約が記載されたサイトを登録することができますが今回は未登録で[OK]ボタンを選択します。

内容を確認し問題なければ[OK]ボタンを選択しMessaging API有効化します。

公式アカウント追加&ユーザID確認

LINE Developersコンソールから先ほど作成したチャンネルが表示されることを確認できます。
チャンネルを選択し、アクセストークンの発行及び必要な設定変更を行います。

チャンネル選択後、チャネル基本設定タブを選択し、画面を一番下までスクロールします。

あなたのユーザーIDの部分でUXXXXXXXXXXXXXXXXのように自身のユーザIDが表示されているので、コピーしメモっておきます。
APIを使ってメッセージを送信する際に送信先としてこのユーザIDを指定します。

次にMessaging API設定タブを選択します。
ここで表示されているQRコードを読み取ることで作成した公式アカウントを友達追加することができます。

Webhook、応答メッセージ、あいさつメッセージの設定確認

Webhookを使用する場合はWebhookイベントを受信するサーバ、bot等のURLを記載します。
今回の用途では不要なので、未設定のまま先に進みます。
ユーザがLINEでメッセージを送信したら何か処理したいなどの機能拡張がある場合は設定したいと思います。

応答メッセージとあいさつメッセージは本システムには不要なので無効に変更します。(デフォルトでは有効)
[編集]ボタンを選択するとLINE Official Account Managerに選択するので該当箇所を無効にします。

アクセストークン発行

チャネルアクセストークン(長期)の部分にある[発行]ボタンを選択し、アクセストークンを発行します。

アクセストークンが表示されるコピーし、どこかにメモっておきます。
[再発行]ボタンを選択し、アクセストークンを再発行することも可能です。

以下のように{channel access token}部分に発行したアクセストークンを付与し、{to user id}に送信先のLINEユーザIDを設定してAPIを叩きます。

sh
curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": "{to user id}",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'

Tasker 設定

Taskerはandroidの自動化ツールです。
今回は定期的にリングからデータを連携させるために専用アプリ(以下Ouraアプリ)を起動させることを行います。

私も使うのが初めてなので、詳しい操作方法などは公式ドキュメントや他の記事を確認してください。
ここでは本システムに必要な設定のみ行います。
本システムでは毎9、21時にOura Ring情報取得とLINEメッセージ送信が行われますので、それまでにOuraアプリを起動させリングからデータを連携させておく必要があります。
そのため8:45、20:45にOuraアプリをTaskerを使って自動起動させるようにします。

  1. アプリを起動
    インストール後、アプリを起動させます。

  2. プロファイル作成
    起動後、以下の画面が表示されるので、画面右下部の+を選択します。
    ここではアプリ起動の条件を設定します。

    今回は指定した時間にアクション(アプリ起動)をして欲しいので、以下のプルダウンから時刻を選択します。

    以下のように開始(8:45)を入力し、終了をタップし終了時刻を設定しないようにします。
    今回は20:45にも同じように実行して欲しいので繰返し部分に12時間を設定します。
    入力が完了したら画面左上の←を選択します。

  3. タスク作成
    ここでは条件に合致したときどのような処理を実行するかというタスク作成します。実際にアプリを起動する部分の設定を行います。
    新しいタスクの+を選択します。

    適当なタスク名を入力し、✓を選択します。

    タブ遷移後、以下の画面が表示されるので、画面右下部の+を選択します。

    以下の画面から[アプリ]を選択します。

    以下の画面から[アプリ起動/Launch App]を選択します。

    アプリ選択画面でOuraアプリを選択します。

    以下の画面で[常に新規に起動する]のチェックボックスに✓を入れます。
    設定後、画面左上の←を選択します。

    画面左上の←を選択します。

    画面上部の✓を選択し設定を完了させます。

    プロファイル名を長押し、画面上部の【A】を選択することで、プロファイル名を変更します。適当な名前を入力し、画面上部の✓を選択し設定を完了させます。


    以上で設定完了です。設定した時間にOuraアプリが起動するか確認し、起動すれば適切に設定を行えてます。

実装

定期的にOuraRingから情報を取得し、その情報をLINEに送信するバッチを実装しました。
以下がそのアプリケーションの全コードになります。コードの詳細はこちらからご確認ください。
https://github.com/takeru-a/oura_line_bot

大まかな処理の流れとしては以下になります。

  1. envファイルからアクセストークンやLINEユーザIDを読み込む
  2. Oura Ring APIからデータを取得
  3. 取得データからメッセージを作成
  4. 上記で作成したメッセージを指定し、LINE APIに送信

以下にバッチ実行時に送られるメッセージ例を示します。
処理が完了すると以下のようなメッセージがLINEアプリに送信されます。
■ データ取得できた場合

■ データ取得できなかった場合

ビルド&デプロイ

デプロイ先のサーバは適当なものを選んでください。VPSでもAWSのEC2でも自宅サーバ、家にあるRaspberry Piでもなんでもいいです。

私は以下の記事で構築したマイクラサーバと同居させる形でVPS上にデプロイします。
https://zenn.dev/goal_a/articles/01c9f5aa8eede9

ビルド

Goはクロスプラットフォームに対応するようにアーティファクト(バイナリファイル)を生成することができます。(クロスコンパイル可能)

各プラットフォームで動作するアーティファクトを生成するので、サーバにGoの実行環境は不要でデプロイ作業としてはビルドしたアーティファクトと必要であればプロパティファイルを配置するだけで完了します。

GOOSにデプロイ先のプラットフォームを、GOARCHにデプロイ先のcpuアーキテクチャを指定し、デプロイ先の環境に合わせたアーティファクトを作成します。

GOOS GOARCH Description
linux amd64 64-bit Linux
linux arm64 64-bit ARM Linux
darwin amd64 macOS x86_64
darwin arm64 macOS M1 (Apple Silicon)
windows amd64 64-bit Windows
windows 386 32-bit Windows

デプロイ先のサーバにssh接続し、以下のコマンドを実行しサーバのcpuアーキテクチャを確認します。
私の環境のcpuアーキテクチャは以下のコマンドで確認したところx86_64でした。

# cpuアーキテクチャを確認
uname -m

今回はWindows機でLinux(x86_64)向けにビルドします。

Powershell
# 環境変数の設定
$env:GOOS = "linux"
$env:GOARCH = "amd64"
# ビルド
go build -o app
# 環境変数の削除
Remove-Item env:GOOS
Remove-Item env:GOARCH

デプロイ

ビルドして生成したアーティファクト(バイナリファイル)であるappと環境変数を定義している.envファイルをサーバにデプロイします。
scpコマンドかwinscp等のツールを使いサーバの適切なディレクトリに配置してください。

サーバにデプロイ完了後、配置先のディレクトリ配下で以下のコマンドを実行し正常に動作することを確認します。

# 実行権限付与
chmod +x ./app

# 権限確認
ls -l

# 実行
./app

問題なくLINEにメッセージが送信されていればビルド&デプロイが適切に行えています。

定期実行設定

cronを使用し、バイナリファイルを定期実行させます。
以下のコマンドを実行しcrondサービスが動作しているか確認してください。

# crondサービスの確認
sudo systemctl status crond

# 起動(サービスが起動していない場合のみ実行)
sudo systemctl start crond

# 自動起動有効化(サービスが自動起動が無効の場合のみ実行)
sudo systemctl enable crond

# 再起動
sudo systemctl restart crond

crondで定期実行するにあたってサーバのタイムゾーンが異なっていると想定時間に実行されないので、タイムゾーンを JST(Asia/Tokyo)に設定します。
以下のコマンドを実行し設定します。dateコマンドやtimedatectl statusを実行して、既にタイムゾーンがJST(Asia/Tokyo)になっている場合は以降のコマンドは実行不要です。

# 現在時刻の確認
date
# 現在のタイムゾーン確認
timedatectl status
# タイムゾーンを Asia/Tokyo に変更
sudo timedatectl set-timezone Asia/Tokyo
# 確認
date
timedatectl status

# crond再起動
sudo systemctl restart crond
# crond確認
sudo systemctl status crond

それでは crontabでcronの設定を記載します。以下のコマンドを実行し設定内容を編集してください。
本システムでは9時と21時にOura Ringの情報を取得し、LINEにメッセージを送信します。
標準出力・標準エラーをlogsディレクトリ配下のログファイルに追記するようにしているので、logsがない場合は作成してください。

crontab -e

以下設定内容なります。
わざわざcdしてディレクトリを移動してからバイナリファイルを実行しているのはそうしないとcronが.envファイルを見つけれないためです。

crontab
# 毎日 9:00 と 21:00 にbotを実行
0 9,21 * * * cd /home/botuser/oura_line_bot && ./app >> /home/botuser/oura_line_bot/logs/oura_line_bot.log 2>&1

上記内容で編集し、保存してエディタを閉じれば、自動的に crond が再読み込みし、指定時刻にジョブが実行されます。

指定した時間にメッセージが届いていれば適切に設定できており、定期実行設定完了になります。

終わりに

これのシステムで自身の健康状態を把握するような習慣ができればいいなと思っております。
あと棚ぼた的なことですが、Taskerという便利な自動化ツールを知れて良かったです!
習慣化のサポートなど色々なことに使えそうだなと思います。

参考

https://developers.line.biz/ja/reference/messaging-api/#send-push-message
https://developers.line.biz/ja/docs/messaging-api/getting-started/
https://zenn.dev/kou_pg_0131/articles/line-push-text-message
https://qiita.com/onm/items/46e2aaa4fe3d26b4f246
https://tasker-userguide.pralin.info/
https://zenn.dev/urabexon/articles/a1bd93088ff98a
https://kitagry.github.io/blog/programmings/2020/12/windows_go_build_for_linux/
https://qiita.com/yuzo_____/items/1b8af6e04ffa2baa1cab

Discussion