import asyncio import time from typing import Any import aiohttp import requests from aiohttp import ClientError from src import logger from src.core.login import login from src.core.message_client import send_message from src.entity.account import Account from src.entity.api import ApiResponse def post(url: str, headers: dict, params: dict) -> ApiResponse[Any]: try: logger.debug(f"url:{url}") logger.debug(f"headers:{headers}") logger.debug(f"params:{params}") response = requests.post(url=url, headers=headers, json=params) response.raise_for_status() logger.debug(f'res:{response.json()}') return ApiResponse(**response.json()) except requests.RequestException as e: logger.error(f"HTTP error occurred: {e}") raise ClientError("HTTP error occurred") async def async_post(url: str, headers: dict, params: dict) -> ApiResponse[Any]: try: async with aiohttp.ClientSession() as session: response = await session.post(url=url, headers=headers, json=params) response.raise_for_status() res = await response.json() return ApiResponse(**res) except aiohttp.ClientError as e: logger.error(f"HTTP error occurred: {e}") raise ClientError("HTTP error occurred") def account_post(url: str, account: Account, params: dict) -> ApiResponse[Any]: for _ in range(3): try: if account.headers is None: account = login(account) api_res = post(url=account.url + url, headers=account.headers, params=params) if api_res.status_code == 6000: return api_res elif api_res.status_code == 6008: logger.error(api_res.message) else: logger.error(api_res.message) logger.info('Retrying login') account = login(account) except ClientError as e: logger.error(f"Client error occurred: {e}") except TimeoutError as e: logger.error(e) send_message(account.user.bot_token, account.user.group_id, f'{account.url}:加载超时,请检查是否后台更换了链接') except Exception as e: logger.error(f"Unknown error: {e}") time.sleep(10) send_message(account.user.bot_token, account.user.group_id, f'{account.url}: Retry limit exceeded, please check the code') logger.error(f"{account.url}: Retry limit exceeded, please check the code") async def async_account_post(url: str, account: Account, params: dict) -> ApiResponse[Any]: for _ in range(3): try: api_res = await async_post(url=account.url + url, headers=account.headers, params=params) if api_res.status_code == 6000: return api_res else: logger.error(api_res.message) logger.info('Retrying login') account = await asyncio.get_running_loop().run_in_executor(None, login, account) except ClientError as e: logger.error(f"Client error occurred: {e}") except Exception as e: logger.error(f"Unknown error: {e}") # Add a delay before retrying await asyncio.sleep(10) send_message(account.user.bot_token, account.user.group_id, f'{account.url}: Retry limit exceeded, please check the code') logger.error("Retry limit exceeded, please check the code")