import os from typing import Any import uuid from requests.auth import HTTPBasicAuth from yookassa import Configuration, Payment import aiohttp import mysql.connector import requests from dotenv import load_dotenv load_dotenv() def get_contract_ret_tron(hash_user: str, amount: int) -> bool: """ URL для запроса инфо о транзакции tron """ # GET запрос к API response = requests.get(f"https://apilist.tronscanapi.com/api/transaction-info?hash={hash_user}") response.raise_for_status() data = response.json() # Получаем ответ в джисон if 'trc20TransferInfo' not in data or len(data['trc20TransferInfo']) == 0: return False # если нет ключа или он 0, прерываем функцию amount_hash = amount * 1000000 # реальную сумму надо умножить. так указано в джон ответах transfer_info = data['trc20TransferInfo'][0] if transfer_info.get('to_address') == os.getenv('TO_ADRESS'): if transfer_info.get('amount_str') == str(amount_hash): return data.get('contractRet') == "SUCCESS" return False def get_contract_ret_arbitrum(hash_user: str, amount: int) -> bool: """ URL для запроса инфо о транзакции Arbitrum """ url = "https://api.arbiscan.io/api" params = { 'module': 'proxy', 'action': 'eth_getTransactionReceipt', 'txhash': hash_user, 'apikey': os.getenv('ARBITRUM_API_KEY')} response = requests.get(url, params=params) data = response.json() # Получаем ответ в джисон if 'result' not in data or data['result'] is None: return False # Прерывание функции, если result нет или пустой if 'logs' not in data['result'] or len(data['result']['logs']) == 0: return False # Прерывание функции, если logs нет или пустая amount_hash = amount * 1000000 # реальную сумму надо умножить. так указано в джон ответах # в джисон ответе данные в hex формате. ниже идет логика перевода в читабельный формат для проверок hex_data = data['result']['logs'][0]['data'] hex_address = data['result']['logs'][0]['topics'][2] hex_status = data['result']['status'] decimal_data = int(hex_data, 16) decimal_status = int(hex_status, 16) address = hex_address[-40:] if decimal_data == amount_hash: if address == os.getenv('ARBITRUM_ADRESS'): return decimal_status == 1 return False def create_connection() -> Any: """ подключения к базе данных mysql """ connection = mysql.connector.connect( host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_DATABASE'),) return connection async def get_usd_rub_course() -> None: """Получает курс USD/RUB с openexchangerates.org""" from database_queries import adding_well async with aiohttp.ClientSession() as session: async with session.get( "https://openexchangerates.org/api/latest.json?" "app_id=488b07ebd6964a71b838ea93fbebcd31&base=USD&symbols=RUB") as response: data = await response.json() usd_rub_course = round(data["rates"]["RUB"], 2) conn = create_connection() cursor = conn.cursor() adding_well(cursor, usd_rub_course) conn.commit() async def payment_order_yukassa(price_rub: int, bot_username: str) -> dict: """ Формирование платежки в юкассе. Формат вывода - словарь""" Configuration.account_id = os.getenv('ACCOUNT_ID_YK') Configuration.secret_key = os.getenv('SECRET_KEY_YK') payment = Payment.create({ "amount": { "value": price_rub, "currency": "RUB"}, "confirmation": { "type": "redirect", "return_url": f"https://t.me/{bot_username}"}, "capture": True, "description": "Оплата подписки"}, uuid.uuid4()) return payment def check_payment_status(payment_id: str) -> str: """ Проверка статуса платежа по айди платежки """ shop_id = os.getenv('ACCOUNT_ID_YK') secret_key = os.getenv('SECRET_KEY_YK') url = f"https://api.yookassa.ru/v3/payments/{payment_id}" headers = {"Content-Type": "application/json"} response = requests.get(url, auth=HTTPBasicAuth(shop_id, secret_key), headers=headers) # сам запрос if response.status_code == 200: data = response.json() return data['status'] else: raise Exception(f"Ошибка при проверке статуса платежа: {response.status_code}, {response.text}") async def checking_and_deleting_users() -> None: """ Получает список id пользователй и бот удаляет их из чата, если они там есть """ from database_queries import check_expired_subscriptions, reset_user_data from main import bot_chat list_user_in_table = check_expired_subscriptions() print(list_user_in_table) for id_user in list_user_in_table: try: await bot_chat.ban_chat_member(-4226821992, id_user) reset_user_data(id_user) except Exception as e: print(f"Ошибка: {e}")