
수행한 운동에 대해 문장으로 작성하면 자동으로 날짜, 소요 시간, 소모 칼로리를 기록하는 프로그램
💡자연어 처리(NLP)
- 머신러닝을 사용하여 자연어를 처리하고 해석하는 모델
- 예) OpenAI는 자연어를 입력하면 모든 텍스트를 검색하여 관련 부분을 찾아냄
🔍 유의 사항
- Nutritionix API에서 무료 API키 얻기
- 상수 APP_ID와 API_KEY에 정보 저장
- 6단계에서 환경변수에 저장하기 때문에 일단 하드코딩하기
⌨️ main.py
APP_ID = "Application ID"
API_KEY = "Application Key"
🔍 유의 사항
- 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}]}
🔍 유의 사항
- sheety API
- ❗️구글 시트의 계정과 동일한 이메일로 가입
- ❗️Sheety API 무료 멤버십 조건
- 한 달에 200번의 요청까지만 가능
- 한 시트 당 100줄까지만 가능
- 새 프로젝트 생성
- 프로젝트 이름 : Workout Tracking
- 스프레드시트 url : 구글 시트 My Workouts의 url
- API → GET과 POST를 Enabled로 변경
🔍 유의 사항
- 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)
🔍 유의 사항
- 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
)
🔍 유의 사항
- 하드코딩된 개인 정보들을 환경변수로 옮기기
- Repl.it에서 환경변수를 추가하려면
Tool→SecretsTool→Secrets
⌨️ 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)