Как отправить сообщение пользователю telegram bot python
Создаем Telegram бота
Отправка сообщений в произвольное время
Ваш телеграм бот может писать пользователю в произвольное время, если пользователь хоть раз с ним контактировал и вы запомнили id чата с ним.
В примере ниже после команды /spam бот будет отправлять пользователю сообщение каждые несколько секунд. Для этого используется многопоточность — в одном потоке осуществляется обновление сообщений с сервера телеграма, а во втором — отправка сообщений всем пользователям каждые несколько секунд.
import telebot import time from threading import Thread token = "ТОКЕН" bot = telebot.TeleBot(token=token) users = [] @bot.message_handler(commands=['start', 'help']) def start(message): user = message.chat.id bot.send_message(user, "https://www.youtube.com/watch?v=rdg4lkgsQ04") @bot.message_handler(commands=['spam']) def add_user(message): global user user = message.chat.id if user not in users: users.append(user) bot.send_message(user, "Берем сироп вишневый!") @bot.message_handler(commands=['stop']) def remove_user(message): user = message.chat.id users.remove(user) bot.send_message(user, "Все, все.") def spam(): global users while True: for user in users: bot.send_message(user, "Затем сироп вишневый!") time.sleep(2) def polling(): bot.polling(none_stop=True) polling_thread = Thread(target=polling) spam_thread = Thread(target=spam) polling_thread.start() spam_thread.start()
Форматирование и отправка сообщений в python-telegram-bot
Представленные здесь фрагменты кода форматирования/отправки сообщений в Telegram применяются как к автоматическому способу получения обновлений (при помощи telegram.ext ), так и к ручному (пользовательскому).
Внимание! Пакеты python-telegram-bot версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакете python-telegram-bot версии 20.x.
Если используется подмодуль telegram.ext , то можно получить chat_id в функции обратного вызова обработчика с помощью метода update.message.chat_id . Напоминаем, что в функцию обратного вызова обработчика автоматически передаются объекты update и context в качестве аргументов. Доступ к экземпляру bot можно получить из объекта context . Например, для отправки текстового сообщения: context.bot.send_message() .
Примечание. Как правило, можно отправлять сообщения пользователям, передавая их идентификатор пользователя в качестве chat_id . Если у бота есть чат с пользователем, то он отправит сообщение в этот чат.
Содержание:
- Варианты отправки сообщений в Telegram;
- Принимаемые аргументы методом bot.send_message() ;
- Форматирование Markdown V2;
- Форматирование HTML;
Варианты отправки сообщений в Telegram.
Отправка текстового сообщения в Telegram.
Доступ к экземпляру bot можно получить из объекта context . Например, для отправки текстового сообщения: context.bot.send_message() .
# для версии 13.x bot.send_message(chat_id=chat_id, text="Текст сообщения. ") # для версии 20.x await bot.send_message(chat_id=chat_id, text="Текст сообщения. ")
Примечание: метод .send_message (как и любой из методов .send_* класса telegram.Bot() ) возвращает экземпляр класса telegram.Message() , поэтому его можно использовать в коде позже.
Принимаемые аргументы методом bot.send_message() :
- chat_id : тип Int — идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername ).
- text : тип str — Текст отправляемого сообщения, 1-4096 символов после разбора сущностей.
- message_thread_id : тип Int — идентификатор целевой ветки сообщений (темы) форума; только для супергрупп форума.
- parse_mode : режим для синтаксического анализа объектов в тексте сообщения. может быть telegram.ParseMode.MARKDOWN_V2 или telegram.ParseMode.HTML Дополнительные сведения смотрите ниже.
- disable_web_page_preview : тип bool — отключает предварительный просмотр ссылок в этом сообщении.
- disable_notification : тип bool — отправляет сообщение беззвучно. Пользователи получат уведомление без звука.
- protect_content : тип bool — защищает содержимое отправленного сообщения от пересылки и сохранения.
- reply_to_message_id : тип int — если сообщение является ответом, то это идентификатор исходного сообщения (подставляется автоматически в методы update.message.reply_*() ).
- allow_sending_without_reply : тип bool — значение True , если сообщение должно быть отправлено, даже если указанное сообщение с ответом reply_to_message_id не найдено.
Ответ на полученное сообщение о время обновления.
# для версии 13.x update.message.reply_text("Текст ответа на сообщение.") # для версии 20.x await update.message.reply_text("Текст ответа на сообщение.")
Примечание: метод update.message.reply_text() представляет собой ссылку на метод context.bot.send_message() с теми же значениями по умолчанию и уже переданным chat_id .
Существуют эквиваленты этого метода для ответа на сообщение фотографиями, звуком и т. д., и подобные ссылки существуют во всей библиотеке python-telegram-bot .
Отправка действия в чат.
Чтобы сообщить пользователю, что что-то происходит на стороне бота (например, пишется сообщение) — используйте следующий код:
# для версии 13.x bot.send_chat_action(chat_id=chat_id, action=telegram.constants.ChatAction.TYPING) # для версии 20.x await bot.send_chat_action(chat_id=chat_id, action=telegram.constants.ChatAction.TYPING)
В качестве альтернативы, если есть несколько команд и хочется повторять приведенный выше фрагмент кода во всех командах, то смотрите раздел «Использование декораторов в python-telegram-bot «. Там же найдете описание класса constants.ChatAction .
Форматирование сообщения (жирный, курсив, и т.д.).
Telegram поддерживает некоторые параметры форматирования текста. Все подробности о том, что поддерживается, можно найти в официальной документации. Имейте в виду, что придется экранировать специальные символы, как описано в документации. Библиотека python-telegram-bot также предлагает вспомогательную функцию для экранирования текста Markdown . Для экранирования текста HTML можно использовать html.escape из стандартной библиотеки.
Можно форматировать текст с помощью любого метода/типа API, имеющего аргумент parse_mode . В дополнение к редактированию текста, необходимо передавать один из режимов разбора, доступных в классе telegram.ParseMode , в аргумент parse_mode . Начиная с версии 5.0 Bot API (версия пакета 13.1), также можно передать список telegram.MessageEntities в параметр entity .
Примечание. В обновлении API 4.5 Telegram представил Markdown v2, который поддерживает вложенные объекты и требует другого экранирования, чем Markdown v1. В официальной документации API Markdown v1 упоминается как устаревший режим, следовательно следует предпочесть Markdown v2. Для удобства, не забывайте также использовать метод message.reply_markdown_v2() вместо message.reply_markdown() и т. д.
Отправка текстового сообщения с форматированием MarkdownV2.
В настоящее время поддерживается следующая MarkdownV2 разметка:
*bold \*text* _italic \*text_ __underline__ ~strikethrough~ ||spoiler|| # использование вложенности разметки MarkdownV2 *bold _italic bold ~italic bold strikethrough ||italic bold strikethrough spoiler||~ __underline italic bold___ bold* [inline URL](http://www.example.com/) [inline mention of a user](tg://user?id=123456789)  `inline fixed-width code` ''' pre-formatted fixed-width code block ''' '''python pre-formatted fixed-width code block written in the Python programming language '''
Обратите внимание:
- Любой символ с кодом от 1 до 126 включительно может быть экранирован в любом месте с предшествующим символом ‘\’ , и в этом случае он обрабатывается как обычный символ, а не как часть разметки. Это подразумевает, что символ ‘\’ обычно должен экранироваться предшествующим символом ‘\’ .
- Внутри объектов pre и code все символы «‘ и «\» должны экранироваться предшествующим символом «\» .
- Внутри (. ) части встроенной ссылки и пользовательского определения эмодзи, все ‘)’ и ‘\’ должны быть экранированы предшествующим символом ‘\’ .
- Во всех остальных местах символы: ‘_’ , ‘*’ , ‘[‘ , ‘]’ , ‘(‘ , ‘)’ , ‘~’ , «‘ , ‘>’ , ‘#’ , ‘+’ , ‘-‘ , ‘=’ , ‘|’ , » , ‘.’ , ‘!’ должно быть экранировано предыдущим символом ‘\’ .
- В случае неоднозначности между курсивом и подчеркиванием объектов, сочетание __ всегда жадно обрабатывается слева направо как начало или конец объекта подчеркивания, поэтому вместо ___italic underline___ используйте ___italic underline_\r__ , где \r — символ с кодом 13, который будет проигнорировано.
- В качестве альтернативного значения для пользовательского смайлика должен быть указан допустимый смайлик. Эмодзи будут отображаться вместо пользовательских эмодзи в местах, где пользовательские эмодзи не могут быть отображены (например, в системных уведомлениях) или если сообщение пересылается пользователем, не являющимся премиум-пользователем. Рекомендуется использовать эмодзи из поля эмодзи пользовательского стикера с эмодзи.
Пример сообщения с форматированием Markdown:
# для версии 13.x bot.send_message(chat_id=chat_id, text="*bold* _italic_ `fixed width font` [link](http://google.com)\.", parse_mode=telegram.ParseMode.MARKDOWN_V2) # для версии 20.x await bot.send_message(chat_id=chat_id, text="*bold* _italic_ `fixed width font` [link](http://google.com)\.", parse_mode=telegram.ParseMode.MARKDOWN_V2)
Пример ответа на сообщение с форматированием Markdown:
# для версии 13.x update.message.reply_markdown_v2(text="*bold* _italic_ `fixed " "width font` [link](http://google.com)\.") # для версии 20.x await update.message.reply_markdown_v2(text="*bold* _italic_ `fixed " "width font` [link](http://google.com)\.")
Отправка текстового сообщения с форматированием HTML.
В настоящее время поддерживаются следующие HTML теги:
b>жирныйb>, strong>жирныйstrong> i>курсивi>, em>курсивem> u>подчеркиваниеu>, ins>подчеркиваниеins> s>зачеркнутоs>, strike>зачеркнутоstrike>, del>зачеркнутоdel> span class="tg-spoiler">скрытый текстspan>, tg-spoiler>скрытый текстtg-spoiler> b> bold i>italic bold s>italic bold strikethrough span class="tg-spoiler">italic bold strikethrough spoilerspan>s> u>underline italic boldu>i> bold b> a href="http://www.example.com/">встроенный URL-адресa> a href="tg://user?id=123456789">встроенное упоминание пользователяa> tg-emoji emoji-id="5368324170671202286">tg-emoji> code>встроенный код фиксированной шириныcode> pre>предварительно отформатированный блок кода фиксированной шириныpre> pre> code class="language-python"> предварительно отформатированный блок кода фиксированной ширины, написанный на языке программирования Python code> pre>Обратите внимание:
- Все символы < , >и & , которые не являются частью тега или HTML-объекта, должны быть заменены соответствующими HTML-объектами ( < , > и & соответственно).
- Поддерживаются все числовые HTML-объекты.
- В настоящее время API поддерживает только следующие именованные HTML-объекты: < , > , & и " .
- Используйте вложенные теги и , чтобы определить язык программирования для объекта .
- Язык программирования не может быть указан для автономных тегов кода.
- В качестве содержимого тега должен использоваться допустимый смайлик. Эмодзи будут отображаться вместо пользовательских эмодзи в местах, где пользовательские эмодзи не могут быть отображены (например, в системных уведомлениях) или если сообщение пересылается пользователем, не являющимся премиум-пользователем. Рекомендуется использовать эмодзи из поля эмодзи пользовательского стикера с эмодзи.
Пример сообщения с форматированием HTML:
# для версии 13.x bot.send_message(chat_id=chat_id, text='bold italic link.', parse_mode=telegram.ParseMode.HTML) # для версии 20.x await bot.send_message(chat_id=chat_id, text='bold italic link.', parse_mode=telegram.ParseMode.HTML)
Пример ответа на сообщение с форматированием HTML:
# для версии 13.x update.message.reply_html(text='bold italic ' 'link.'") # для версии 20.x await update.message.reply_html(text='bold italic ' 'link.'")
Обработка сущностей в сообщении (хэштеги, URL-адреса и т.д.).
Чтобы обрабатывать сущности в сообщениях, необходимо использовать класс telegram.MessageEntity . Для этого нужно извлечь сущности и соответствующий им текст из объекта telegram.Message с помощью telegram.Messag.parse_entities .
Объект telegram.MessageEntity представляет собой специальную сущность в текстовом сообщении. Например, хэштеги, имена пользователей, URL-адреса и т.д.
Messag.parse_entities(types=None) :
Метод Messag.parse_entities() возвращает dict , который сопоставляет telegram.MessageEntity со строкой. Он содержит сущности из этого сообщения, отфильтрованные по их атрибуту telegram.MessageEntity.type в качестве ключа, и текст, которому принадлежит каждая сущность, в качестве значения dict .
Обратите внимание, что этот метод всегда следует использовать вместо атрибута entities , поскольку он вычисляет правильную подстроку из текста сообщения на основе кодовых точек UTF-16.
Аргумент types ( List[str] , необязательный) — список типов telegram.MessageEntity в виде строк. Если атрибут type объекта содержится в этом списке, то он будет возвращен. По умолчанию — это список всех типов.
Рассмотрим пример, который проверяет наличие URL-адресов в сообщении и печатает их на экране.
# Словарь, который отображает сущность в текст entities = message.parse_entities() for ent in entities: txt = entities[ent] if ent.type == ent.TEXT_LINK: # Текст со встроенным URL print(f"txt> - ent.url>") elif ent.type == ent.URL: # Обычный URL print(txt)
Для таких вещей, как извлечение только ссылок из сообщений Telegram, лучше использовать стороннее расширение ptbcontrib.extract_urls .
Предоставляет два метода, позволяющих легко извлекать гиперссылки из сообщений.
- как простые ссылки, так и объекты сообщений,
- как обычные сообщения, так и подписи,
- извлечение исключительно прямых ссылок на сообщения Telegram.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Переход на асинхронный python-telegram-bot версии 20.x
- Чистый интерфейс Python для Telegram Bot API
- Команды и оповещения @BotFather в Telegram
- Обработка сообщений модулем python-telegram-bot
- Фильтры сообщений модуля python-telegram-bot
- Хранение временных данных модулем python-telegram-bot
- Настройки по умолчанию модуля python-telegram-bot
- Планировщик сообщений модуля python-telegram-bot
- Форматирование и отправка сообщений в python-telegram-bot
- Работа с файлами/media, модуль python-telegram-bot
- Меню из кнопок, модуль python-telegram-bot
- Объект CallbackContext модуля python-telegram-bot
- Подключения Telegram-бота через webhook
- Обработка исключений модуля python-telegram-bot
- Создание Inline-бота, модуль python-telegram-bot
- Работа с опросами в модуле python-telegram-bot
- Создание разговоров ConversationHandler в python-telegram-bot
- Перезапуск телеграмм-бота в случае ошибки
- Декоратор-обработчик сообщений в python-telegram-bot
- Авторизация на сайте через Telegram Passport
- Ведение публикаций в Telegram-канале с python-telegram-bot
- UTF коды emoji/эмодзи для отправки в Telegram из Python
Отправка сообщений пользователям с бота в 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 от телеграмма
Отправка сообщений в Telegram при помощи Python
Представьте, что вы запустили какую-то программу, на выполнение которой требуется некоторое время, и хотите вздремнуть или что-то в этом роде. Вам нужен простой скрипт, который отправит вам сообщение, когда ваша программа закончит работу.
Реализовать функцию отправки сообщения в Telegram при помощи Python довольно просто. План действий:
- Создать Telegram-бота с помощью BotFather от Telegram
- Получить идентификатор чата
- Послать сообщение Telegram с помощью Python
Создание Telegram-бота
- Откройте приложение Telegram и найдите BotFather. Это встроенный бот Telegram, который помогает создавать пользовательские боты.
- Введите /newbot , чтобы создать нового бота.
- Дайте своему боту имя и уникальный username
- Скопируйте токен вашего нового бота Telegram

