94 lines
3.4 KiB
Python
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")
|