UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY38 pythonでデータをトラッキングしてGoogle sheetsにまとめる!

PythonAPIを使ってGoogle Sheetsを連携した作業を学ぶ

目次

2つのAPIを使って何をしたかをデータでまとめる

コンソールにその日に何のエクササイズをしたかを答えるだけでこんな感じでAPIが数値を判断してGoogle Sheetに入力してくれます。 カロリーまで入力してくれる! Nutritionist のAPIを使います。

nutritionix_apiを利用してエクササイズのカロリーを出力してもらう

www.nutritionix.com

nutritionixのサイトへいき、freeを選んでIDとAPI keyを取得します。

pythonのプロジェクトのmain.pyと同じ階層に.envを入れて、API KEYとIDを入力しておきます。

.env
ENV_NUTRITION_ID = "iddayo"
ENV_NUTRITION_KEY = "keydayo"

python-dotenvのパッケージをインストールしてから、読み込みをします。
テンプレはこちら

import os
from dotenv import load_dotenv
from os.path import join, dirname
load_dotenv(verbose=True) #.envファイルが見つからない時にエラーを出す
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

次にnutritionのドキュメントを見ます。

Nutritionix - Track API V2

今回はエクササイズを入力したいので、 エンドポイントは/v2/natural/exerciseになります。

みる感じ

x-user-jwt →apiのidとkeyがheaderとしている query → 質問内容を文章にする gender,weight_kg,height_cm,age 性別、体重、身長、年齢

がいるようなのでこれらも変数定義しておきます。

apiを読み込むときはrequestsがいるので、先にpackageでインストールをするのを忘れずに。

Nutritionix API v2 - Documentation [PUBLIC] - Google ドキュメント

ここのObtaining API Keys & Authenticating部分をみると、 apiのIDとKEYはデータを送信するときは x-app-id、x-app-keyと名付けて入力するとのこと。(gender : 30,みたいに x-app-id: ID という感じ)

あと同じページでExcecise Endpointsをみると、requestはpostにするとのことなのでこれらを理解してからコーディングすると


import requests
import os
from dotenv import load_dotenv
from os.path import join, dirname
load_dotenv(verbose=True) #.envファイルが見つからない時にエラーを出す
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
GENDER = "male"
WEIGHT_KG = 56
HEIGHT_CM = 168
AGE = 27

NUTRITION_ID = os.environ.get("ENV_NUTRITION_ID")
NUTRITION_KEY = os.environ.get("ENV_NUTRITION_KEY")
NUTRITION_ENDPOINT = "https://trackapi.nutritionix.com/v2/natural/exercise"

def get_nutrition_data():
    exercise_text = input("何のエクササイズを何分した?英語で(e.g. ran 15min, swam 30min, walked 1hour): ")

    headers = {
        "x-app-id": NUTRITION_ID,
        "x-app-key": NUTRITION_KEY,
    }
    parameters = {
        "query" : exercise_text,
        "gender": GENDER,
        "weight_kg": WEIGHT_KG,
        "height_cm": HEIGHT_CM,
        "age": AGE,
    }
    r = requests.post(NUTRITION_ENDPOINT, headers=headers, json=parameters)
    result =r.json()
    print(result)


get_nutrition_data()

こんな感じになります。

試しにこれを起動させてみると、

こんな感じでjsonデータを吐き出してくれます。 今回は45分走ったと答えると大体500kcalくらいの消費になるようですね。

Sheetyを利用してSpreadSheetを連携する

sheetyを利用する前に先にスプレッドシートを作っておきます。 表はこんな感じ。

sheety.co

シート作成後にsheetyというサイトへ行き、googleアカウントと連携します。

プロジェクトを新規で作って、スプレッドシートのURLを入力するとこんな感じで読み込んでくれるので、Create Projectをクリック。

そうすると、APIのエンドポイントがGET、POSTなど別に表示される。 URL自体は同じだけど、記述方法はGETとPOSTで少し違うので注意。

GETの場合はデータを拾ってくるだけなので認証のみでよい感じだけど、POSTはどこのセルに何を入力するなど細かい設定も記述しなくてはいけない。

まずはGETを起動して動作するか確認してみる

nutrition apiと同じような感じで、まずはシートのデータを取得する機能を作ってみる。

SheetyのAuthenticationを設定して、Tokenも適当に入力すると、下のAuthorization Headerというところが変わる。ここをheaderを定義していれる。

SHEET_ENDPOINT = "sheety no url dayo"
def get_sheets_data():
    headers = {
        "Authorization": "Bearer tokendayo"
    }

    r = requests.get(SHEET_ENDPOINT, headers=headers)
    result = r.json()
    print(result)

とこんな感じになる。

POSTで書いてみる

GETで無事データが取得できたので、POSTでも書いてみる。

今回はDate,Time,Exercise,Duration,Caloriesの5項目を入力するので、配列でフォーマットを作る。
また、最初に作ったget_nutrition_data()は複数のエクササイズを1度に入力できるので、その度に入力できるようにfor文を使う。

def put_sheets_data():
    result = get_nutrition_data()
    result = result["exercises"]
    for exercise in result:
        sheets_params = {
            "workout": {
                "date": today,
                "time": time,
                "exercise": exercise["user_input"].title(),
                "duration": exercise["duration_min"],
                "calories": exercise["nf_calories"]
            }
        }
        re = requests.post(SHEET_ENDPOINT, headers=headers, json=sheets_params)
        print(re.text)

最初に作ったget_nutrition_data()からjsonデータを取得して、
そのjsonから抜き出したい階層まで移動してからパラメーターを作っています。

for文を使うことで["exercises"]配列から1データずつを入力することで、
ranは15分、カロリー
walkedは14分、カロリー とスプレッドシート1行ずつに入力することができます。

gitはこちら。

github.com