Files
chat/tests/test_fatsecret_api_oauth1.py
Andrey K. Choi 3050e084fa
All checks were successful
continuous-integration/drone/push Build is passing
main functions commit
2025-10-19 19:50:00 +09:00

173 lines
5.8 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()