Ботостроение Telegram. Apscheduler - отправляем сообщения по расписанию. Aiogram полное руководство.
Вставка
- Опубліковано 23 жов 2022
- 📘 Очень часто возникает необходимость запускать функции в определенное либо спустя какое-то время. Для этого можно и даже нужно использовать apscheduler. И в сегодняшнем видео речь пойдет именно об этом.
Aiogram - это мощный, но в тоже время простой инструмент для создания телеграм ботов. В этой серии видеоуроков я познакомлю тебя с его функционалом и в конце изучения для закрепления навыков мы напишем телеграм бота. Обязательно подпишись на канал, поставь лайк этому видео и выскажи свое мнение об этом видео в комментариях. Активируй колокол, чтобы не пропустить ни одного видео, которое со 100% вероятностью поможет тебе в изучении ботостроения!
🐍 Научись зарабатывать на Python - money-python.com/telegram
🎯 Обязательно ознакомься с моими курсами, в которых мы с учениками работаем достаточно тесным, можно сказать, "семейным" составом.
Мы прокачаем твой скилл с "я ничего не понимаю в python" до "я умею писать шустрых, легких и стабильных телеграм ботов".
Никакой воды и видео по 40, а то и больше минут - только сжатая, сконцентрированная выжимка практики. Моя задача - дать вам продвинутые навыки простыми словами, которые сделают вас на голову выше всех остальных и уменьшить ваши времязатраты на разработку своих проектов или клиентских.
▶ Смотреть весь плейлист Aiogram - tinyurl.com/45bz73r8
▶ Смотреть весь плейлист Pyrogram - tinyurl.com/4bvy7d8p
📢 Внимание!
Эти пакеты были перемещены, вы должны исправить импорт в вашем коде, если вы используете версию 3.0.0b4 и выше:
aiogram.dispatcher.filters ➡ aiogram.filters
aiogram.dispatcher.fsm ➡ aiogram.fsm
aiogram.dispatcher.handler ➡ aiogram.handler
aiogram.dispatcher.webhook ➡ aiogram.webhook
aiogram.dispatcher.flags/* ➡ aiogram.dispatcher.flags (модуль вместо пакета)
а Apscheduler можно использовать в больших высоконагруженных ботах где у каждого пользователя будет по 20-30 таких задач которые выполнятся будут в течении 1-30 дней. и не пропадут ли они при перезагрузке бота ?
Смотря что имеешь ввиду под "большим проектом". Скажем так, если несколько сотен пользователей в минуту одновременно в боте, то уже лучше очередь использовать.
@@nztcoder типо rabbitmq ? там можно делать отложенные задачи
я просто никогда больших проектов не писал, но тут планируется довольно много пользователей, и мне нужночто то надежное. чтобы если что случится все задачи которые устанавливали пользователи не пропали @@nztcoder
rabbitmq, apache kafka, aws sqs, redis, nats, celery... да много чем можно. Я бы выбрал кролика и пика
я пробовал с redis, но вообще не оправдало ожиданий, задачи постоянно либо пропадали либо их наоборот становилось больше, если одна задача выдаст ошибку то все другие не смогу выполнится, там очень много проблем, ну либо я криворукий @@nztcoder
Спасибо большое за урок! Решил свою задачу благодаря видео, а главное - *всё понял* .
Благодарю. Рад, что помог.
Отличные примеры, все мои задачи были решены этим видео роликом, желаю процветания этому каналу. Автор красавчик))❤
Спасибо большое!
чётко и по делу без воды. вот прям поклон в ноги, лайк и подписка за такие видео
Спасибо тебе мил человек!
Udachi bro!
Спасибо. И тебе!
а есть ли бот для ограничения написания количества сообщений в группе?
напиши, какую версию Apscheduler испоьзовал. Работает только interval
Здравствуйте, у меня при вызове /form уже в боте, в скрипте ошибка вылазит:
TypeError: SchedulerMiddleware.__call__() got multiple values for argument 'handler'
А вот код:
class SchedulerMiddleware(BaseMiddleware):
def __init__(self, scheduler: AsyncIOScheduler):
self.scheduler = scheduler
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any]
) -> Any:
data['apscheduler'] = self.scheduler
return await handler(event, data)
И в чем проблема что он несколько принимает аргументов ?
Доброй ночи и большое спасибо за великолепный урок. Подскажите, пожалуйста, в этой библиотеке есть какой-нибудь метод, который выполнит после включения бота все таски, который не выполнились из-за того, что он был выключен в момент их выполнения?
Если таски были сохранены в редис то при запуске планировщика можно их выполнить.
Так рабочий вариант, вот только столкнулся с одним не понятным поведением.
При добавлении таски с триггером на дату, в приложении запущенном в контейнере они отказываются отправляется, при этом если вот запустить как автор показал (локально) то все работает. Не нашёл решение.
Разве это мидлварь наложидся не на все апдейты? Или где эта связь с файлом нашего апшедулера
спасибо за урок!)
подвис на моменте с 'from core.handlers import apsched', не удалось найти библиотеку из которой это импортируется, библиотек 'core' много всяких.. что за библиотека?)
пс. интернет мне в этом не помог, по этому и пишу
автор импортирует apsched из папки handlers которая находиться в папке core в папке проекта
Вопрос для ленивых, а не проще ли после заполнения FSM формы просто использовать async.sleep(time) чтобы была задержка, а не через мидлвар?))
Вроде как если бот крашнется то редис не сохранит асинк слип, а мидлварь сохранит
а как сделать чтоб каждую неделю определенного дня
Здравствуйте, почему у меня не получается импортировать apsched из core.handlers? - Выдает ошибку
1:11 - ты прописываешь токен бота? я прописываю свой и выдает ошибка, что chat_id является обязательным аргументом и тп, что я только не перепробовал уже, менял и тп, не работает.
Это id чата в который бот будет отправлять сообщение. Можно тебе самому в личку или в группу в которую бот добавлен. Как узнать id чата или группы можешь загуглить.
Скажите пожалуйста, а зачем нужен мидлварь, если можно прокидывать apscheduler сразу в диспетчер: dp = Dispatcher(apscheduler=apcheduler)?
Можно и так. Когда видео записывалось, то не было ещё такой фичи.
И в миддлварь можно добавлять данные до и после фильтров.
Этот шедулер можно стартовать сразу после его создания, а таски добавлять уже потом?
Можно
А где ссылка на код с урока?
Можно ли как-то параллельно отправлять считанные в определенный день сообщения, на примере:
Админ отправляет фотографию, и настраивает рассылку таким образом, чтобы она выполнялась 31 день каждые 12 часов, рассылка пошла, но через 5 дней он решил, что ещё нужно рассылать видео 31 день каждые 6 часов;
Вот можно ли это как-то реализовать?
Можно конечно
Спасибо вам за видео.
Подскажите, пожалуйста, как создавать через python именно отложенные сообщения, та самая функция отправить позже, schedule message?
Т.е. не держать бота включенным 24/7, а запустить python скрипт, который создать отложенные сообщения в чате и скрипт завершится.
В боте есть отложенные сообщения? :)
Только есть использовать userbot
Подскажите, пожалуйста, а возможно ли сделать так, чтобы оповещения от бота приходили пользователю в выбранное им время? Допустим, вначале ьы спрашиваешь время (с помощью кнопок), человек выбирает, и определенное сообщение приходит в то время, которое выбрал человек? И в любое время он может поменять настройки оповещения, выбрать другое время и теперь вместо прошлого, будет выдаваться сообщение в другое время. Если это возможно, то как это можно сделать?
Возможно. С помощью Пайтон, Джанго и библиотеки айограмм.
@@nztcoder спасибо за ответ)
@@nztcoder а причем django тут ?
@@Chel1k7 можешь вместо него юзать любую другую ORM. Например SQLAlchemy)
Как отправлять каждый день разное сооьщение через scheduler? Не по дате, а со времени, когда пользователь нажал /start
ua-cam.com/video/ORMED692Ma8/v-deo.html
Привет! Тоже ищу решение данной проблемы, не подскажешь, каким образом реализовал?
А как использовать такую отправку сообщений вместе с sqlalchemy datastore? Не могу реализовать, потому что объект Bot - unpickleable и соответсвенно аргументы не могут записаться в бд
Привет! Получилось решить эту проблему?
@@mideks Да, получилось, я использую contexvars.
current_bot: ContextVar[Bot | None] = ContextVar(
"current_bot", default=None
)
в файлике _context.py
При запуске бота это импортируеться и задаеться значение
_context.current_bot.set(bot)
Дальше в schedules импортируеться переменная и получаеться её значение
bot: Bot = current_bot.get()
Решение не самое изячное, но что придумал то и есть. Пока что работает)
@@mideks Да, удалось решить, использовал contexvars
Не самое изячное решение, но как придумал. Пока что работает)
А почему ты всё суёшь в мидлвари, а не в диспетчер например?
Когда писал видео не было фичи через диспетчер пробрасывать.
А что делать, если у Dispatcher теперь метода update нет?
Использовать регистрацию хэндлера на требуемые типы апдейтов - вместо update указываем message как пример.
Подскажите, пожалуйста, я полный 0 в программировании, но мне нужно сделать так, что бы бот от моего лица отправлял конкретное сообщение, конкретному пользователю, через конкретный промежуток времени. Можно так сделать?
Сообщение от бота можно отправить в том случае, если пользователь первым написал этому боту.
@@nztcoder а можно сделать так, что бы от себя отправлять каждые три часа конкретному пользователю? Просто сейчас я ставлю таймеры на отправку сообщения каждый три часа, а заводить их надоедает постоянно, вот я и ищу решение
Можно конечно. В пирограм есть метод отправки сообщения. В нем есть параметр отложенной публикации.
1
kwargs={'bot': bot} интересует откуда мы испортировали bot
из aiogram
честно, мы как будто с Вами разные библиотеки используем. В документации и тут одно, а в проекте ничего не работает
а что такое from core.utils from core.handlers - у меня не получается просто выполнить код, оно пытается искать модуль core которого у меня нет
Это импорт функций написанных раннее. Посмотри весь плейлист по аиограм и сразу станет понятно что это.