AIとAPIで眠りを科学する：プログラミング初心者CEOが挑んだ、睡眠スコア取得への道

## 概要
この記事では、当社CTOや社員が生成AIを使ったプログラミングの話をしているのを聞き、プログラムの知識は多少あるものの、実際にプログラムを書いたことのない私が、ChatGPTの支援を受けながら、Oura RingのAPIを使用して睡眠スコアを取得するまでのプロセスを解説した記事です。

環境設定から始まり、APIの使用、エラーへの対処、そして最終的な成功までの道のりを紹介します。この記事を通じて、AIツールを活用したプログラミング学習の可能性と、新しい技術へのチャレンジの楽しさを共有したいと思います。

## 目次
1. [はじめに：なぜこの挑戦をしたのか](#-はじめになぜこの挑戦をしたのか)
2. [準備編：道具を揃えよう](#-準備編道具を揃えよう)
   - Pythonのインストール
   - PIPのインストール
   - VS Codeのセットアップ
3. [挑戦編：ChatGPTとの対話でコードを生み出す](#-挑戦編ChatGPTとの対話でコードを生み出す)
   - 最初の一歩：基本的なコードの生成
   - つまずきと学び：エラーとの戦い
   - 気づきと改善：APIエンドポイントの修正
   - 成功への道：最後の調整
4. [結果：ついに睡眠スコアを手に入れた！](#-結果ついに睡眠スコアを手に入れた)
5. [学びと気づき](#-学びと気づき)
6. [次のステップ](#-次のステップ)

## 🌟 はじめに：なぜこの挑戦をしたのか

私は日頃から睡眠に良いとされるものは積極的に取り入れ、睡眠の質に自信を持っていましたが、ある日試したS'UIMINというサービスで、予想外の「D（すぐに病院に行きなさい）」評価を受けました。無呼吸症候群の可能性を指摘され、大きなショックを受けたのです。この記事は別途[note](https://note.com/saisontechnology/n/n797f4703e5ed)に投稿していますので、興味がある方はご覧ください。

この経験から、私はOura Ringを着用し始め、睡眠データをより深く活用したいと考えるようになりました。プログラミングの知識は多少あるものの、実際にコードを書いた経験はありません。そこで、AIの力を借りてこの壁を乗り越え、睡眠データを詳細に分析することを決意しました。

## 🛠 準備編：道具を揃えよう

※準備に関しては、セキュリティのリスク等もあるので、社員に聞きながら進めました。

### 1. Pythonのインストール
- [公式サイト](https://www.python.org/)からダウンロード
- **重要ポイント**: インストール時に「Add Python 3.x to PATH」にチェックを入れること！
  これにより、どのディレクトリからでもPythonを実行できるようになります。

### 2. PIP（Pythonのパッケージ管理ツール）のインストール
- コマンドプロンプトを開き、今回のプログラムに必要なパッケージを以下のコマンドで取得しました:
  ```
  pip install requests
  ```

### 3. VS Code(Visual Studio Code)のセットアップ
- [VS Codeの公式サイト](https://code.visualstudio.com/)からダウンロードしインストール
- Python拡張機能のインストール:
  1. VS Codeを開く
  2. 左側のExtensionsアイコンをクリック
  3. 検索バーに「Python」と入力
  4. Microsoft公式のPython拡張機能を見つけてインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843344/ad1b3eb5-b487-6876-01e6-0757de65efda.png)


詳細な手順は[こちらの記事](https://qiita.com/aki34/items/6d5e4f5d6036b9bcd63e)も参考になります。

## 💡 挑戦編：ChatGPTとの対話でコードを生み出す

### 1. 最初の一歩：基本的なコードの生成
ChatGPTに[Oura RingのAPIドキュメント](https://cloud.ouraring.com/v2/docs)を読み込ませ、その後ろに以下のようなプロンプトを記述しました：

```
PythonでOura RingのAPIを使用し、昨日の睡眠スコアを取得するプログラムを書いてください。
```

ChatGPTが生成したコード：

```python
import requests
from datetime import datetime, timedelta

# Ouraパーソナルアクセストークン
PERSONAL_ACCESS_TOKEN = 'YOUR_OURA_API_TOKEN'  # ここにあなたのアクセストークンを挿入

# エンドポイントURL
url_sleep = 'https://api.ouraring.com/v2/usercollection/sleep'

# 日付範囲の計算（昨日の範囲を設定）
yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')

# パラメータ設定
params = {
    'start_date': yesterday,
    'end_date': yesterday,
}

# ヘッダーにトークンを設定
headers = {
    'Authorization': f'Bearer {PERSONAL_ACCESS_TOKEN}'
}

# APIからデータを取得
response_sleep = requests.get(url_sleep, headers=headers, params=params)

# レスポンスの確認
if response_sleep.status_code == 200:
    sleep_data = response_sleep.json().get('data', [])
    
    if sleep_data:
        yesterday_sleep = sleep_data[0]  # 延べデータは単一のデータであるべき
        sleep_score = yesterday_sleep.get('score', 'N/A')
        print(f"昨日 ({yesterday}) の睡眠スコア: {sleep_score}")
    else:
        print(f"昨日 ({yesterday}) の睡眠データが見つかりませんでした。")
else:
    print("睡眠データの取得エラー:", response_sleep.status_code, response_sleep.json())
```

### 2. つまずきと学び：エラーとの戦い
生成されたプログラムの「'YOUR_OURA_API_TOKEN'  # ここにあなたのアクセストークンを挿入」というエリアに自分のトークンを記載してコードを実行すると、「昨日の睡眠データが見つかりませんでした」というメッセージが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843344/5b26844d-142d-77b3-4ccc-0327877c6e42.png)

ChatGPTにこの対処方法を聞いてみると、以下の回答と新しいプログラムを得ました。

```
- UTC時間を使用：datetime.utcnow() を使用してUTC時間を基に日付を計算しています。
  これにより、サーバー時間とローカル時間のずれを避けることができます。

- データフォーマットの確認：API応答のデータフォーマットが正しいかを再度確認してください。

- エラーログの確認：APIのレスポンスで返ってくるJSONオブジェクトにエラーの詳細が含まれている
  可能性があります。それも確認するようにしましょう。
```

```diff_python
# 日付範囲の計算（昨日の範囲を設定）
- yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
+ yesterday = (datetime.utcnow() - timedelta(days=1)).strftime('%Y-%m-%d')
```

しかし、新しく生成されたプログラムを実行しても、また、昨日 (2024-07-21) の睡眠データが見つかりませんでした。と返事が来たので、改めて先ほどの回答にあった、「API応答のデータフォーマットが正しいかを再度確認してください。」を参考にプログラムの該当部分を確認しました。


### 3. 気づきと改善：APIエンドポイントの修正
さきほどのChatGPTの助言を参考に、Oura RingのAPI公式ドキュメントを再確認したところ、エンドポイントが間違っていることに気づきました。正しいエンドポイントは`daily_sleep`でした。そのため、「エンドポイントdaily_sleepのscoreからデータを取得するように、プログラムを変更してください。」とChatGPTにお願いしました。

```diff_python
# エンドポイントURL
- url_sleep = 'https://api.ouraring.com/v2/usercollection/sleep'
+ url_sleep = 'https://api.ouraring.com/v2/usercollection/daily_sleep'
```

### 4. 成功への道：最後の調整

新しいプログラムでは、無事睡眠スコアを取得することが出来ました。
コンソールに表示された睡眠スコアは、”89”です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843344/037bd05e-a40a-3f49-1796-811aa88590c4.png)

動作検証をしようとスマホを開き、公式アプリで実際のデータを確認してみると、なんと睡眠スコアは”88”です。何かが違う。どうやら“88”はおとといの夜の睡眠スコアのようです。

もともと昨日の睡眠スコアを取得するようにお願いしていたので、昨日＝おととい、という認識なのだと思い、ChatGPTには、完成したプログラムを元に今日の睡眠スコアを取得するように変更をお願いしました。

## 🎉 結果：ついに正しい睡眠スコアを手に入れた！

最終的に以下のようなコードで昨晩の睡眠スコア「88」を取得することができました：

```python
import requests
from datetime import datetime

# Ouraパーソナルアクセストークン
PERSONAL_ACCESS_TOKEN = 'YOUR_OURA_API_TOKEN'  # ここにあなたのアクセストークンを挿入

# エンドポイントURL
url_sleep = 'https://api.ouraring.com/v2/usercollection/daily_sleep'

# 日付範囲の計算（今日の範囲を設定）
today = datetime.utcnow().strftime('%Y-%m-%d')

# パラメータ設定
params = {
    'start_date': today,
    'end_date': today,
}

# ヘッダーにトークンを設定
headers = {
    'Authorization': f'Bearer {PERSONAL_ACCESS_TOKEN}'
}

# APIからデータを取得
response_sleep = requests.get(url_sleep, headers=headers, params=params)

# レスポンスの確認
if response_sleep.status_code == 200:
    sleep_data = response_sleep.json().get('data', [])
    
    if sleep_data:
        today_sleep = sleep_data[0]  # データは単一のデータであるべき
        sleep_score = today_sleep.get('score', 'N/A')
        print(f"今日 ({today}) の睡眠スコア: {sleep_score}")
    else:
        print(f"今日 ({today}) の睡眠データが見つかりませんでした。")
else:
    print("睡眠データの取得エラー:", response_sleep.status_code, response_sleep.json())
```
この数字の向こうに、より良い睡眠と健康な生活があると思うと、わくわくしませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843344/fe562a73-5183-6895-3259-6ff0ca53917b.png)

## 🧐 学びと気づき

1. **AIは強力な助っ人：** ChatGPTの存在が、プログラミング初心者の私にとって大きな支えとなりました。
2. **エラーは友達：** つまずきや間違いは、学びの宝庫です。諦めずに向き合うことで、理解が深まります。
3. **公式ドキュメントの重要性：** AIの助言も大切ですが、公式ドキュメントを自分の目で確認することも欠かせません。

## 🚀 次のステップ

この経験を通じて、テクノロジーの可能性と自分自身の可能性を再確認できました。
次は、以下のようなことにチャレンジしていきたいと思います：

1. 取得したデータの可視化
2. 他のウェアラブルデバイスとの連携
3. 睡眠スコアと日中のパフォーマンスの相関分析

皆さんも、ぜひ自分の興味のある分野で、AIを活用しながら新しいことにチャレンジしてみてください。きっと、素晴らしい発見があるはずです！

最後に、この記事が誰かの「プログラミングへの第一歩」になれば幸いです。技術の世界は広大で、常に新しい挑戦が待っています。一緒に学び、成長していきましょう！

### お知らせ
Xにて睡眠や会社のこと、自分の趣味（音楽、アート、自転車など）に関することを発信していますので、よかったらこちらのアカウントのフォローもお願いします。

https://x.com/MakotoHayama279