Как отправить сообщение пользователю telegram bot python
Перейти к содержимому

Как отправить сообщение пользователю telegram bot python

  • автор:

Как отправить сообщение пользователю 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) ![��](tg://emoji?id=5368324170671202286) `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

    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 от телеграмма

    Отправка сообщений в Telegram при помощи Python

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

    Реализовать функцию отправки сообщения в Telegram при помощи Python довольно просто. План действий:

    1. Создать Telegram-бота с помощью BotFather от Telegram
    2. Получить идентификатор чата
    3. Послать сообщение Telegram с помощью Python

    Создание Telegram-бота

    1. Откройте приложение Telegram и найдите BotFather. Это встроенный бот Telegram, который помогает создавать пользовательские боты.
    2. Введите /newbot , чтобы создать нового бота.
    3. Дайте своему боту имя и уникальный username
    4. Скопируйте токен вашего нового бота 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!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *