| import os |
| from dotenv import load_dotenv |
| load_dotenv() |
|
|
| import httpx |
| from enum import Enum |
| from src.libs.logger import logger |
| from src.databases.redis import REDIS_CACHED |
| from src.libs.helper_functions import convert_to_snakecase |
| from src.libs.constants import ( |
| ONE_HOUR_IN_SECONDS, |
| ONE_MONTH_IN_SECONDS, |
| ONE_MINUTE_IN_SECONDS, |
| ONE_QUARTER_IN_SECONDS, |
| CRYPTO_COMPARE_API_BASE_URL, |
| CRYPTO_COMPARE_ASSET_DATA_API_BASE_URL, |
| ) |
|
|
| redis_cache = REDIS_CACHED |
|
|
| class CryptoCompareNewsSortOrder(Enum): |
| LATEST = "latest" |
| POPULAR = "popular" |
|
|
| def __str__(self): |
| return self.value |
| |
| class CryptoCompareLanguages(Enum): |
| English = "EN" |
| French = "FR" |
| Espanol = "ES" |
| Turkish = "TR" |
| Portuguese = "PT" |
|
|
| def __str__(self): |
| return self.value |
|
|
| class CryptoCompare: |
| def __init__(self, base_url: str = None, asset_data_base_url: str = None) -> None: |
| self.CRYPTO_COMPARE_API_BASE_URL = base_url or CRYPTO_COMPARE_API_BASE_URL |
| self.CRYPTO_COMPARE_ASSET_DATA_API_BASE_URL = asset_data_base_url or CRYPTO_COMPARE_ASSET_DATA_API_BASE_URL |
|
|
| |
| @logger.instrument() |
| def get_all_coins(self) -> dict: |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/all/coinlist" |
| logger.debug(url) |
| params = {"api_key": os.getenv("CRYPTOCOMPARE_API_KEY")} |
| logger.debug(params) |
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(headers) |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return convert_to_snakecase(response.json()) |
| except httpx.HTTPError as e: |
| print(f"An error occurred while making the request: {e}") |
| return None |
| |
| @redis_cache(ttl=ONE_MINUTE_IN_SECONDS) |
| @logger.instrument() |
| def get_coin_price(self, ids: list[str], vs_currencies: list[str], cache_ttl: int = None) -> dict: |
| |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/pricemulti" |
| |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| "fsyms": ",".join(ids), |
| "tsyms": ",".join(vs_currencies) |
| } |
| |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| |
| print(f"An error occurred while making the request: {e}") |
| return None |
| |
| @redis_cache(ttl=ONE_QUARTER_IN_SECONDS) |
| @logger.instrument() |
| def get_overall_coin_data(self, symbol: str, cache_ttl: int = None) -> dict: |
| |
| url = f"{self.CRYPTO_COMPARE_ASSET_DATA_API_BASE_URL}data/by/symbol" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| "asset_symbol": symbol, |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |
| @redis_cache(ttl=ONE_QUARTER_IN_SECONDS) |
| @logger.instrument() |
| def get_news_categories(self, cache_ttl: int = None) -> dict: |
| """ |
| Retrieves the news categories from the CryptoCompare API. |
| |
| Args: |
| cache_ttl (int, optional): The time-to-live (TTL) for the cached response. Defaults to None. |
| |
| Returns: |
| dict: A dictionary containing the news categories from the CryptoCompare API. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the CryptoCompare API. |
| """ |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/news/categories" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |
| @redis_cache(ttl=ONE_HOUR_IN_SECONDS) |
| @logger.instrument() |
| def get_latest_news_articles( |
| self, |
| language: CryptoCompareLanguages = CryptoCompareLanguages.English, |
| sort_order: CryptoCompareNewsSortOrder = CryptoCompareNewsSortOrder.LATEST, |
| cache_ttl: int = None |
| ) -> dict: |
| """ |
| Retrieves the latest news articles from the CryptoCompare API. |
| |
| Args: |
| language (CryptoCompareLanguages, optional): The language of the news articles. Defaults to English. |
| sort_order (CryptoCompareNewsSortOrder, optional): The sort order of the news articles. Defaults to 'latest'. |
| cache_ttl (int, optional): The time-to-live (TTL) for the cached response. Defaults to None. |
| |
| Returns: |
| dict: A dictionary containing the latest news articles from the CryptoCompare API. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the CryptoCompare API. |
| |
| Example: |
| # Get the latest news articles in English, sorted by popularity |
| latest_news = crypto_compare_instance.get_latest_news_articles(language=CryptoCompareLanguages.English, sort_order=CryptoCompareNewsSortOrder.POPULAR) |
| """ |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/v2/news/" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| "lang": language, |
| "sortOrder": sort_order, |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |
| @redis_cache(ttl=ONE_MONTH_IN_SECONDS) |
| @logger.instrument() |
| def get_all_exchanges_general_info(self, cache_ttl: int = None) -> dict: |
| """ |
| Retrieves general information about all supported exchanges from the CryptoCompare API. |
| |
| Args: |
| cache_ttl (int, optional): The time-to-live (TTL) for the cached response. Defaults to None. |
| |
| Returns: |
| dict: A dictionary containing general information about all supported exchanges from the CryptoCompare API. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the CryptoCompare API. |
| |
| Example: |
| # Get general information about all supported exchanges |
| all_exchanges_info = crypto_compare_instance.get_all_exchanges_general_info() |
| """ |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/exchanges/general" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |
| @redis_cache(ttl=ONE_MONTH_IN_SECONDS) |
| @logger.instrument() |
| def get_all_wallets_general_info(self, cache_ttl: int = None) -> dict: |
| """ |
| Retrieves general information about all supported wallets from the CryptoCompare API. |
| |
| Args: |
| cache_ttl (int, optional): The time-to-live (TTL) for the cached response. Defaults to None. |
| |
| Returns: |
| dict: A dictionary containing general information about all supported wallets from the CryptoCompare API. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the CryptoCompare API. |
| |
| Example: |
| # Get general information about all supported wallets |
| all_wallets_info = crypto_compare_instance.get_all_wallets_general_info() |
| """ |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/wallets/general" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |
| |
| @logger.instrument() |
| def get_top_tier_exchanges_list( |
| self, |
| top_tier: bool = False, |
| cache_ttl: int = None |
| ) -> dict: |
| """ |
| Retrieves a list of top-tier exchanges from the CryptoCompare API. |
| |
| Args: |
| top_tier (bool, optional): A boolean flag indicating whether to retrieve top-tier exchanges. Defaults to False. |
| cache_ttl (int, optional): The time-to-live (TTL) for the cached response. Defaults to None. |
| |
| Returns: |
| dict: A dictionary containing a list of top-tier exchanges from the CryptoCompare API. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the CryptoCompare API. |
| |
| Example: |
| # Get a list of top-tier exchanges |
| top_tier_exchanges = crypto_compare_instance.get_top_tier_exchanges_list(top_tier=True) |
| """ |
| url = f"{self.CRYPTO_COMPARE_API_BASE_URL}data/v4/all/exchanges" |
| logger.debug(f"Query URL: {url}") |
|
|
| params = { |
| "api_key": os.getenv("CRYPTOCOMPARE_API_KEY"), |
| "topTier": 'true' if top_tier else 'false', |
| } |
| logger.debug(f"Query params: {params}") |
|
|
| headers = {"Content-type":"application/json; charset=UTF-8"} |
| logger.debug(f"Query headers {headers}") |
|
|
| try: |
| with httpx.Client(timeout=30.0) as client: |
| response = client.get(url, params=params, headers=headers) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| logger.debug(f"An error occurred while making the request: {e}") |
| |
| return None |
| |