Отправка сообщений пользователям с бота в Telegram

Woman and phone

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

Надеюсь вы используете библиотеку python-telegram-bot. Если это не так, увы, эта статья не для вас…хотя…вы попробуйте, возможно у вас тоже будет работать данный пример (либо сделаете по аналогии).

Для отправки сообщений создадим новую функцию и назовем её send_message, передадим параметры bot и job.

Далее нам нужно получить chat_id пользователей. (Надеюсь вы подключили к своему боту базу данных, либо записываете в файл chat_id от всех пользователей которые когда-либо пользовались вашим ботом). После чего используя метод sendMessage указываем параметры chat_id пользователя и отправляемый текст text.

В итоге у нас должно получиться:

from telegram.ext import Updater, messagequeue as mq

@mq.queuedmessage
def send_message(bot, job):
        for user in get_subscribed(db):
            text = 'Это тестовое сообщение'
            bot.sendMessage(chat_id=user['chat_id'], text=text)

И так, что же мы здесь написали, давайте разберемся:

@mq.queuedmessage — Указываем, что сообщения будут отправлены не сразу все, а в порядке очереди, так как телеграмм ограничивает отправку сообщений в секунду. Если не ошибаюсь, не больше 30 сообщений в секунду. for user in get_subscribed(db) Получаем список пользователей с базы данных, get_subscribed и прохожусь по каждому пользователю циклом вытягивая его chat_id

Пол дела сделано, осталось отправить сообщение. Для этого переходим в главную функцию main() (или как она у вас там называется)

mybot = Updater(settings.API_KEY) # Указываем токен бота
mybot.bot._msg_queue = mq.MessageQueue() # Указываем, что будем работать с декораторам очереди
mybot.bot._is_messages_queued_default = True # Включаем декоратор очереди

mybot.job_queue.run_repeating(send_message, interval=60) # Ставим задачу отправлять сообщение каждые 60 секунд. Бот будет делать это пока вы не уберете эту строку с кода.

Что бы один раз отправить сообщение я обычно делаю следующее — ставлю интервал в 10 минут, жду пока сообщения отправляться, останавливаю бота и комментирую эту строку, затем снова запускаю бота. Можно конечно сделать это через Условие, на подобии:

send = True
If send:
   mybot.job_queue.run_repeating(send_message, interval=60) 
   send = False

Но, кому как удобно.

Описание всех методов есть в API от телеграмма

comments powered by Disqus