#!/usr/bin/env python3 """ Скрипт для тестирования API FatSecret с использованием OAuth 1.0 """ import os import time import hmac import base64 import random import hashlib import urllib.parse import requests from dotenv import load_dotenv # Загружаем .env файл current_dir = os.path.dirname(os.path.abspath(__file__)) env_path = os.path.join(current_dir, ".env") load_dotenv(env_path) print(f"✅ Loaded .env from: {env_path}") # Получаем API ключи из переменных окружения FATSECRET_KEY = os.environ.get("FATSECRET_CUSTOMER_KEY") or os.environ.get("FATSECRET_CLIENT_ID") FATSECRET_SECRET = os.environ.get("FATSECRET_CLIENT_SECRET") if not FATSECRET_KEY or not FATSECRET_SECRET: raise ValueError("FatSecret API keys not found in .env file") print(f"🔑 Using FatSecret API keys: KEY={FATSECRET_KEY[:8]}...") print(f"🔑 Using FatSecret SECRET (first few chars): {FATSECRET_SECRET[:5]}...") def generate_oauth_params(http_method, url, params): """Создание и подписание OAuth 1.0 параметров""" # Текущее время в секундах timestamp = str(int(time.time())) # Случайная строка для nonce nonce = ''.join([str(random.randint(0, 9)) for _ in range(8)]) # Базовый набор параметров OAuth oauth_params = { 'oauth_consumer_key': FATSECRET_KEY, 'oauth_nonce': nonce, 'oauth_signature_method': 'HMAC-SHA1', 'oauth_timestamp': timestamp, 'oauth_version': '1.0' } # Объединяем с параметрами запроса all_params = {**params, **oauth_params} # Сортируем параметры по ключу sorted_params = sorted(all_params.items()) # Создаем строку параметров для подписи param_string = "&".join([f"{urllib.parse.quote(str(k))}={urllib.parse.quote(str(v))}" for k, v in sorted_params]) # Создаем строку для подписи signature_base = f"{http_method}&{urllib.parse.quote(url, safe='')}&{urllib.parse.quote(param_string, safe='')}" # Создаем ключ для подписи signing_key = f"{urllib.parse.quote(str(FATSECRET_SECRET), safe='')}&" # Создаем HMAC-SHA1 подпись signature = base64.b64encode( hmac.new( signing_key.encode(), signature_base.encode(), hashlib.sha1 ).digest() ).decode() # Добавляем подпись к параметрам OAuth all_params['oauth_signature'] = signature return all_params def search_food(query, max_results=5, locale=None): """Поиск продуктов по названию с использованием OAuth 1.0""" print(f"\n🔍 Searching for '{query}'{' with locale ' + locale if locale else ''}...") # URL для API url = "https://platform.fatsecret.com/rest/server.api" # Параметры запроса params = { 'method': 'foods.search', 'search_expression': query, 'max_results': max_results, 'format': 'json' } # Добавляем локаль если указана if locale: params['language'] = locale # Получаем подписанные OAuth параметры oauth_params = generate_oauth_params("GET", url, params) try: # Отправляем запрос response = requests.get(url, params=oauth_params) print(f"📥 Response status code: {response.status_code}") if response.status_code == 200: print("✅ Search successful!") result = response.json() return result else: print(f"❌ Error during search: {response.status_code}") print(response.text) return None except Exception as e: print(f"❌ Exception during search: {e}") return None def process_search_results(result): """Обработка и вывод результатов поиска""" if not result or "foods" not in result: print("❌ No valid results found") return foods_data = result["foods"] if "food" not in foods_data: print("⚠️ No food items found") return food_list = foods_data["food"] if not isinstance(food_list, list): food_list = [food_list] # Если только один результат, оборачиваем в список print(f"📊 Found {len(food_list)} results") # Выводим первые 3 результата for i, food in enumerate(food_list[:3]): food_name = food.get("food_name", "Unknown") food_id = food.get("food_id", "Unknown") food_desc = food.get("food_description", "No description") print(f" {i+1}. [{food_id}] {food_name}") print(f" {food_desc}") def main(): """Основная функция для тестирования API FatSecret""" print("\n🚀 Starting FatSecret API test with OAuth 1.0...\n") # Тестируем поиск продуктов на английском search_queries = ["PowerAde", "Americano", "Coca-Cola", "chicken breast"] for query in search_queries: result = search_food(query) if result: process_search_results(result) # Тестируем поиск продуктов на русском russian_queries = ["Барни", "хлеб", "яблоко"] for query in russian_queries: result = search_food(query, locale="ru_RU") if result: process_search_results(result) print("\n✅ Test completed!") if __name__ == "__main__": main()