Найти в Дзене
Канал Сусанина

Как написать телеграм-бот с рассылкой на Python. Исходный код прилагается.

Всем привет! В этой статье я покажу, как написать своего телеграм-бота с рассылкой в определенное время или по команде на языке Python с использованием библиотеки aiogram. Если вы привыкли писать с помощью библиотеки telebot, то ничего страшного, на aiogram перейти совсем несложно, эти библиотеки, с точки зрения названий методов, классов и пр., почти во всём абсолютно идентичны. Как зарегистрировать бота, установить Python и т.д., думаю, рассказывать не нужно. Немного о том, для чего вам может понадобиться рассылка в вашем боте Первые 3 вещи, которые приходят в голову: реклама, сообщение, когда где-то в интернете появляется новый пост или новость (например, в твиттере) и когда надо просто о чем-то уведомить пользователей. Рассылка по команде Начнем писать бота. Пока, думаю, ничего сложного. Создадим хэндлер для старта и научим бота запоминать пользователей. Для простоты будем записывать id пользователей в тестовый документ, но вы можете использовать базу данных или что угодно еще, это
Оглавление

Всем привет! В этой статье я покажу, как написать своего телеграм-бота с рассылкой в определенное время или по команде на языке Python с использованием библиотеки aiogram. Если вы привыкли писать с помощью библиотеки telebot, то ничего страшного, на aiogram перейти совсем несложно, эти библиотеки, с точки зрения названий методов, классов и пр., почти во всём абсолютно идентичны. Как зарегистрировать бота, установить Python и т.д., думаю, рассказывать не нужно.

Немного о том, для чего вам может понадобиться рассылка в вашем боте

Первые 3 вещи, которые приходят в голову: реклама, сообщение, когда где-то в интернете появляется новый пост или новость (например, в твиттере) и когда надо просто о чем-то уведомить пользователей.

Рассылка по команде

Начнем писать бота. Пока, думаю, ничего сложного. Создадим хэндлер для старта и научим бота запоминать пользователей. Для простоты будем записывать id пользователей в тестовый документ, но вы можете использовать базу данных или что угодно еще, это не принципиально. Такой код по началу получается:

Тут я создал функцию new_user(), которая принимает id пользователя и записывает его в users.txt, одна строка - один id.

Теперь напишем две функции: первая будет возвращать список записанных id, а вторая - производить рассылку. Пишем:

-2

Думаю, пока понятно, что и как работает. Единственное, что может вызвать вопрос - функция отправки сообщения (22 строка) находится внутри try. Всё потому, что пользователь, которому отправляется сообщение, мог заблокировать бота, а его id остался в нашем списке, и при попытке отправки ему сообщения, появится ошибка, а код её поймает.

Теперь добавим хэндлер, срабатывающий на команду /mailing. Вы, разумеется, можете использовать любую другую команду.

-3

Тут мы проверяем, является ли id того, кто прислал сообщение, id администратора (38 строка) (id админа должно быть int, т.к. user_id - тоже int), чтобы рассылку не мог запустить любой желающий. И, если условие выполняется, - запускается рассылка.

А как же сделать рассылку в определённое время или с какой-то периодичностью?

Тут немного сложнее, но тем не менее, всё достаточно легко, если понять, что к чему. Для создания расписания рассылок нам понадобятся библиотеки aioschedule и asyncio, импортируем их.

Сперва напишем две функции: scheduler и on_startup.

-4

При вызове on_startup создаётся расписание scheduler и начинает свою работу.

Функция scheduler отвечает за вызов функции рассылки (start_mailing) в заданное время (в моём случае раз в день). В 30 строке указываем, с какой периодичностью надо совершать рассылку. Чтобы, например, сделать рассылку раз в 5 минут, то 30 строка будет выглядеть так:

aioschedule.every(5).minutes.do(start_mailing).

Более подробно с библиотекой aioschedule можно ознакомиться в документации, но если вам лень её изучать (а это зря), то вот несколько примеров, как может выглядеть 30 строка:

В цикле while, на 31 строке, раз в секунду вызывается функция run_pending, которая проверяет, сколько времени прошло с прошлого вызова, и если это время больше или равно периоду функции, указанной в методе do, то эта функция вызывается. В нашем случае вызывается функция start_mailing. Из этого следует, что функция run_pending должна вызываться не реже периода, заданного в 30 строке. Надеюсь, это объяснение было более-менее понятно.

Теперь осталось только написать функцию запуска бота и расписания. Тут нет ничего сложно, просто добавляем в конец кода конструкцию:

-5

А в начале кода импортируем executor:

from aiogram.utils import executor

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

Надеюсь, моё объяснение было хотя бы отчасти понятно. Исходный код моего бота есть по ссылке: https://gist.github.com/susanin3/1a573178a2ff93f1bddd14740b0f6b1e

А если кому-то интересно, то вот реальный пример реализации рассылки (да, это мой бот): http://t.me/what_prazdnik_bot

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

UPD: Следующая статья про рассылку на основе часового пояса - https://zen.yandex.ru/media/id/5e78e0cb7e25d84126739e31/kak-sdelat-rassylku-na-osnove-chasovogo-poiasa-v-telegrambote-na-python-ishodnyi-kod-prilagaetsia-60982c0587bf2977fca25650