Отправка сообщений пользователям с бота в Telegram
Если вы читаете данную статью, значит, скорей за все имеете свой бот в телеграмме. Соответственно расписывать и объяснять как создать бота я здесь не буду. (Возможно в будущем создам отдельную статью по этому поводу, но какой в этом смысл, ведь в гугле их пруд пруди).
Надеюсь вы используете библиотеку 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 от телеграмма