kavermoki
@kavermoki
junior

Aiogram и apscheduler, как сделать сообщение по заданному времени?

Всем привет. задача такова, необходимо что бы в указанное время и интервал бот публиковал сообщение, создал отдельный файл apsched.py в нем указал необходимые ас.функции., в файле main сам алгоритм при команде старт (т.е. запуске бота).

Запускается все без ошибок, но потом, через несколько секунд, в момент выполнения первой функции возникает ошибка в файле apsched.py :

await bot.send_message(chat_id=message.from_user.id,
                           text='это сообщение через несколько сек после запуска бота')


ошибка:

await bot.send_message(chat_id=message.from_user.id,
                                                    ^^^^^^^
NameError: name 'message' is not defined



как я понял, что типа ему нужен хендлер. но мне то он не нужен, пользователь ничего не должен писать. Что туда надо впихнуть, что бы он не кричал на меня?


это файл apsched.py

from aiogram import Bot

async def send_message_time(bot: Bot):
await bot.send_message(chat_id=message.from_user.id,
text='это сообщение через несколько сек после запуска бота')

async def send_message_cron(bot: Bot):
await bot.send_message(chat_id=message.from_user.id,
text='Это сообщение будет отправляться каждый день')

async def send_message_interval(bot: Bot):
await bot.send_message(chat_id=message.from_user.id,
text='Это сообщение будет оптравляться с интервалом в 1 минуту')

main.py - файл

@dp.message_handler(commands=['start'])
async def command_start(message: types.Message):
await bot.send_message(chat_id=message.from_user.id,
text='Добро пожаловать!',
reply_markup=kb)
await message.delete()

scheduler = AsyncIOScheduler(timezone='Europe/Moscow')
scheduler.add_job(apsched.send_message_time, trigger='date', run_date=datetime.now() + timedelta(seconds=10),
kwargs={'bot': bot})
scheduler.add_job(apsched.send_message_cron, trigger='cron', hour=datetime.now().hour,
minute=datetime.now().minute + 1, start_date=datetime.now(),
kwargs={'bot': bot})
scheduler.add_job(apsched.send_message_interval, trigger='interval', seconds=60, kwargs={'bot': bot})
scheduler.start()
  • Вопрос задан
  • 3190 просмотров
Решения вопроса 1
@twopercent
await bot.send_message(chat_id=message.from_user.id,
text='это сообщение через несколько сек после запуска бота')
message.from_user.id берет id пользователя из сообщения, которое отлавливает хендлер. Соответственно, если бот ничего не отлавливливает, он не может знать какое сообщение, и какому юзеру отправить сообщение.

Чтобы бот отправил сообщение, ему нужно знать user_id (например из БД или .env если речь идет об ограниченном круге пользователей (напр админы))

Например
user_id_list = await get_users_sql()
for user_id in user_id_list:
await bot.send_message(user, text='lalala')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kavermoki
@kavermoki Автор вопроса
junior
В общем практически разобрался, поставил код в нужное окружение, и эта ошибка исчезла. Но теперь возникла другая ошибка, что бот не может отправлять сообщение боту:
Forbidden: bot can't send messages to bots

т.е. bot.send_message(chat_id=message.from_user.id)

нашел в документации, что нужно поменять на:

bot.send_message(chat_id=call.message.chat.id)

но теперь возникает естественно другая ошибка:

NameError: name 'call' is not defined

как я понял это декоратор нужно делать для анонимной функции которую надо вернуть True..
Но я что то пытаюсь.. и ничего не выходит.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы