Mehdi
feat: backend
68025ee
Raw
History Blame Contribute Delete
2.06 kB
import logging
import os
import requests
logger = logging.getLogger(__name__)
CRYPTOPANIC_API_KEY = os.getenv("CRYPTOPANIC_API_KEY", "")
CRYPTOCOMPARE_API_KEY = os.getenv("CRYPTOCOMPARE_API_KEY", "")
def fetch_news(asset: str, date: str = None, limit: int = 10) -> list:
"""Fetch crypto news. Returns list of {title, url, published_at}."""
currency = asset.split("/")[0] # BTC, ETH
# Try CryptoPanic first
if CRYPTOPANIC_API_KEY:
try:
return _fetch_cryptopanic(currency, limit)
except Exception as e:
logger.warning(f"CryptoPanic failed: {e}")
# Try CryptoCompare
try:
return _fetch_cryptocompare(currency, limit)
except Exception as e:
logger.warning(f"CryptoCompare failed: {e}")
return []
def _fetch_cryptopanic(currency: str, limit: int) -> list:
url = "https://cryptopanic.com/api/v1/posts/"
params = {
"auth_token": CRYPTOPANIC_API_KEY,
"currencies": currency,
"kind": "news",
"limit": limit,
}
resp = requests.get(url, params=params, timeout=15)
resp.raise_for_status()
data = resp.json()
results = []
for item in data.get("results", [])[:limit]:
results.append({
"title": item.get("title", ""),
"url": item.get("url", ""),
"published_at": item.get("published_at", ""),
})
return results
def _fetch_cryptocompare(currency: str, limit: int) -> list:
url = "https://min-api.cryptocompare.com/data/v2/news/"
params = {"categories": currency, "lang": "EN", "limit": limit}
if CRYPTOCOMPARE_API_KEY:
params["api_key"] = CRYPTOCOMPARE_API_KEY
resp = requests.get(url, params=params, timeout=15)
resp.raise_for_status()
data = resp.json()
results = []
for item in data.get("Data", [])[:limit]:
results.append({
"title": item.get("title", ""),
"url": item.get("url", ""),
"published_at": str(item.get("published_on", "")),
})
return results