С самого утра дособирал бота и он вроде бы работал вчера, но сегодня что-то пошло не так, если вчера он флудил о изменений цен на бирже bybit, то сегодня максимум, что он может сделать это отписать о том, что бот "запущен" и всё. Каждые 5 секунд он должен отправлять отчёт об изменении цен крипты.
import asyncio # Импортируем модуль для работы с асинхронным программированием
from aiogram import Bot, Dispatcher, types # Импортируем необходимые компоненты aiogram
from aiogram.filters import Command # Импортируем фильтр для команд
from aiogram.types import BotCommand # Импортируем тип BotCommand для настройки команд бота
from config import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, BYBIT_API_KEY, BYBIT_API_SECRET, CHECK_INTERVAL, PRICE_CHANGE_THRESHOLD # Импортируем конфигурационные данные
from bybit_api import BybitClient, get_volatility # Импортируем класс BybitClient и функцию get_volatility для работы с API Bybit
from chart import create_chart # Импортируем функцию create_chart для создания графиков
# Создаем экземпляр бота с указанным токеном
bot = Bot(token=TELEGRAM_BOT_TOKEN)
# Создаем экземпляр диспетчера для обработки сообщений и событий
dp = Dispatcher()
# Присваиваем бота диспетчеру
dp['bot'] = bot
# Словарь для хранения последних цен для каждой пары
last_prices = {}
# Асинхронная функция для отправки уведомлений о волатильности
async def send_volatility_alert():
# Создаем экземпляр клиента Bybit с указанными ключами API
client = BybitClient(api_key=BYBIT_API_KEY, api_secret=BYBIT_API_SECRET)
# Получаем текущие тикеры с биржи Bybit
tickers = client.get_tickers()
# Получаем список волатильных пар с заданным порогом изменения цены
volatile_pairs = get_volatility(tickers, PRICE_CHANGE_THRESHOLD)
# Проходимся по каждой волатильной паре
for pair in volatile_pairs:
symbol = pair['symbol'] # Получаем тикер криптовалютной пары
price_change = float(pair.get('priceChangePercent', 0)) # Получаем процент изменения цены (если нет данных, ставим 0)
current_price = float(pair['lastPrice']) # Получаем текущую цену криптовалютной пары
message = f' {symbol} изменился на {price_change:.2f}% за последние {CHECK_INTERVAL // 60} минут.' # Формируем сообщение о изменении цены
# Если символа нет в словаре последних цен, инициализируем его пустым списком
if symbol not in last_prices:
last_prices[symbol] = []
# Добавляем текущую цену в список последних цен
last_prices[symbol].append(current_price)
# Ограничиваем список последних цен до 50 элементов
if len(last_prices[symbol]) > 50:
last_prices[symbol] = last_prices[symbol][-50:]
# Создаем список временных меток для графика
timestamps = list(range(len(last_prices[symbol])))
# Создаем график для криптовалютной пары
chart = create_chart(timestamps, last_prices[symbol], symbol)
# Отправляем сообщение и график в Telegram
await bot.send_message(TELEGRAM_CHAT_ID, message)
await bot.send_photo(TELEGRAM_CHAT_ID, photo=chart)
# Асинхронная функция для периодической проверки волатильности
async def check_volatility():
while True:
await send_volatility_alert() # Вызываем функцию отправки уведомлений о волатильности
await asyncio.sleep(CHECK_INTERVAL) # Ждем заданный интервал времени перед следующей проверкой
# Асинхронная функция для выполнения задач при старте бота
async def on_startup():
asyncio.create_task(check_volatility()) # Создаем задачу для проверки волатильности при старте бота
# Асинхронная функция-обработчик для команды /start
async def start_command(message: types.Message):
await message.answer("Бот запущен и следит за волатильностью.") # Отправляем ответное сообщение пользователю
# Основная асинхронная функция
async def main():
# Регистрируем обработчик команды /start
dp.message.register(start_command, Command(commands=["start"]))
# Устанавливаем команду /start для бота
await bot.set_my_commands([BotCommand(command="/start", description="Запустить бота")])
# Запускаем процесс приема сообщений через polling
await dp.start_polling(bot, on_startup=on_startup)
# Проверяем, запущен ли файл как главный, и запускаем основную функцию
if __name__ == "__main__":
asyncio.run(main()) # Запускаем основную функцию main() в асинхронном режиме
Для вашей простоты понимания кода - я попросил гпт поставить комментарии на каждую строчку.