Примечание: не загружайте свой токен в интернет, так как любой пользователь с вашим токеном имеет полный контроль над вашим Telegram-ботом.
Получение идентификатора чата
В Telegram каждый чат имеет ID. Нам он нужен, чтобы отправлять в наш чат сообщения.
Отправьте своему Telegram-боту любое сообщение. После этого запустите скрипт Python, чтобы найти ID вашего чата:
import requests TOKEN = "Сюда вставьте свой токен" url = f"https://api.telegram.org/bot/getUpdates" print(requests.get(url).json())
Примечание редакции Pythonist: если у вас не установлена библиотека requests , нужно сперва ее установить:
$ python -m pip install requests
Этот скрипт вызывает функцию getUpdates , которая как бы проверяет наличие новых сообщений. Мы можем найти ID нашего чата из возвращаемого JSON (на иллюстрации выделен красным цветом).

Примечание: если вы не отправите сообщение своему Telegram-боту, результаты могут быть пустыми.
Найдя идентификатор чата, скопируйте его.
Отправка сообщения Telegram с помощью Python
Скопируйте и вставьте в следующий скрипт Python токен вашего Telegram-бота и ID чата из предыдущих двух шагов. Также напишите собственное сообщение.
import requests TOKEN = "Сюда вставьте свой токен" chat_id = "Сюда вставьте ID чата" message = "Здесь напишите свое сообщение" url = f"https://api.telegram.org/bot/sendMessage?chat_id=&text=" print(requests.get(url).json()) # Эта строка отсылает сообщение
Запустите скрипт и проверьте свой Telegram!