PythonでFitbit(2)

本ページの概要
Fitbitで測定した24時間心拍,24時間歩数,睡眠時間を,1週間分取得する方法を学習します。

PythonでFitbitデータを取得する
下記のプログラム「getWeekHR.py」をエディタで開発ディレクトリに作成し,USER_ID ,CLIENT_SECRET をセットします。さらにプログラム末尾の,
today=date(2025, 10, 15)
for var in range(0, 7):
部分をセットします。上記は「2025/10/15から遡って7日間のデータを取得する」という処理になります。
ターミナル上で,
python getWeekHR.py
と入力し,実行する。正常に動作すると,
「23QTVF_HR.csv」のようなファイルが開発ディレクトリに作成される。「getWeekSLEEP.py」,「getWeekSTEP.py」も同様に使用する。

#getWeekHR.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
     
print('getWeekHR.py') 
USER_ID     = "hogehoge"; 
CLIENT_SECRET = "hogehoge"
     
def requestFitbit(DATE):
    rval=""
    global auth2_client,USER_ID 
    
    fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
    HRstats = fitbit_stats['activities-heart-intraday']['dataset']
       
    OUTPUT_FILE = USER_ID+"_HR.csv"
    csv_file = open(OUTPUT_FILE, 'a')
      
    csv_file.write(DATE+",")
    for num1 in range(24):
        for num2 in range(60):
            key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
            hr=""
            for var in range(0, len(HRstats)):
                if str(HRstats[var]['time']) == key:
                    hr=str(HRstats[var]['value'])
                    break
            csv_file.write(hr)
            csv_file.write(",")              
                
    csv_file.write("\n")
    csv_file.close()
    return rval
##################################################
    
def writeindex():    
    global USER_ID 
    OUTPUT_FILE = USER_ID+"_HR.csv"
    csv_file = open(OUTPUT_FILE, 'a')
        
    csv_file.write(",")
    for num1 in range(24):
        for num2 in range(60):
            key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
            csv_file.write(key)
            csv_file.write(",")              
                
    csv_file.write("\n")
    csv_file.close()
##################################################
    
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
     
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
     
"""request"""
    
writeindex()
today=date(2025, 10, 15)
for var in range(0, 7):
    stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print("target: " + stamp)
    requestFitbit(stamp)
#getWeekSTEP.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta

print('getWeekSTEP')
USER_ID     = "hoge"; 
CLIENT_SECRET = "hoge"


def requestFitbitSteps(DATE):
    global auth2_client, USER_ID

    fitbit_stats = auth2_client.intraday_time_series('activities/steps', DATE, detail_level='1min')
    STEPstats = fitbit_stats['activities-steps-intraday']['dataset']

    OUTPUT_FILE = USER_ID + "_STEP.csv"
    with open(OUTPUT_FILE, 'a') as csv_file:
        csv_file.write(DATE + ",")
        for hour in range(24):
            for minute in range(60):
                key = '{:02}:{:02}:00'.format(hour, minute)
                steps = ""
                for entry in STEPstats:
                    if entry['time'] == key:
                        steps = str(entry['value'])
                        break
                csv_file.write(steps + ",")
        csv_file.write("\n")

def writeStepIndex():
    OUTPUT_FILE = USER_ID + "_STEP.csv"
    with open(OUTPUT_FILE, 'a') as csv_file:
        csv_file.write(",")
        for hour in range(24):
            for minute in range(60):
                key = '{:02}:{:02}:00'.format(hour, minute)
                csv_file.write(key + ",")
        csv_file.write("\n")

# OAuth2 認証
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])

auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True,
                             access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)

# 実行処理
writeStepIndex()
today = date(2025, 10, 15)
for i in range(7):
    target_date = datetime.strftime(today - timedelta(days=i), '%Y-%m-%d')
    print("target: " + target_date)
    requestFitbitSteps(target_date)

#getWeekSLEEP.py
import sys
import fitbit
import pandas as pd
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
  
print('getWeekSLEEP') 
USER_ID     = "hoge"; 
CLIENT_SECRET = "hoge"


def requestFitbit(DATE):
    rval=""
    global auth2_client,USER_ID 
 
    #fitbit_stats = auth2_client.intraday_time_series('activities/minutesSedentary', DATE, detail_level='1min')
    #HRstats = fitbit_stats['activities-minutesSedentary-intraday']['dataset']
    
    sleep_data = auth2_client.sleep(date=DATE)    
    #print(DATE+"睡眠データ取得実行しました") 

    #OUTPUT_FILE = "SLEEP.csv"
    OUTPUT_FILE = USER_ID+"_SLEEP.csv"    
    csv_file = open(OUTPUT_FILE, 'a')
    csv_file.write(DATE+",")

    sleepcnt=len(sleep_data["sleep"])
    #print(str(sleepcnt)+"回眠っています") 
    
    if sleepcnt>0:

        totallength=0;
        TAfter=0;
        TFall=0;
        TAwake=0;
        TLessCnt=0;
        TLessDur=0;
        TEffi=0;
        for var in range(0, sleepcnt):
            #print("睡眠:"+str(var)) 
            totallength+=sleep_data["sleep"][var]["minutesAsleep"] #総睡眠時間
            TAfter+=sleep_data["sleep"][var]["minutesAfterWakeup"]
            TFall+=sleep_data["sleep"][var]["minutesToFallAsleep"]
            TAwake+=sleep_data["sleep"][var]["minutesAwake"]
            TLessCnt+=sleep_data["sleep"][var]["restlessCount"]
            TLessDur+=sleep_data["sleep"][var]["restlessDuration"]
            TEffi+=sleep_data["sleep"][var]["efficiency"]
        
        #AvgEffi=TEffi/sleepcnt;
        AvgEffi=0;
        print(str(sleepcnt)+"回の睡眠で総睡眠時間は"+str(totallength)+"分です") 
        csv_file.write(str(totallength)+","+str(sleepcnt)+","+str(TAfter)+","+str(TFall)+","+str(TAwake)+","+str(TLessCnt)+","+str(TLessDur)+","+str(AvgEffi)+",")

        for var in range(0, sleepcnt):
            if sleep_data["sleep"][var]["isMainSleep"] == True:
                csv_file.write(sleep_data["sleep"][var]["startTime"]+","+str(sleep_data["sleep"][var]["minutesAsleep"])+","+str(sleep_data["sleep"][var]["efficiency"]))
    else:
        csv_file.write(",,,,,,,,,,,")
        print("睡眠データがありません") 

    csv_file.write("\n")
    csv_file.close()
    
    return rval
##################################################
 
def writeindex():   
    global USER_ID 
    #OUTPUT_FILE = "SLEEP.csv"
    OUTPUT_FILE = USER_ID+"_SLEEP.csv"
    csv_file = open(OUTPUT_FILE, 'a')
                  
    csv_file.write("date,totallength,count,AfterWakeup,FallAsleep,Awake,restlessCount,restlessDur,AvgEffic,MainStart,MainLen,MainEffic\n")
    csv_file.close()
##################################################
 
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
  
#print(ACCESS_TOKEN)  
#print(REFRESH_TOKEN)
 
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
  
"""request"""
#requestFitbit("2022-02-22")
writeindex();   #インデックス記入
#today = datetime.today()
today=date(2025, 10, 15)
for var in range(0, 7):
    #day=today + timedelta(days=1)
    #print(var+":" + datetime.strftime(yesterday, '%Y-%m-%d'))
    stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print("target: " + stamp, end=' ')
    requestFitbit(stamp)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です