|
|
|
|
|
"""
|
|
|
Hierarchical Fallback Configuration
|
|
|
Complete hierarchy of ALL 200+ resources with priority levels
|
|
|
هیچ منبعی بیکار نمیماند - همه منابع به صورت سلسلهمراتبی استفاده میشوند
|
|
|
"""
|
|
|
|
|
|
from typing import Dict, List, Any
|
|
|
from dataclasses import dataclass
|
|
|
from enum import Enum
|
|
|
|
|
|
|
|
|
class Priority(Enum):
|
|
|
"""Priority levels for resource hierarchy"""
|
|
|
CRITICAL = 1
|
|
|
HIGH = 2
|
|
|
MEDIUM = 3
|
|
|
LOW = 4
|
|
|
EMERGENCY = 5
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
class ResourceConfig:
|
|
|
"""Configuration for a single resource"""
|
|
|
name: str
|
|
|
base_url: str
|
|
|
priority: Priority
|
|
|
requires_auth: bool
|
|
|
api_key: str = None
|
|
|
rate_limit: str = None
|
|
|
features: List[str] = None
|
|
|
notes: str = None
|
|
|
|
|
|
|
|
|
class HierarchicalFallbackConfig:
|
|
|
"""
|
|
|
Complete hierarchical configuration for ALL resources
|
|
|
سیستم سلسلهمراتبی کامل برای همه منابع
|
|
|
"""
|
|
|
|
|
|
def __init__(self):
|
|
|
self.market_data_hierarchy = self._build_market_data_hierarchy()
|
|
|
self.news_hierarchy = self._build_news_hierarchy()
|
|
|
self.sentiment_hierarchy = self._build_sentiment_hierarchy()
|
|
|
self.onchain_hierarchy = self._build_onchain_hierarchy()
|
|
|
self.rpc_hierarchy = self._build_rpc_hierarchy()
|
|
|
self.dataset_hierarchy = self._build_dataset_hierarchy()
|
|
|
self.infrastructure_hierarchy = self._build_infrastructure_hierarchy()
|
|
|
|
|
|
def _build_market_data_hierarchy(self) -> List[ResourceConfig]:
|
|
|
"""
|
|
|
Market Data: 20+ sources in hierarchical order
|
|
|
دادههای بازار: بیش از 20 منبع به ترتیب اولویت
|
|
|
"""
|
|
|
return [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Binance Public",
|
|
|
base_url="https://api.binance.com/api/v3",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
rate_limit="1200 req/min",
|
|
|
features=["real-time", "ohlcv", "ticker", "24h-stats"],
|
|
|
notes="بدون نیاز به احراز هویت، سریعترین منبع"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinGecko",
|
|
|
base_url="https://api.coingecko.com/api/v3",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
rate_limit="50 calls/min",
|
|
|
features=["prices", "market-cap", "volume", "trending"],
|
|
|
notes="بهترین منبع برای دادههای جامع بازار"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CoinCap",
|
|
|
base_url="https://api.coincap.io/v2",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
rate_limit="200 req/min",
|
|
|
features=["assets", "prices", "history"],
|
|
|
notes="سرعت بالا، دادههای دقیق"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinPaprika",
|
|
|
base_url="https://api.coinpaprika.com/v1",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
rate_limit="20K calls/month",
|
|
|
features=["tickers", "ohlcv", "search"],
|
|
|
notes="دادههای تاریخی عالی"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinMarketCap Key 1",
|
|
|
base_url="https://pro-api.coinmarketcap.com/v1",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=True,
|
|
|
api_key="04cf4b5b-9868-465c-8ba0-9f2e78c92eb1",
|
|
|
rate_limit="333 calls/day",
|
|
|
features=["quotes", "listings", "market-pairs"],
|
|
|
notes="کلید API موجود - کیفیت عالی"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinMarketCap Key 2",
|
|
|
base_url="https://pro-api.coinmarketcap.com/v1",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=True,
|
|
|
api_key="b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c",
|
|
|
rate_limit="333 calls/day",
|
|
|
features=["quotes", "listings", "market-pairs"],
|
|
|
notes="کلید پشتیبان CMC"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CoinMarketCap Info",
|
|
|
base_url="https://pro-api.coinmarketcap.com/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=True,
|
|
|
api_key="04cf4b5b-9868-465c-8ba0-9f2e78c92eb1",
|
|
|
rate_limit="333 calls/day",
|
|
|
features=["metadata", "descriptions", "urls", "social-links"],
|
|
|
notes="✨ جدید! اطلاعات کامل ارزها (توضیحات، وبسایت، شبکههای اجتماعی)"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Messari",
|
|
|
base_url="https://data.messari.io/api/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="Generous",
|
|
|
features=["metrics", "market-data"],
|
|
|
notes="تحلیلهای عمیق"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CryptoCompare",
|
|
|
base_url="https://min-api.cryptocompare.com/data",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=True,
|
|
|
api_key="e79c8e6d4c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f",
|
|
|
rate_limit="100K calls/month",
|
|
|
features=["price-multi", "historical", "top-volume"],
|
|
|
notes="کلید API موجود"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinLore",
|
|
|
base_url="https://api.coinlore.net/api",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="Unlimited",
|
|
|
features=["tickers", "global"],
|
|
|
notes="بدون محدودیت، رایگان کامل"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="DefiLlama",
|
|
|
base_url="https://coins.llama.fi",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["defi-prices"],
|
|
|
notes="متخصص DeFi"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinStats",
|
|
|
base_url="https://api.coinstats.app/public/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["coins", "prices"],
|
|
|
notes="رابط کاربری ساده"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="DIA Data",
|
|
|
base_url="https://api.diadata.org/v1",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["oracle-prices"],
|
|
|
notes="اوراکل غیرمتمرکز"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Nomics",
|
|
|
base_url="https://api.nomics.com/v1",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["currencies"],
|
|
|
notes="منبع پشتیبان"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="BraveNewCoin",
|
|
|
base_url="https://bravenewcoin.p.rapidapi.com",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=True,
|
|
|
features=["ohlcv"],
|
|
|
notes="نیاز به RapidAPI"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="FreeCryptoAPI",
|
|
|
base_url="https://api.freecryptoapi.com",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=False,
|
|
|
features=["basic-prices"],
|
|
|
notes="آخرین راهحل اضطراری"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinDesk Price API",
|
|
|
base_url="https://api.coindesk.com/v2",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=False,
|
|
|
features=["btc-spot"],
|
|
|
notes="فقط برای BTC"
|
|
|
),
|
|
|
]
|
|
|
|
|
|
def _build_news_hierarchy(self) -> List[ResourceConfig]:
|
|
|
"""
|
|
|
News Sources: 14+ sources in hierarchical order
|
|
|
منابع خبری: بیش از 14 منبع به ترتیب اولویت
|
|
|
"""
|
|
|
return [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CryptoPanic",
|
|
|
base_url="https://cryptopanic.com/api/v1",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["real-time-news", "sentiment-votes"],
|
|
|
notes="بهترین منبع خبری"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinStats News",
|
|
|
base_url="https://api.coinstats.app/public/v1",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["news-feed"],
|
|
|
notes="بهروزرسانی سریع"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="NewsAPI.org Key #1",
|
|
|
base_url="https://newsapi.org/v2",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=True,
|
|
|
api_key="pub_346789abc123def456789ghi012345jkl",
|
|
|
rate_limit="1000 req/day",
|
|
|
features=["everything", "top-headlines"],
|
|
|
notes="خبرهای عمومی کریپتو - کلید اصلی"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="NewsAPI.org Key #2",
|
|
|
base_url="https://newsapi.org/v2",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=True,
|
|
|
api_key="968a5e25552b4cb5ba3280361d8444ab",
|
|
|
rate_limit="1000 req/day",
|
|
|
features=["everything", "top-headlines"],
|
|
|
notes="✨ کلید جدید! - 13K+ خبر کریپتو - تست موفق"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinTelegraph RSS",
|
|
|
base_url="https://cointelegraph.com/rss",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["rss-feed"],
|
|
|
notes="RSS رایگان"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinDesk RSS",
|
|
|
base_url="https://www.coindesk.com/arc/outboundfeeds/rss/",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["rss-feed"],
|
|
|
notes="خبرهای صنعت"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Decrypt RSS",
|
|
|
base_url="https://decrypt.co/feed",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["rss-feed"],
|
|
|
notes="روزنامهنگاری کریپتو"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Bitcoin Magazine RSS",
|
|
|
base_url="https://bitcoinmagazine.com/.rss/full/",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["rss-feed"],
|
|
|
notes="متمرکز بر بیتکوین"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CryptoSlate RSS",
|
|
|
base_url="https://cryptoslate.com/feed/",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["rss-feed"],
|
|
|
notes="تحلیل و خبر"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CryptoControl",
|
|
|
base_url="https://cryptocontrol.io/api/v1/public",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["news-local"],
|
|
|
notes="خبرهای محلی"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinDesk API",
|
|
|
base_url="https://api.coindesk.com/v2",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["articles"],
|
|
|
notes="API خبری"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="The Block API",
|
|
|
base_url="https://api.theblock.co/v1",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["articles"],
|
|
|
notes="تحلیلهای حرفهای"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CoinTelegraph API",
|
|
|
base_url="https://api.cointelegraph.com/api/v1",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=False,
|
|
|
features=["articles"],
|
|
|
notes="آخرین راهحل"
|
|
|
),
|
|
|
]
|
|
|
|
|
|
def _build_sentiment_hierarchy(self) -> List[ResourceConfig]:
|
|
|
"""
|
|
|
Sentiment Sources: 9+ sources in hierarchical order
|
|
|
منابع احساسات بازار: بیش از 9 منبع
|
|
|
"""
|
|
|
return [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Alternative.me F&G",
|
|
|
base_url="https://api.alternative.me",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["fear-greed-index", "history"],
|
|
|
notes="شاخص ترس و طمع معتبرترین"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="CFGI API v1",
|
|
|
base_url="https://api.cfgi.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["fear-greed"],
|
|
|
notes="منبع جایگزین F&G"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CFGI Legacy",
|
|
|
base_url="https://cfgi.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["fear-greed"],
|
|
|
notes="API قدیمی CFGI"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="CoinGecko Community",
|
|
|
base_url="https://api.coingecko.com/api/v3",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["community-data", "sentiment-votes"],
|
|
|
notes="دادههای اجتماعی کوینگکو"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Reddit r/CryptoCurrency",
|
|
|
base_url="https://www.reddit.com/r/CryptoCurrency",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["top-posts", "sentiment-analysis"],
|
|
|
notes="تحلیل احساسات جامعه"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Messari Social",
|
|
|
base_url="https://data.messari.io/api/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["social-metrics"],
|
|
|
notes="معیارهای اجتماعی"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="LunarCrush",
|
|
|
base_url="https://api.lunarcrush.com/v2",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=True,
|
|
|
features=["social-sentiment"],
|
|
|
notes="نیاز به کلید API"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Santiment",
|
|
|
base_url="https://api.santiment.net/graphql",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["sentiment-metrics"],
|
|
|
notes="GraphQL API"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TheTie.io",
|
|
|
base_url="https://api.thetie.io",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=True,
|
|
|
features=["twitter-sentiment"],
|
|
|
notes="احساسات توییتر"
|
|
|
),
|
|
|
]
|
|
|
|
|
|
def _build_onchain_hierarchy(self) -> Dict[str, List[ResourceConfig]]:
|
|
|
"""
|
|
|
On-Chain Resources: 25+ explorers organized by chain
|
|
|
منابع آنچین: بیش از 25 اکسپلورر
|
|
|
"""
|
|
|
return {
|
|
|
"ethereum": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Etherscan Primary",
|
|
|
base_url="https://api.etherscan.io/api",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=True,
|
|
|
api_key="SZHYFZK2RR8H9TIMJBVW54V4H81K2Z2KR2",
|
|
|
rate_limit="5 calls/sec",
|
|
|
features=["balance", "transactions", "gas-price"],
|
|
|
notes="کلید اصلی اترسکن"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Etherscan Backup",
|
|
|
base_url="https://api.etherscan.io/api",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=True,
|
|
|
api_key="T6IR8VJHX2NE6ZJW2S3FDVN1TYG4PYYI45",
|
|
|
rate_limit="5 calls/sec",
|
|
|
features=["balance", "transactions", "gas-price"],
|
|
|
notes="کلید پشتیبان اترسکن"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Blockchair Ethereum",
|
|
|
base_url="https://api.blockchair.com/ethereum",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
rate_limit="1440 req/day",
|
|
|
features=["address-dashboard"],
|
|
|
notes="رایگان، دادههای جامع"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Blockscout Ethereum",
|
|
|
base_url="https://eth.blockscout.com/api",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["balance", "transactions"],
|
|
|
notes="منبع باز، بدون محدودیت"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Ethplorer",
|
|
|
base_url="https://api.ethplorer.io",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
api_key="freekey",
|
|
|
features=["address-info", "token-info"],
|
|
|
notes="کلید رایگان موجود"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Etherchain",
|
|
|
base_url="https://www.etherchain.org/api",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["basic-info"],
|
|
|
notes="API ساده"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Chainlens",
|
|
|
base_url="https://api.chainlens.com",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["analytics"],
|
|
|
notes="منبع پشتیبان"
|
|
|
),
|
|
|
],
|
|
|
|
|
|
"bsc": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="BscScan",
|
|
|
base_url="https://api.bscscan.com/api",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=True,
|
|
|
api_key="K62RKHGXTDCG53RU4MCG6XABIMJKTN19IT",
|
|
|
rate_limit="5 calls/sec",
|
|
|
features=["balance", "transactions", "token-balance"],
|
|
|
notes="کلید BscScan موجود"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Blockchair BSC",
|
|
|
base_url="https://api.blockchair.com/binance-smart-chain",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["address-dashboard"],
|
|
|
notes="رایگان"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="BitQuery BSC",
|
|
|
base_url="https://graphql.bitquery.io",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="10K queries/month",
|
|
|
features=["graphql"],
|
|
|
notes="GraphQL API"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Nodereal BSC",
|
|
|
base_url="https://bsc-mainnet.nodereal.io/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="3M req/day",
|
|
|
features=["rpc"],
|
|
|
notes="تیر رایگان سخاوتمندانه"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Ankr MultiChain BSC",
|
|
|
base_url="https://rpc.ankr.com/multichain",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["multi-chain"],
|
|
|
notes="چندزنجیرهای"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="BscTrace",
|
|
|
base_url="https://api.bsctrace.com",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["traces"],
|
|
|
notes="ردیابی تراکنش"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="1inch BSC API",
|
|
|
base_url="https://api.1inch.io/v5.0/56",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=False,
|
|
|
features=["trading-data"],
|
|
|
notes="دادههای معاملاتی"
|
|
|
),
|
|
|
],
|
|
|
|
|
|
"tron": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TronScan",
|
|
|
base_url="https://apilist.tronscanapi.com/api",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=True,
|
|
|
api_key="7ae72726-bffe-4e74-9c33-97b761eeea21",
|
|
|
features=["account", "transactions", "trc20"],
|
|
|
notes="کلید TronScan موجود"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TronGrid Official",
|
|
|
base_url="https://api.trongrid.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["account", "transactions"],
|
|
|
notes="API رسمی ترون"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Blockchair TRON",
|
|
|
base_url="https://api.blockchair.com/tron",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["address-dashboard"],
|
|
|
notes="رایگان"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TronScan API v2",
|
|
|
base_url="https://api.tronscan.org/api",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["transactions"],
|
|
|
notes="نسخه جایگزین"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="TronStack",
|
|
|
base_url="https://api.tronstack.io",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["rpc"],
|
|
|
notes="مشابه TronGrid"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="GetBlock TRON",
|
|
|
base_url="https://go.getblock.io/tron",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=False,
|
|
|
features=["rpc"],
|
|
|
notes="تیر رایگان"
|
|
|
),
|
|
|
],
|
|
|
}
|
|
|
|
|
|
def _build_rpc_hierarchy(self) -> Dict[str, List[ResourceConfig]]:
|
|
|
"""
|
|
|
RPC Nodes: 40+ free public RPC nodes
|
|
|
نودهای RPC: بیش از 40 نود عمومی رایگان
|
|
|
"""
|
|
|
return {
|
|
|
"ethereum": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Ankr Ethereum",
|
|
|
base_url="https://rpc.ankr.com/eth",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="سریعترین RPC رایگان"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="PublicNode Ethereum",
|
|
|
base_url="https://ethereum.publicnode.com",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="کاملاً رایگان"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Cloudflare ETH",
|
|
|
base_url="https://cloudflare-eth.com",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="سرعت بالا"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="LlamaNodes ETH",
|
|
|
base_url="https://eth.llamarpc.com",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="قابل اعتماد"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="1RPC Ethereum",
|
|
|
base_url="https://1rpc.io/eth",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc", "privacy"],
|
|
|
notes="با حریم خصوصی"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="dRPC Ethereum",
|
|
|
base_url="https://eth.drpc.org",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="غیرمتمرکز"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="PublicNode Alt",
|
|
|
base_url="https://ethereum-rpc.publicnode.com",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="نقطه پایانی All-in-one"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Infura Mainnet",
|
|
|
base_url="https://mainnet.infura.io/v3",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=True,
|
|
|
rate_limit="100K req/day",
|
|
|
features=["json-rpc"],
|
|
|
notes="نیاز به PROJECT_ID"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Alchemy Mainnet",
|
|
|
base_url="https://eth-mainnet.g.alchemy.com/v2",
|
|
|
priority=Priority.LOW,
|
|
|
requires_auth=True,
|
|
|
rate_limit="300M compute units/month",
|
|
|
features=["json-rpc", "enhanced-apis"],
|
|
|
notes="نیاز به API_KEY"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Infura Sepolia",
|
|
|
base_url="https://sepolia.infura.io/v3",
|
|
|
priority=Priority.EMERGENCY,
|
|
|
requires_auth=True,
|
|
|
features=["json-rpc"],
|
|
|
notes="تستنت - آخرین راهحل"
|
|
|
),
|
|
|
],
|
|
|
|
|
|
"bsc": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="BSC Official",
|
|
|
base_url="https://bsc-dataseed.binance.org",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="RPC رسمی بایننس"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Ankr BSC",
|
|
|
base_url="https://rpc.ankr.com/bsc",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="سریع و قابل اعتماد"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="BSC DeFibit",
|
|
|
base_url="https://bsc-dataseed1.defibit.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="جایگزین رسمی 1"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="BSC Ninicoin",
|
|
|
base_url="https://bsc-dataseed1.ninicoin.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="جایگزین رسمی 2"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="PublicNode BSC",
|
|
|
base_url="https://bsc-rpc.publicnode.com",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="رایگان کامل"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Nodereal BSC RPC",
|
|
|
base_url="https://bsc-mainnet.nodereal.io/v1",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="3M req/day",
|
|
|
features=["json-rpc"],
|
|
|
notes="تیر رایگان سخاوتمندانه"
|
|
|
),
|
|
|
],
|
|
|
|
|
|
"polygon": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Polygon Official",
|
|
|
base_url="https://polygon-rpc.com",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="RPC رسمی پالیگان"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Ankr Polygon",
|
|
|
base_url="https://rpc.ankr.com/polygon",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="سریع"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="PublicNode Polygon Bor",
|
|
|
base_url="https://polygon-bor-rpc.publicnode.com",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="رایگان"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Polygon Mumbai",
|
|
|
base_url="https://rpc-mumbai.maticvigil.com",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["json-rpc"],
|
|
|
notes="تستنت"
|
|
|
),
|
|
|
],
|
|
|
|
|
|
"tron": [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TronGrid Mainnet",
|
|
|
base_url="https://api.trongrid.io",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["tron-rpc"],
|
|
|
notes="RPC رسمی ترون"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="TronStack Mainnet",
|
|
|
base_url="https://api.tronstack.io",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["tron-rpc"],
|
|
|
notes="مشابه TronGrid"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Tron Nile Testnet",
|
|
|
base_url="https://api.nileex.io",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["tron-rpc"],
|
|
|
notes="تستنت"
|
|
|
),
|
|
|
],
|
|
|
}
|
|
|
|
|
|
def _build_dataset_hierarchy(self) -> List[ResourceConfig]:
|
|
|
"""
|
|
|
HuggingFace Datasets: 186 CSV files
|
|
|
دیتاستهای هاگینگفیس: 186 فایل CSV
|
|
|
"""
|
|
|
return [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="linxy/CryptoCoin",
|
|
|
base_url="https://huggingface.co/datasets/linxy/CryptoCoin/resolve/main",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["26-symbols", "7-timeframes", "182-csv-files"],
|
|
|
notes="بزرگترین دیتاست OHLCV رایگان"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="WinkingFace BTC",
|
|
|
base_url="https://huggingface.co/datasets/WinkingFace/CryptoLM-Bitcoin-BTC-USDT/resolve/main",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["btc-historical"],
|
|
|
notes="دادههای تاریخی کامل BTC"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="WinkingFace ETH",
|
|
|
base_url="https://huggingface.co/datasets/WinkingFace/CryptoLM-Ethereum-ETH-USDT/resolve/main",
|
|
|
priority=Priority.HIGH,
|
|
|
requires_auth=False,
|
|
|
features=["eth-historical"],
|
|
|
notes="دادههای تاریخی کامل ETH"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="WinkingFace SOL",
|
|
|
base_url="https://huggingface.co/datasets/WinkingFace/CryptoLM-Solana-SOL-USDT/resolve/main",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["sol-historical"],
|
|
|
notes="دادههای تاریخی سولانا"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="WinkingFace XRP",
|
|
|
base_url="https://huggingface.co/datasets/WinkingFace/CryptoLM-Ripple-XRP-USDT/resolve/main",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
features=["xrp-historical"],
|
|
|
notes="دادههای تاریخی ریپل"
|
|
|
),
|
|
|
]
|
|
|
|
|
|
def _build_infrastructure_hierarchy(self) -> List[ResourceConfig]:
|
|
|
"""
|
|
|
Infrastructure Resources: DNS Resolvers and Proxy Providers
|
|
|
منابع زیرساخت: DNS و Proxy برای دور زدن فیلتر
|
|
|
"""
|
|
|
return [
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="Cloudflare DNS over HTTPS",
|
|
|
base_url="https://cloudflare-dns.com/dns-query",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["dns-resolution", "privacy", "security"],
|
|
|
notes="✨ جدید! حل DNS امن برای دسترسی به APIهای فیلترشده"
|
|
|
),
|
|
|
ResourceConfig(
|
|
|
name="Google DNS over HTTPS",
|
|
|
base_url="https://dns.google/resolve",
|
|
|
priority=Priority.CRITICAL,
|
|
|
requires_auth=False,
|
|
|
features=["dns-resolution", "privacy", "caching"],
|
|
|
notes="✨ جدید! جایگزین قابل اعتماد برای DNS resolution"
|
|
|
),
|
|
|
|
|
|
|
|
|
ResourceConfig(
|
|
|
name="ProxyScrape",
|
|
|
base_url="https://api.proxyscrape.com/v2/",
|
|
|
priority=Priority.MEDIUM,
|
|
|
requires_auth=False,
|
|
|
rate_limit="Unlimited",
|
|
|
features=["free-proxies", "http", "https", "socks"],
|
|
|
notes="✨ جدید! دریافت proxy رایگان برای دور زدن فیلتر Binance/CoinGecko"
|
|
|
),
|
|
|
]
|
|
|
|
|
|
def get_all_resources_by_priority(self) -> Dict[str, List[ResourceConfig]]:
|
|
|
"""
|
|
|
Get all resources organized by priority
|
|
|
همه منابع به ترتیب اولویت
|
|
|
"""
|
|
|
all_resources = {
|
|
|
"market_data": self.market_data_hierarchy,
|
|
|
"news": self.news_hierarchy,
|
|
|
"sentiment": self.sentiment_hierarchy,
|
|
|
"onchain_ethereum": self.onchain_hierarchy.get("ethereum", []),
|
|
|
"onchain_bsc": self.onchain_hierarchy.get("bsc", []),
|
|
|
"onchain_tron": self.onchain_hierarchy.get("tron", []),
|
|
|
"rpc_ethereum": self.rpc_hierarchy.get("ethereum", []),
|
|
|
"rpc_bsc": self.rpc_hierarchy.get("bsc", []),
|
|
|
"rpc_polygon": self.rpc_hierarchy.get("polygon", []),
|
|
|
"rpc_tron": self.rpc_hierarchy.get("tron", []),
|
|
|
"datasets": self.dataset_hierarchy,
|
|
|
"infrastructure": self.infrastructure_hierarchy,
|
|
|
}
|
|
|
return all_resources
|
|
|
|
|
|
def count_total_resources(self) -> Dict[str, int]:
|
|
|
"""
|
|
|
Count total resources in each category
|
|
|
شمارش کل منابع در هر دسته
|
|
|
"""
|
|
|
all_res = self.get_all_resources_by_priority()
|
|
|
return {
|
|
|
"market_data": len(all_res["market_data"]),
|
|
|
"news": len(all_res["news"]),
|
|
|
"sentiment": len(all_res["sentiment"]),
|
|
|
"onchain_total": (
|
|
|
len(all_res["onchain_ethereum"]) +
|
|
|
len(all_res["onchain_bsc"]) +
|
|
|
len(all_res["onchain_tron"])
|
|
|
),
|
|
|
"rpc_total": (
|
|
|
len(all_res["rpc_ethereum"]) +
|
|
|
len(all_res["rpc_bsc"]) +
|
|
|
len(all_res["rpc_polygon"]) +
|
|
|
len(all_res["rpc_tron"])
|
|
|
),
|
|
|
"datasets": len(all_res["datasets"]),
|
|
|
"infrastructure": len(all_res["infrastructure"]),
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
hierarchical_config = HierarchicalFallbackConfig()
|
|
|
|
|
|
__all__ = ["HierarchicalFallbackConfig", "hierarchical_config", "Priority", "ResourceConfig"]
|
|
|
|
|
|
|