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

Пытаюсь сделать бота (на python), который поздравляет с днем рождением. Что неправильно делаю, как исправить (не программист)?

Хочу сделать так, чтобы при проверки условия отправлялось сообщение с поздравлением. Когда получаю список через def get_bds - все ок, а когда через def bd_sheduler, ругается
Job "bd_sheduler (trigger: interval[0:00:05], next run at: 2024-04-09 12:40:56 MSK)" raised an exception
Traceback (most recent call last):
File "C:\Education\BDnotification\venv\Lib\site-packages\apscheduler\executors\base_py3.py", line 30, in run_coroutine_job
retval = await job.func(*job.args, **job.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Education\BDnotification\handlers\admin_private.py", line 51, in bd_sheduler
for bd in await orm_get_birthdays(session):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Education\BDnotification\database\orm_query.py", line 20, in orm_get_birthdays
result = await session.execute(query)
^^^^^^^^^^^^^^^^^^^^^^
TypeError: AsyncSession.execute() missing 1 required positional argument: 'statement'

Пример кода
@admin_router.message(F.text == 'Список контактов')
async def get_bds(message: types.Message, session: AsyncSession):
    result = ''
    for bd in await orm_get_birthdays(session):
        result += f'Имя: {bd.name}\nДень рождения: {bd.birthday}\n--------------------------\n'
        # await message.answer(f'Имя: {bd.name}\nДень рождения: {bd.birthday}')
    await message.answer(result)
    await message.answer("Что хотите сделать?", reply_markup=ADMIN_KB)


async def bd_sheduler(message: types.Message, session: AsyncSession):
    today = (datetime.date.today().strftime('%d-%m'))
    for bd in await orm_get_birthdays(session):
        if today == bd.birthday.strftime('%d-%m'):
            await message.answer(f"Сегодня день рождение у {bd.name}")
            print("бяка")

#----------
async def orm_get_birthdays(session: AsyncSession):
    query = select(Birthday)
    result = await session.execute(query)
    return result.scalars().all()

#-------

async def main():
    dp.startup.register(on_startup)
    dp.shutdown.register(on_shutdown)
    scheduler = AsyncIOScheduler(timezone="Europe/Moscow")
    scheduler.add_job(bd_sheduler, trigger='interval', seconds=5,
                      kwargs={"message": types.Message, 'session': AsyncSession})
    scheduler.start()
    dp.update.middleware(DataBaseSession(session_pool=session_maker))
  • Вопрос задан
  • 539 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@skyfizi
Попробуйте бота данным способом и не забудьте установить библиотеки
aiogram - pip install aiogram
sqlalchemy - pip install sqlalchemy
asyncpg - pip install asyncpg
apscheduler - pip install apscheduler
from aiogram import types
from aiogram.dispatcher import Dispatcher
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from your_module_with_orm import Birthday  # Подставьте свой модуль и класс с днями рождения

async def bd_scheduler(message: types.Message, session: AsyncSession):
    today = datetime.date.today().strftime('%d-%m')
    for bd in await orm_get_birthdays(session):
        if today == bd.birthday.strftime('%d-%m'):
            await message.answer(f"Сегодня день рождения у {bd.name}! Поздравляем!")

async def orm_get_birthdays(session: AsyncSession):
    query = select(Birthday)
    result = await session.execute(query)
    return result.scalars().all()

async def main():
    # Ваша существующая инициализация dp и scheduler

    scheduler.add_job(bd_scheduler, trigger='interval', seconds=5,
                      kwargs={"message": types.Message, 'session': AsyncSession})
    scheduler.start()
Ответ написан
Ваш ответ на вопрос

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

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