API와 구글 시트

JOOYEUN SEO·2024년 9월 20일

100 Days of Python

목록 보기
38/76
post-thumbnail

🗂️ Day38 프로젝트 : 운동 기록기

수행한 운동에 대해 문장으로 작성하면 자동으로 날짜, 소요 시간, 소모 칼로리를 기록하는 프로그램

💡자연어 처리(NLP)

  • 머신러닝을 사용하여 자연어를 처리하고 해석하는 모델
  • 예) OpenAI는 자연어를 입력하면 모든 텍스트를 검색하여 관련 부분을 찾아냄

1. Nutritionix API 인증과 구글 스프레드시트 준비

🔍 유의 사항

  • Nutritionix API에서 무료 API키 얻기
  • 상수 APP_ID와 API_KEY에 정보 저장
    • 6단계에서 환경변수에 저장하기 때문에 일단 하드코딩하기

⌨️ main.py

APP_ID = "Application ID"
API_KEY = "Application Key"

2. 자연어 쿼리로 운동 통계 얻기

🔍 유의 사항

  • Natural Language for Exercise 참고
  • 텍스트로 간단하게 운동에 대해 입력했을 때, 운동 통계가 JSON 파일로 출력되어야 한다

⌨️ main.py

import requests

# 사용자의 몸무게, 키 나이
WEIGHT_KG = "-kg"
HEIGHT_CM = "-cm"
AGE = "-살"

APP_ID = "Application ID"
API_KEY = "Application Key"

exercise_host_domain = "https://trackapi.nutritionix.com"
exercise_endpoint = "/v2/natural/exercise"
exercise_headers = {
    "x-app-id": exercise_APP_ID,
    "x-app-key": exercise_API_KEY
}
exercise_params = {
    "query": input("Tell me which exercises you did: "),
    "weight_kg": WEIGHT_KG,
    "height_cm": HEIGHT_CM,
    "age": AGE
}

response = requests.post(url=exercise_host_domain + exercise_endpoint,
                         json=exercise_params,
                         headers=exercise_headers)
exercise_result = response.json()
print(exercise_result)
[ 출력 결과 ]

Tell me which exercises you did: ❚i did pilates for 30 minutes
{'exercises': [{'tag_id': 764, 'user_input': 'pilates', 'duration_min': 30, 'met': 3, 'nf_calories': 75, 'photo': {'highres': 'https://d2xdmhkmkbyw75.cloudfront.net/exercise/764_highres.jpg', 'thumb': 'https://d2xdmhkmkbyw75.cloudfront.net/exercise/764_thumb.jpg', 'is_user_uploaded': False}, 'compendium_code': 2105, 'name': 'pilates', 'description': None, 'benefits': None}]}

3. sheety API로 구글시트 준비하기

🔍 유의 사항

  • sheety API
    • ❗️구글 시트의 계정과 동일한 이메일로 가입
    • ❗️Sheety API 무료 멤버십 조건
      • 한 달에 200번의 요청까지만 가능
      • 한 시트 당 100줄까지만 가능
  • 새 프로젝트 생성
    • 프로젝트 이름 : Workout Tracking
    • 스프레드시트 url : 구글 시트 My Workouts의 url
    • API → GET과 POST를 Enabled로 변경

4. 구글시트에 데이터 저장하기

🔍 유의 사항

  • sheety 문서 참고
  • 뉴트리셔닉스 API로 얻은 운동 데이터를 구글 시트의 신규 행으로 추가

⌨️ main.py

import requests
from datetime import datetime

WEIGHT_KG = "-kg"
HEIGHT_CM = "-cm"
AGE = "-살"

APP_ID = "Application ID"
API_KEY = "Application Key"

exercise_host_domain = "https://trackapi.nutritionix.com"
exercise_endpoint = "/v2/natural/exercise"
sheety_url = "https://api.sheety.co/<username>/workoutTracking/workouts"

…

exercise_result = exercise_response.json()

# 현재 날짜와 시간
today_date = datetime.now().strftime("%d/%m/%Y")
now_time = datetime.now().strftime("%X")

# 시트에 추가할 행(중첩된 구조로 만들어야 함)
sheety_inputs = {
    "workout": {
        "date": today_date,
        "time": now_time,
        "exercise": test_result["exercises"][0]["name"].title(),
        "duration": test_result["exercises"][0]["duration_min"],
        "calories": test_result["exercises"][0]["nf_calories"]
    }
}

sheety_response = requests.post(url=sheety_url, json=sheety_inputs)
print(sheety_response.text)

5. sheety API 인증하기

🔍 유의 사항

  • 4단계까지는 누구나 나의 구글 시트에 접근하여 읽고 쓸 수 있음
  • sheety 엔드포인트를 보호하기 위해 Basic 인증 이나 Bearer 인증 중 하나 추가
  • Bearer 인증(토큰 인증)
    • 보안 토큰을 포함하는 HTTP 인증 방식
    • 보안 토큰(Bearer 토큰)은 암호화된 문자열
    • 보안 토큰을 가진 사람은 누구나 스프레드시트에 접근할 수 있도록 허락됨
    • sheety의 경우 직접 생성한 문자열 사용

⌨️ main.py

…
BEARER_TOKEN = "개인 설정"
…
sheety_url = "https://api.sheety.co/<username>/workoutTracking/workouts"
…

sheety_inputs = {
    "workout": {
        "date": today_date,
        "time": now_time,
        "exercise": test_result["exercises"][0]["name"].title(),
        "duration": test_result["exercises"][0]["duration_min"],
        "calories": test_result["exercises"][0]["nf_calories"]
    }
}

bearer_headers = {"Authorization": f"Bearer {BEARER_TOKEN}"}

sheety_response = requests.post(
    url=sheety_url, json=sheety_inputs, headers=bearer_headers
)

6. 환경변수 저장하기

🔍 유의 사항

  • 하드코딩된 개인 정보들을 환경변수로 옮기기
  • Repl.it에서 환경변수를 추가하려면
    ToolSecretsToolSecrets

⌨️ main.py

import requests
from datetime import datetime
import os

WEIGHT_KG = "-kg"
HEIGHT_CM = "-cm"
AGE = "-살"

APP_ID = os.getenv("APP_ID")
API_KEY = os.getenv("API_KEY")
BEARER_TOKEN = os.getenv("BEARER_TOKEN")
SHEETY_URL = os.getenv("SHEETY_URL")

exercise_host_domain = "https://trackapi.nutritionix.com"
exercise_endpoint = "/v2/natural/exercise"

exercise_headers = {
    "x-app-id": APP_ID,
    "x-app-key": API_KEY
}
exercise_params = {
    "query": input("Tell me which exercises you did: "),
    "weight_kg": WEIGHT_KG,
    "height_cm": HEIGHT_CM,
    "age": AGE
}

exercise_response = requests.post(url=exercise_host_domain + exercise_endpoint,
                                  json=exercise_params,
                                  headers=exercise_headers)
exercise_result = exercise_response.json()

today_date = datetime.now().strftime("%d/%m/%Y")
now_time = datetime.now().strftime("%X")

bearer_headers = {"Authorization": f"Bearer {BEARER_TOKEN}"}
sheety_inputs = {
    "workout": {
        "date": today_date,
        "time": now_time,
        "exercise": exercise_result["exercises"][0]["name"].title(),
        "duration": exercise_result["exercises"][0]["duration_min"],
        "calories": exercise_result["exercises"][0]["nf_calories"]
    }
}

sheety_response = requests.post(url=SHEETY_URL,
                                json=sheety_inputs,
                                headers=bearer_headers)




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글