Ботостроение 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 (модуль вместо пакета)

КОМЕНТАРІ • 68

  • @RunBull
    @RunBull 7 місяців тому +2

    а Apscheduler можно использовать в больших высоконагруженных ботах где у каждого пользователя будет по 20-30 таких задач которые выполнятся будут в течении 1-30 дней. и не пропадут ли они при перезагрузке бота ?

    • @nztcoder
      @nztcoder  7 місяців тому

      Смотря что имеешь ввиду под "большим проектом". Скажем так, если несколько сотен пользователей в минуту одновременно в боте, то уже лучше очередь использовать.

    • @RunBull
      @RunBull 7 місяців тому

      @@nztcoder типо rabbitmq ? там можно делать отложенные задачи

    • @RunBull
      @RunBull 7 місяців тому

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

    • @nztcoder
      @nztcoder  7 місяців тому +1

      rabbitmq, apache kafka, aws sqs, redis, nats, celery... да много чем можно. Я бы выбрал кролика и пика

    • @RunBull
      @RunBull 7 місяців тому

      я пробовал с redis, но вообще не оправдало ожиданий, задачи постоянно либо пропадали либо их наоборот становилось больше, если одна задача выдаст ошибку то все другие не смогу выполнится, там очень много проблем, ну либо я криворукий @@nztcoder

  • @rible1847
    @rible1847 Рік тому +6

    Спасибо большое за урок! Решил свою задачу благодаря видео, а главное - *всё понял* .

    • @nztcoder
      @nztcoder  Рік тому

      Благодарю. Рад, что помог.

  • @c0mrad_eth940
    @c0mrad_eth940 Рік тому +2

    Отличные примеры, все мои задачи были решены этим видео роликом, желаю процветания этому каналу. Автор красавчик))❤

  • @nibirus1096
    @nibirus1096 Рік тому +1

    Спасибо большое!

  • @812Corn
    @812Corn Рік тому +1

    чётко и по делу без воды. вот прям поклон в ноги, лайк и подписка за такие видео

  • @niyazg6572
    @niyazg6572 Місяць тому +1

    Спасибо тебе мил человек!

  • @ustoz_shogird5699
    @ustoz_shogird5699 Рік тому +1

    Udachi bro!

    • @nztcoder
      @nztcoder  Рік тому

      Спасибо. И тебе!

  • @user-wn1hu5ko8q
    @user-wn1hu5ko8q Рік тому

    а есть ли бот для ограничения написания количества сообщений в группе?

  • @SoTer771
    @SoTer771 Місяць тому

    напиши, какую версию Apscheduler испоьзовал. Работает только interval

  • @storm9479
    @storm9479 6 місяців тому +1

    Здравствуйте, у меня при вызове /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)
    И в чем проблема что он несколько принимает аргументов ?

  • @maxshine-qf7qg
    @maxshine-qf7qg 6 місяців тому

    Доброй ночи и большое спасибо за великолепный урок. Подскажите, пожалуйста, в этой библиотеке есть какой-нибудь метод, который выполнит после включения бота все таски, который не выполнились из-за того, что он был выключен в момент их выполнения?

    • @nztcoder
      @nztcoder  6 місяців тому

      Если таски были сохранены в редис то при запуске планировщика можно их выполнить.

  • @HEKPACOFF
    @HEKPACOFF 11 місяців тому

    Так рабочий вариант, вот только столкнулся с одним не понятным поведением.
    При добавлении таски с триггером на дату, в приложении запущенном в контейнере они отказываются отправляется, при этом если вот запустить как автор показал (локально) то все работает. Не нашёл решение.

  • @iii8176
    @iii8176 9 місяців тому

    Разве это мидлварь наложидся не на все апдейты? Или где эта связь с файлом нашего апшедулера

  • @jussimpudence3244
    @jussimpudence3244 Рік тому +1

    спасибо за урок!)
    подвис на моменте с 'from core.handlers import apsched', не удалось найти библиотеку из которой это импортируется, библиотек 'core' много всяких.. что за библиотека?)
    пс. интернет мне в этом не помог, по этому и пишу

    • @emerald2281
      @emerald2281 Рік тому +3

      автор импортирует apsched из папки handlers которая находиться в папке core в папке проекта

  • @Chel1k7
    @Chel1k7 Рік тому +1

    Вопрос для ленивых, а не проще ли после заполнения FSM формы просто использовать async.sleep(time) чтобы была задержка, а не через мидлвар?))

    • @user-bc4lm6fn1t
      @user-bc4lm6fn1t 7 місяців тому

      Вроде как если бот крашнется то редис не сохранит асинк слип, а мидлварь сохранит

  • @zaplav-if5un
    @zaplav-if5un Рік тому

    а как сделать чтоб каждую неделю определенного дня

  • @user-im4jb4vb7e
    @user-im4jb4vb7e 2 місяці тому

    Здравствуйте, почему у меня не получается импортировать apsched из core.handlers? - Выдает ошибку

  • @igorproweb7301
    @igorproweb7301 Рік тому +1

    1:11 - ты прописываешь токен бота? я прописываю свой и выдает ошибка, что chat_id является обязательным аргументом и тп, что я только не перепробовал уже, менял и тп, не работает.

    • @Pyro231
      @Pyro231 Рік тому

      Это id чата в который бот будет отправлять сообщение. Можно тебе самому в личку или в группу в которую бот добавлен. Как узнать id чата или группы можешь загуглить.

  • @denys_solom
    @denys_solom 11 місяців тому

    Скажите пожалуйста, а зачем нужен мидлварь, если можно прокидывать apscheduler сразу в диспетчер: dp = Dispatcher(apscheduler=apcheduler)?

    • @nztcoder
      @nztcoder  11 місяців тому

      Можно и так. Когда видео записывалось, то не было ещё такой фичи.
      И в миддлварь можно добавлять данные до и после фильтров.

  • @xjpfxei
    @xjpfxei 2 місяці тому

    Этот шедулер можно стартовать сразу после его создания, а таски добавлять уже потом?

  • @OlgaPetropavlovskaia
    @OlgaPetropavlovskaia 4 місяці тому

    А где ссылка на код с урока?

  • @user-oo2dc1dy7p
    @user-oo2dc1dy7p 7 місяців тому

    Можно ли как-то параллельно отправлять считанные в определенный день сообщения, на примере:
    Админ отправляет фотографию, и настраивает рассылку таким образом, чтобы она выполнялась 31 день каждые 12 часов, рассылка пошла, но через 5 дней он решил, что ещё нужно рассылать видео 31 день каждые 6 часов;
    Вот можно ли это как-то реализовать?

    • @nztcoder
      @nztcoder  7 місяців тому

      Можно конечно

  • @Thestarter100
    @Thestarter100 Рік тому

    Спасибо вам за видео.
    Подскажите, пожалуйста, как создавать через python именно отложенные сообщения, та самая функция отправить позже, schedule message?
    Т.е. не держать бота включенным 24/7, а запустить python скрипт, который создать отложенные сообщения в чате и скрипт завершится.

    • @nztcoder
      @nztcoder  Рік тому

      В боте есть отложенные сообщения? :)

    • @montecristo31
      @montecristo31 7 місяців тому

      Только есть использовать userbot

  • @krissh95
    @krissh95 Рік тому

    Подскажите, пожалуйста, а возможно ли сделать так, чтобы оповещения от бота приходили пользователю в выбранное им время? Допустим, вначале ьы спрашиваешь время (с помощью кнопок), человек выбирает, и определенное сообщение приходит в то время, которое выбрал человек? И в любое время он может поменять настройки оповещения, выбрать другое время и теперь вместо прошлого, будет выдаваться сообщение в другое время. Если это возможно, то как это можно сделать?

    • @nztcoder
      @nztcoder  Рік тому +1

      Возможно. С помощью Пайтон, Джанго и библиотеки айограмм.

    • @krissh95
      @krissh95 Рік тому

      @@nztcoder спасибо за ответ)

    • @Chel1k7
      @Chel1k7 Рік тому +1

      @@nztcoder а причем django тут ?

    • @maxshine-qf7qg
      @maxshine-qf7qg 6 місяців тому

      @@Chel1k7 можешь вместо него юзать любую другую ORM. Например SQLAlchemy)

  • @assetorymbayev267
    @assetorymbayev267 Рік тому

    Как отправлять каждый день разное сооьщение через scheduler? Не по дате, а со времени, когда пользователь нажал /start

    • @c0mrad_eth940
      @c0mrad_eth940 Рік тому

      ua-cam.com/video/ORMED692Ma8/v-deo.html

    • @user-ql4ew4hn6h
      @user-ql4ew4hn6h 11 місяців тому

      Привет! Тоже ищу решение данной проблемы, не подскажешь, каким образом реализовал?

  • @vython_vv
    @vython_vv 4 місяці тому +1

    А как использовать такую отправку сообщений вместе с sqlalchemy datastore? Не могу реализовать, потому что объект Bot - unpickleable и соответсвенно аргументы не могут записаться в бд

    • @mideks
      @mideks 2 місяці тому

      Привет! Получилось решить эту проблему?

    • @vython_vv
      @vython_vv 2 місяці тому

      @@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()
      Решение не самое изячное, но что придумал то и есть. Пока что работает)

    • @vython_vv
      @vython_vv 2 місяці тому

      @@mideks Да, удалось решить, использовал contexvars
      Не самое изячное решение, но как придумал. Пока что работает)

  • @xjpfxei
    @xjpfxei 2 місяці тому

    А почему ты всё суёшь в мидлвари, а не в диспетчер например?

    • @nztcoder
      @nztcoder  2 місяці тому +1

      Когда писал видео не было фичи через диспетчер пробрасывать.

  • @lolyadop
    @lolyadop Рік тому

    А что делать, если у Dispatcher теперь метода update нет?

    • @nztcoder
      @nztcoder  Рік тому

      Использовать регистрацию хэндлера на требуемые типы апдейтов - вместо update указываем message как пример.

  • @AceOffSpad3s
    @AceOffSpad3s Рік тому

    Подскажите, пожалуйста, я полный 0 в программировании, но мне нужно сделать так, что бы бот от моего лица отправлял конкретное сообщение, конкретному пользователю, через конкретный промежуток времени. Можно так сделать?

    • @nztcoder
      @nztcoder  Рік тому

      Сообщение от бота можно отправить в том случае, если пользователь первым написал этому боту.

    • @AceOffSpad3s
      @AceOffSpad3s Рік тому

      @@nztcoder а можно сделать так, что бы от себя отправлять каждые три часа конкретному пользователю? Просто сейчас я ставлю таймеры на отправку сообщения каждый три часа, а заводить их надоедает постоянно, вот я и ищу решение

    • @nztcoder
      @nztcoder  Рік тому

      Можно конечно. В пирограм есть метод отправки сообщения. В нем есть параметр отложенной публикации.

  • @ilyosbekkarshiboyev7134
    @ilyosbekkarshiboyev7134 Рік тому

    1

  • @zaplav-if5un
    @zaplav-if5un Рік тому

    kwargs={'bot': bot} интересует откуда мы испортировали bot

  • @meljnichenko
    @meljnichenko 2 місяці тому

    честно, мы как будто с Вами разные библиотеки используем. В документации и тут одно, а в проекте ничего не работает

  • @OctaveWeb
    @OctaveWeb 11 місяців тому

    а что такое from core.utils from core.handlers - у меня не получается просто выполнить код, оно пытается искать модуль core которого у меня нет

    • @nztcoder
      @nztcoder  11 місяців тому

      Это импорт функций написанных раннее. Посмотри весь плейлист по аиограм и сразу станет понятно что это.