Как мне запускать функцию при запуске бота? aiogram 3.3.0
Делаю бота модератора, и мне нужно чтоб при запуске бота запускалась функция со всеми необходимыми проверками, но проблема в том, что в функции с запуском проверки передается msg: Message, который нельзя передать если запуск с помощью if __name__ == '__main__':. Пробовал создавать функцию внутри if __name__ == '__main__', и думал что она будет сама запускаться, но так бот просто закрывается.
Вот код запуска бота:
async def main(msg: Message):
bot = Bot(token=config.bot_token)
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(router)
await bot.delete_webhook(drop_pending_updates=True)
await handlers.bot_started_check(msg) # Для запуска нужно передавать msg
print('Бот запущен')
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), on_startup=DB.bot_startup(1), on_shutdown=DB.bot_startup(0))
if __name__ == '__main__':
async def start(msg: Message):
logging.basicConfig(level=logging.INFO)
asyncio.run(main(msg))
Не знаю как пофиксить.
UPD: код handlers.py
from aiogram import types, F, Router
from aiogram.types import Message
from aiogram.filters import Command
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.context import FSMContext
from aiogram.types.message import ContentType
from aiogram.filters import ADMINISTRATOR, IS_ADMIN, IS_MEMBER, IS_NOT_MEMBER
from aiogram import Bot
import asyncio
from database import ModerDB
import pydantic_core
DB = ModerDB('DB.db')
import config
import swears
bot = Bot(token=config.bot_token)
router = Router()
async def bot_started_check(msg: Message):
while True:
if DB.bot_startup().fetchone()[0] == 1:
await bot.send_message(msg.chat.id,'Бот включен')
pass
else:
await bot.send_message(msg.chat.id, 'Бот выключен')
await asyncio.sleep(1)
async def bot_stopped(msg: Message):
if DB.bot_startup().fetchone()[0] != 1:
await bot.send_message(msg.chat.id, 'Бот выключен.')
@router.message(Command(commands='start', prefix='!'))
async def start(msg: Message):
if not DB.bot_exist(bot.id):
DB.bot_activate(bot.id)
await bot.send_message(msg.chat.id, 'Бот был активирован✅')
await bot_started_check(msg)
@router.message(Command(commands='админ1', prefix='+'))
async def prefix(msg: Message):
member_name = ' '.join(msg.text.split()[1:])
if DB.username_exist(member_name):
await bot.send_message(msg.from_user.id, f'Участник {member_name} стал администратором первого уровня.')
else:
await bot.send_message(msg.chat.id, 'Учатник не найден.')
await bot.set_chat_administrator_custom_title(msg.chat.id, msg.reply_to_message.from_user.id, f'{member_name}')
@router.message(F.text, lambda msg: any(x in msg.text.lower().replace("ё", "е") for x in swears.swears))
async def censure(msg: Message):
await msg.delete()
await msg.answer("Без мата, пожалуйста ⛔")
Ответы (1 шт):
Автор решения: Иван Ипатов
→ Ссылка
Вариант, где боту не надо писать сообщение:
async def main():
bot = Bot(token=config.bot_token)
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(router)
await bot.delete_webhook(drop_pending_updates=True)
await handlers.bot_started_check(bot) # вставьте bot
print('Бот запущен')
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), on_startup=DB.bot_startup(1),
on_shutdown=DB.bot_startup(0))
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
asyncio.run(main())
async def bot_started_check(bot: Bot):
while True:
if DB.bot_startup().fetchone()[0] == 1:
await bot.send_message(ТУТ ВАШ TG ID,'Бот включен')
pass
else:
await bot.send_message(ТУТ ВАШ TG ID, 'Бот выключен')
await asyncio.sleep(1)
Вариант, где боту надо писать сообщение:
async def main():
bot = Bot(token=config.bot_token)
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(router)
await bot.delete_webhook(drop_pending_updates=True)
@dp.message()
async def test_func(msg: Message):
await handlers.bot_started_check(msg)
print('Бот запущен')
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), on_startup=DB.bot_startup(1),
on_shutdown=DB.bot_startup(0))
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
asyncio.run(main())
async def bot_started_check(msg: Message):
while True:
if DB.bot_startup().fetchone()[0] == 1:
await message.answer('Бот включен')
pass
else:
await message.answer('Бот выключен')
await asyncio.sleep(1)
Насчёт остальных ваших фрагментов кода, я не знаю, проверить не могу, возможны ошибки, например в
dp.include_router(router)