This commit is contained in:
173
test_fatsecret_api_oauth1.py
Executable file
173
test_fatsecret_api_oauth1.py
Executable file
@@ -0,0 +1,173 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user