Найти в Дзене
Записки сисадмина

Python. MAX бот. Массовые рассылки сообщений.

Как-то странно получается, что канал системного администратора заполнен постами по программированию. Когда-нибудь я исправлюсь и начну писать о том, что уже давно знаю и умею. А пока что свежие задачи, свежие наработки, и снова скрипты. И снова про ботов в MAX. Мы уже научились отправлять сообщения через бота, работать с вложениями и прикреплять кнопки. Предположим, что с помощью deeplink мы собрали определенную базу пользователей и теперь хотим сделать по ним рассылку. Теперь перед нами стоит задача: Нам нужно создать массовую рассылку сообщений с приветственным текстом, картинкой и кнопкой с вшитой в нее ссылкой. Данный скрипт работает хорошо, но только в случае с отправкой одного сообщения. Можно запустить его в несколько потоков, и это даже будет работать. Но ровно до того момента, как вам нужно будет отправить сообщение с картинкой во вложении. Но об этом чуть позже. Теперь мы передаем списком пользователей и отправляем им сообщения. Судя по официальной документации, бот не может

Как-то странно получается, что канал системного администратора заполнен постами по программированию. Когда-нибудь я исправлюсь и начну писать о том, что уже давно знаю и умею. А пока что свежие задачи, свежие наработки, и снова скрипты.

И снова про ботов в MAX.

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

Предположим, что с помощью deeplink мы собрали определенную базу пользователей и теперь хотим сделать по ним рассылку.

Теперь перед нами стоит задача:

Нам нужно создать массовую рассылку сообщений с приветственным текстом, картинкой и кнопкой с вшитой в нее ссылкой.

-2

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

Но об этом чуть позже.

  • Для начала, переделаем скрипт в отдельную функцию:
-3

Теперь мы передаем списком пользователей и отправляем им сообщения.

  • Добавляем ограничение сообщений:

Судя по официальной документации, бот не может отправлять более 30 сообщений в секунду.

-4
  • Запускаем наш скрипт в таком режиме:
-5
  • Передадим в нашу функцию кнопки.

Сразу заложим функционал, что кнопка может быть не одна. Значит, в функцию мы должны принимать словарь. Также кнопка может быть двух типов: CallbackButton и LinkButton.

В принципе, URL можно довольно просто получить, проверяя в нем фрагмент http. Также можно не обрабатывать неправильные данные из словаря, т.к. и payload, и url априори должны быть строками.

-6
  • Проверяем:
-7
  • А теперь самое интересное: картинки.

В статье по отправке сообщений мы использовали метод InputMedia(). В него мы передаем полный путь до изображения, далее прикрепляем его к attachments.

Все здорово, но если мы напишем так:

-8

То увидим, как медленно будет идти наша рассылка.

Все из-за того, что функция InputMedia будет загружать нашу картинку раз за разом на сервера MAX при каждой попытке отправить сообщение.

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

Для этого будем использовать функцию библиотеки process_input_media.

-9

Как это работает:

  • После инициализации сессии бота (заметьте, мы перенесли ее выше) мы загружаем нашу картинку на сервера MAX.
  • В ответ от сервера мы получаем токен нашей картинки:
type=<UploadType.IMAGE: 'image'> payload=AttachmentPayload(token='yK0dsfg86Iu3Fg+7Va9yAV1hNpaC/pJ/Bnk0PGIb/mjCGiBIDzmafghjfghQPf8ooNjn4IwSNBCaHj0OPssdft+HqYBdR5d/QFJffZHGSpfEx29f26Q/XhhUwI95Ofghj/pR3htQ1mvDZLty3WA9IwI')
  • И в итоговое сообщение мы вставляем уже полученный токен.

Код из статьи выложил на своем github