tools-pyqt/src/core/api_request.py

94 lines
3.4 KiB
Python

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")