Задать вопрос
@CharonIKHH

Бот не выполняет поставленные задачи, что делать?

С самого утра дособирал бота и он вроде бы работал вчера, но сегодня что-то пошло не так, если вчера он флудил о изменений цен на бирже 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() в асинхронном режиме

Для вашей простоты понимания кода - я попросил гпт поставить комментарии на каждую строчку.
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
@Losharik_YT
await dp.start_polling(bot, on_startup=on_startup)
почему это написано так?
async def main():
    await dp.start_polling(bot)

это правильная функция
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы