Datasourceforcryptocurrency-2 / collectors /hf_crypto_api_client.py
nimazasinich
Crypto API investigation (#117)
ab02ac4
#!/usr/bin/env python3
"""
HuggingFace Crypto Resources API Client
کلاینت برای API منابع کریپتو در HuggingFace Space
این کلاینت برای دسترسی به API منابع کریپتو استفاده می‌شود:
https://really-amin-crypto-api-clean.hf.space
API Endpoints:
- /api/coins/top - برترین ارزها
- /api/trending - ارزهای ترند
- /api/market - خلاصه بازار
- /api/sentiment/global - شاخص ترس و طمع
- /api/resources/stats - آمار منابع
- /api/categories - لیست دسته‌بندی‌ها
- /api/resources/category/{category} - منابع یک دسته
"""
import asyncio
import aiohttp
import requests
from typing import Dict, Any, List, Optional
from datetime import datetime
import logging
logger = logging.getLogger(__name__)
class HFCryptoAPIClient:
"""
Client for HuggingFace Crypto Resources API
کلاینت API منابع کریپتو
"""
BASE_URL = "https://really-amin-crypto-api-clean.hf.space"
def __init__(self, timeout: int = 15):
"""
Initialize client
Args:
timeout: Request timeout in seconds
"""
self.timeout = timeout
self._session = None
# ===== SYNC METHODS =====
def health_check(self) -> Dict[str, Any]:
"""Check API health status"""
return self._get("/health")
def get_top_coins(self, limit: int = 50) -> Dict[str, Any]:
"""
Get top coins by market cap
دریافت برترین ارزها
Args:
limit: Number of coins to return (default: 50)
"""
return self._get("/api/coins/top", params={"limit": limit})
def get_trending(self) -> Dict[str, Any]:
"""
Get trending coins
دریافت ارزهای ترند
"""
return self._get("/api/trending")
def get_market_overview(self) -> Dict[str, Any]:
"""
Get global market overview
خلاصه کلی بازار
"""
return self._get("/api/market")
def get_global_sentiment(self, timeframe: str = "1D") -> Dict[str, Any]:
"""
Get Fear & Greed Index
شاخص ترس و طمع
Args:
timeframe: Timeframe (default: "1D")
"""
return self._get("/api/sentiment/global", params={"timeframe": timeframe})
def get_asset_sentiment(self, symbol: str) -> Dict[str, Any]:
"""
Get sentiment for specific asset
احساسات یک ارز خاص
Args:
symbol: Asset symbol (e.g., "BTC", "ETH")
"""
return self._get(f"/api/sentiment/asset/{symbol}")
def get_resources_stats(self) -> Dict[str, Any]:
"""
Get resources database statistics
آمار منابع
"""
return self._get("/api/resources/stats")
def get_categories(self) -> Dict[str, Any]:
"""
Get list of resource categories
لیست دسته‌بندی‌ها
"""
return self._get("/api/categories")
def get_resources_by_category(self, category: str) -> Dict[str, Any]:
"""
Get resources for a specific category
منابع یک دسته خاص
Args:
category: Category name (e.g., "rpc_nodes", "market_data_apis")
"""
return self._get(f"/api/resources/category/{category}")
def get_all_resources(self) -> Dict[str, Any]:
"""
Get all resources list
لیست همه منابع
"""
return self._get("/api/resources/list")
def get_providers(self) -> Dict[str, Any]:
"""
Get data providers status
وضعیت provider ها
"""
return self._get("/api/providers")
def get_system_status(self) -> Dict[str, Any]:
"""
Get system status
وضعیت سیستم
"""
return self._get("/api/status")
def get_news(self, limit: int = 50) -> Dict[str, Any]:
"""
Get crypto news
آخرین اخبار
Args:
limit: Number of articles to return
"""
return self._get("/api/news", params={"limit": limit})
def get_ohlcv(self, symbol: str = "BTC", interval: str = "1h", limit: int = 100) -> Dict[str, Any]:
"""
Get OHLCV data
داده‌های OHLCV
Args:
symbol: Asset symbol
interval: Time interval
limit: Number of candles
"""
return self._get("/api/ohlcv", params={
"symbol": symbol,
"interval": interval,
"limit": limit
})
def _get(self, endpoint: str, params: Dict = None) -> Dict[str, Any]:
"""Make GET request"""
try:
url = f"{self.BASE_URL}{endpoint}"
response = requests.get(url, params=params, timeout=self.timeout)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
logger.error(f"Request failed for {endpoint}: {e}")
return {"error": str(e), "success": False}
# ===== ASYNC METHODS =====
async def _get_session(self) -> aiohttp.ClientSession:
"""Get or create aiohttp session"""
if self._session is None or self._session.closed:
self._session = aiohttp.ClientSession(
timeout=aiohttp.ClientTimeout(total=self.timeout)
)
return self._session
async def close(self):
"""Close the session"""
if self._session and not self._session.closed:
await self._session.close()
async def _async_get(self, endpoint: str, params: Dict = None) -> Dict[str, Any]:
"""Make async GET request"""
try:
session = await self._get_session()
url = f"{self.BASE_URL}{endpoint}"
async with session.get(url, params=params) as response:
response.raise_for_status()
return await response.json()
except Exception as e:
logger.error(f"Async request failed for {endpoint}: {e}")
return {"error": str(e), "success": False}
async def async_get_top_coins(self, limit: int = 50) -> Dict[str, Any]:
"""Async: Get top coins"""
return await self._async_get("/api/coins/top", params={"limit": limit})
async def async_get_trending(self) -> Dict[str, Any]:
"""Async: Get trending coins"""
return await self._async_get("/api/trending")
async def async_get_market_overview(self) -> Dict[str, Any]:
"""Async: Get market overview"""
return await self._async_get("/api/market")
async def async_get_global_sentiment(self) -> Dict[str, Any]:
"""Async: Get global sentiment"""
return await self._async_get("/api/sentiment/global")
async def async_get_resources_by_category(self, category: str) -> Dict[str, Any]:
"""Async: Get resources by category"""
return await self._async_get(f"/api/resources/category/{category}")
# ===== UTILITY METHODS =====
def get_rpc_nodes(self) -> List[Dict[str, Any]]:
"""Get all RPC node resources"""
data = self.get_resources_by_category("rpc_nodes")
return data.get("resources", [])
def get_market_data_apis(self) -> List[Dict[str, Any]]:
"""Get all market data API resources"""
data = self.get_resources_by_category("market_data_apis")
return data.get("resources", [])
def get_sentiment_apis(self) -> List[Dict[str, Any]]:
"""Get all sentiment API resources"""
data = self.get_resources_by_category("sentiment_apis")
return data.get("resources", [])
def get_block_explorers(self) -> List[Dict[str, Any]]:
"""Get all block explorer resources"""
data = self.get_resources_by_category("block_explorers")
return data.get("resources", [])
def get_whale_tracking_apis(self) -> List[Dict[str, Any]]:
"""Get all whale tracking API resources"""
data = self.get_resources_by_category("whale_tracking_apis")
return data.get("resources", [])
def get_hf_resources(self) -> List[Dict[str, Any]]:
"""Get all HuggingFace resources (models/datasets)"""
data = self.get_resources_by_category("hf_resources")
return data.get("resources", [])
def get_fear_greed_index(self) -> int:
"""
Get current Fear & Greed Index value
Returns:
int: Fear & Greed Index (0-100)
"""
data = self.get_global_sentiment()
return data.get("fear_greed_index", 50)
def get_btc_price(self) -> float:
"""
Get current Bitcoin price
Returns:
float: BTC price in USD
"""
data = self.get_top_coins(limit=1)
coins = data.get("coins", [])
if coins:
return coins[0].get("current_price", 0)
return 0
def get_total_market_cap(self) -> float:
"""
Get total crypto market cap
Returns:
float: Total market cap in USD
"""
data = self.get_market_overview()
return data.get("total_market_cap", 0)
# ===== CONVENIENCE FUNCTIONS =====
def get_hf_crypto_client() -> HFCryptoAPIClient:
"""Get a configured HF Crypto API client instance"""
return HFCryptoAPIClient(timeout=15)
# ===== TEST =====
if __name__ == "__main__":
# Test the client
client = HFCryptoAPIClient()
print("=" * 60)
print("Testing HuggingFace Crypto Resources API Client")
print("=" * 60)
# Health check
print("\n1. Health Check:")
health = client.health_check()
print(f" Status: {health.get('status', 'unknown')}")
print(f" Resources loaded: {health.get('resources_loaded', False)}")
# Top coins
print("\n2. Top 3 Coins:")
coins = client.get_top_coins(limit=3)
for coin in coins.get("coins", []):
print(f" {coin['name']}: ${coin['current_price']:,.2f}")
# Market overview
print("\n3. Market Overview:")
market = client.get_market_overview()
print(f" Total Market Cap: ${market.get('total_market_cap', 0):,.0f}")
print(f" BTC Dominance: {market.get('market_cap_percentage', {}).get('btc', 0):.2f}%")
# Sentiment
print("\n4. Fear & Greed Index:")
sentiment = client.get_global_sentiment()
print(f" Index: {sentiment.get('fear_greed_index', 'N/A')}")
print(f" Sentiment: {sentiment.get('sentiment', 'N/A')}")
# Resources stats
print("\n5. Resources Stats:")
stats = client.get_resources_stats()
print(f" Total Resources: {stats.get('total_resources', 0)}")
print(f" Total Categories: {stats.get('total_categories', 0)}")
# Trending
print("\n6. Trending Coins:")
trending = client.get_trending()
for i, coin in enumerate(trending.get("coins", [])[:5], 1):
print(f" {i}. {coin['name']} ({coin['symbol']})")
print("\n" + "=" * 60)
print("All tests completed!")
print("=" * 60)