Как изменить сообщение в Телеграмм боте

Для работы с Bot API есть четыре популярные Python-библиотеки:

Поработаем с python-telegram-bot. Это популярная библиотека с удобным интерфейсом: методы классов совпадают с названиями методов Bot API.

В python-telegram-bot все методы Bot API вызываются как методы различных классов библиотеки.

Библиотека разделена на три пакета:

  • telegram — основной пакет, содержит все методы Bot API, перенесённые на Python.
  • telegram.ext — вспомогательный пакет, он содержит методы-обёртки для стандартных методов Bot API, позволяет упростить код и убирает рутинные операции «под капот», примерно так же, как это происходит во фреймворках.
  • telegram.utils — пакет для продвинутой работы с библиотекой, позволяет переопределять и расширять библиотеку.

Пакеты python-telegram-bot импортируются в код под именем telegram (это неожиданно, но это так):

import telegram # Здесь будет код Телеграм-бота
PYTHONimport telegram.ext # Здесь будет код Телеграм-бота

Bot API vs PEP8

В официальной документации Bot API все методы описаны в camelCase, но это не питонично, поэтому разработчики библиотеки python-telegram-bot продублировали названия методов в snake_case.

Вёрстка сообщений в Telegram-боте на Python

Это значит, что метод sendMessage может быть вызван двумя способами:

  • telegram.Bot.sendMessage ,
  • telegram.Bot.send_message .

Результат будет одинаков, но лучше соблюдать PEP8 и писать в стиле snake_case.

Библиотека

Для стандартных задач в библиотеке python-telegram-bot есть готовые решения:

  • отправка/получение сообщений;
  • обработка «команд» — сообщений со слешем, вроде /start или /help ;
  • создание кнопок;
  • запись в базу (долговременное хранение сообщений).

Решение всех этих задач реализовано на классах.

Создайте новый проект в директории /tg_bot, установите виртуальное окружение и библиотеку python-telegram-bot.

mkdir tg_bot # Создаём директорию cd tg_bot # Переходим в эту директорию python3 -m venv venv # Создаём виртуальное окружение . venv/bin/activate # Активируем виртуальное окружение # Для Windows команда source venv/Scripts/activate pip3 install python-telegram-bot # Устанавливаем библиотеку

Класс Bot()

Этот класс реализует методы API, связанные с отправкой, редактированием, пересылкой или удалением сообщений и прочими активными действиями бота, не связанными с получением и обработкой входящих сообщений. Полная информация о классе Bot() есть в документации.

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

В начале работы создаётся экземпляр класса Bot() и в него передаётся токен. После этого можно вызывать методы класса:

from telegram import Bot bot = Bot(token=») # Отправка сообщения chat_id = 123456 text = ‘Вам телеграмма!’ bot.send_message(chat_id, text)

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

Как создать меню в боте?

  • подставьте в код chat_id своего аккаунта,
  • подставьте в код свой токен,
  • отправьте сообщение.

Класс Updater()

Этот класс предназначен для получения и обработки входящих сообщений.

При создании объекта класса Updater в него передаётся токен, точно так же, как и в Bot :

from telegram.ext import Updater updater = Updater(token=»)

Экземпляры классов Bot и Updater принимают на вход токен Телеграм-бота и могут делать запросы от имени его аккаунта. Фактически экземпляры классов Bot и Updater — это экземпляры бота.

Обработка входящих сообщений

Сообщения в Telegram делятся на типы: есть простые текстовые сообщения, есть сообщения-картинки, сообщения-стикеры, сообщения-файлы. Каждый тип можно обрабатывать по-разному: например, текстовые сообщения можно парсить и отвечать на них текстовым сообщением, полученные картинки и файлы сохранять или пересылать, а на стикеры отвечать стикерами.

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

Handler — общеупотребимый в программировании термин, он как раз и означает «обработчик».

У объекта Updater есть атрибут dispatcher («диспетчер» или «распределитель»). Именно он распределяет сообщения, которые приходят от пользователей, по разным обработчикам.

Для обработки сообщений:

  1. Посредством диспетчера регистрируется класс-обработчик (для примера выбран обработчик MessageHandler ): updater.dispatcher.add_handler(MessageHandler(. )) .
  2. В обработчик передаются два параметра: updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi))
    • Filters.text — фильтр, выбирающий из обновлений сообщения определённого типа (в приведённом примере будут выбраны только текстовые сообщения).
    • say_hi() — функция, которая будет обрабатывать выбранные сообщения.В функцию передаются два аргумента:
    • update — это обновление, которое пришло с сервера. В этом объекте есть само сообщение, информация о чате и много других полезных данных.
    • context — в этом объекте хранится информация о боте, а также другая опциональная информация.Эти аргументы передаются неявно: в коде обработчика описывать эти аргументы не нужно, но вызываемая функция должна ожидать их: say_hi(update, context) .
    • С помощью этой функции мы будем отвечать в чат текстом «Привет, я бот». При отправке обязательно нужно указать идентификатор чата chat_id . Его можно получить из объекта update и сохранить, например, в переменную chat .

    from telegram.ext import Updater, Filters, MessageHandler updater = Updater(token=») def say_hi(update, context): # Получаем информацию о чате и сохраняем в переменную chat chat = update.effective_chat # В ответ на любое текстовое сообщение будет отправлен ответ ‘Привет, я бот’ context.bot.send_message(chat_id=chat.id, text=’Привет, я бот’) # Регистрируется обработчик MessageHandler; # из всех полученных сообщений он будет выбирать только текстовые сообщения # и передавать их в функцию say_hi() updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi)) # Метод start_polling() запускает процесс polling, # приложение начнёт отправлять регулярные запросы для получения обновлений. updater.start_polling()

    Еще по теме:  Епе отправить од взода на номер втелегра

    Метод start_polling отправляет регулярные запросы к серверу Telegram и проверяет обновления. По умолчанию запросы отправляются каждые 10 секунд. Периодичность опроса можно изменить, передав методу именованный параметр poll_interval и указав нужный интервал запросов (в секундах, float ):

    updater.start_polling(poll_interval=20.0)

    Прервать выполнение программы можно комбинацией клавиш Ctrl + C .

    Класс Filters()

    Класс Filters() может отфильтровывать сообщения по типу:

    • Filters.text ,
    • Filters.photo ,
    • Filters.video .
    • можно фильтровать по ID или имени отправителя, по типу чата (личный чат или канал) или по множеству других признаков.

    Если требуется обработать все сообщения — применяют Filters.all . Документация по фильтрам.

    Обработчики в python-telegram-bot

    В библиотеке python-telegram-bot есть множество готовых обработчиков для разных задач.

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

    Приведённый в примере обработчик MessageHandler фильтрует полученные сообщения (выбирает только текстовые), сохраняет их в объект Update — и они обрабатываются в функции say_hi() .

    . updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi)) .

    Чтобы посмотреть, в каком виде полученные сообщения хранятся в объекте Update :

    • отправьте своему боту несколько сообщений;
    • измените код функции say_hi() так, чтобы она вывела на печать объект Update , полученный в первом аргументе;
    • запустите этот код в редакторе.

    MessageHandler — один из самых популярных и универсальных обработчиков в библиотеке, ведь чаще всего работа идёт именно с сообщениями.Обработчик CommandHandler более специализирован: он предназначен для обработки команд — сообщений, начинающихся со слеша / . Самые распространённые команды — /start , /help : скорее всего, вы их уже использовали при общении с ботами.

    CommandHandler выбирает из обновлений сообщения с командами, сохраняет их в объект Update и обрабатывает эти сообщения в функции, указанной вторым аргументом в обработчике.

    from telegram.ext import Updater, CommandHandler updater = Updater(token=») def wake_up(update, context): # В ответ на команду будет отправлено сообщение ‘Спасибо, что включили меня’ chat = update.effective_chat context.bot.send_message(chat_id=chat.id, text=’Спасибо, что включили меня’) # Регистрируется обработчик CommandHandler; # он будет отфильтровывать только сообщения с содержимым ‘/start’ # и передавать их в функцию wake_up() updater.dispatcher.add_handler(CommandHandler(‘start’, wake_up)) updater.start_polling()

    Обработать команды можно и через универсальный MessageHandler, отфильтровав сообщения через Filters , но CommandHandler упростит эту задачу.

    Похожие записи:

    1. Бот в Telegram
    2. Библиотека python-telegram-bot. Пример
    3. Client API в Telegram
    4. Django — доработка шаблона формы регистрации

    Источник: mob25.com

    Сообщения Aiogram

    В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.

    Текст

    Обработка текстовых сообщений — это, пожалуй, одно из важнейших действий у большинства ботов. Текстом можно выразить практически что угодно и при этом подавать информацию хочется красиво. В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. Наиболее продвинутыми из них считаются HTML и MarkdownV2, «классический» Markdown поддерживает меньше возможностей и более не используется в aiogram.

    Прежде, чем мы рассмотрим способы работы с текстом в aiogram, необходимо упомянуть важное отличие aiogram 3.x от 2.x: в «двойке» по умолчанию обрабатывались только текстовые сообщения, а в «тройке» — любого типа. Если точнее, вот как теперь надо принимать исключительно текстовые сообщения:

    Форматированный вывод

    За выбор форматирования при отправке сообщений отвечает аргумент parse_mode , например:

    Hello world с разным форматированием

    Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент parse_mode довольно накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект Bot, а если в каком-то конкретном случае нужно обойтись без этих ваших разметок, то просто укажите parse_mode=None :

    bot = Bot(token=»123:abcxyz», parse_mode=»HTML») # где-то в функции. await message.answer(«Сообщение с HTML-разметкой») await message.answer(«Сообщение без какой-либо разметки», parse_mode=None)

    Настройка типа разметки по умолчанию

    Нередко бывают ситуации, когда окончательный текст сообщения бота заранее неизвестен и формируется исходя из каких-то внешних данных: имя пользователя, его ввод и т.д. Напишем хэндлер на команду /name , который будет отвечать пользователю текстом, указанным после команды, например, /name Иван Иванов :

    Почему мы не воспользовались просто message.text ? В противном случае бот бы ответил: “Привет, /name Иван Иванов”, а нам нужен только текст после команды. Если вы используете встроенный фильтр Command (или его алиас commands, как в примере выше), то можно добавить в хэндлер аргумент command с типом CommandObject , и достать оттуда текст после команды, который aiogram уже распарсил за вас. Если после команды ничего не указано, то command.args будет иметь значение None .

    Работа команды /name

    И, вроде бы, всё хорошо, но тут приходит хитрый юзер и пишет /name . В этом случае бот не ответит, а в консоли появится ошибка:
    aiogram.exceptions.TelegramBadRequest: Bad Request: can’t parse entities: Unsupported start tag «славик777» at byte offset 17

    Что же делать? К счастью, проблема решается просто: экранированием. Для этого в модуле html (в markdown аналогично) есть метод quote() для экранирования, а также различные методы для форматирования: bold() , italic() , link() и т.д.
    Исправим код, чтобы всё заработало:

    # новый импорт! from aiogram import html # В функции cmd_name await message.answer(f»Привет, «, parse_mode=»HTML»)

    Работа команды /name

    Сохранение форматирования

    Представим, что бот должен получить форматированный текст от пользователя и добавить туда что-то своё, например, отметку времени. Напишем простой код:

    Добавленный текст (неудачная попытка)

    Мда, что-то пошло не так, почему сбилось форматирование исходного сообщения? Это происходит из-за того, что message.text возвращает просто текст, без каких-либо оформлений. Чтобы получить текст в нужном форматировании, воспользуемся альтернативными свойствами: message.html_text или message.md_text . Сейчас нам нужен первый вариант. Заменяем в примере выше message.text на message.html_text и получаем корректный результат:

    Еще по теме:  Где отображаются скачанные видео из Телеграмм в телефоне

    Добавленный текст (успех)

    Работа с entities

    Telegram, на самом деле, очень много обработки делает вместо пользователя, сильно упрощая жизнь. Например, некоторые сущности, типа e-mail, номера телефона, юзернейма и др. можно не доставать регулярными выражениями, а извлечь напрямую из объекта Message и поля entities , содержащего массив объектов типа MessageEntity. В качестве примера напишем хэндлер, который извлекает ссылку, e-mail и моноширинный текст из сообщения (по одной штуке).
    Здесь кроется важный подвох. Telegram возвращает не сами значения, а их начало в тексте и длину. Более того, текст считается в символах UTF-8, а entities работают с UTF-16, из-за этого, если просто взять позицию и длину, то при наличии UTF-16 символов (например, эмодзи) ваш обработанный текст просто съедет.

    Лучше всего это демонстрирует пример ниже. На скриншоте первый ответ бота есть результат парсинга «в лоб», а второй — результат применения аиограмного метода extract() над entity. На вход ему передаётся весь исходный текст:

    Парсинг entities

    Медиафайлы

    Помимо обычных текстовых сообщений Telegram позволяет обмениваться медиафайлами различных типов: фото, видео, гифки, геолокации, стикеры и т.д. У большинства медиафайлов есть свойства file_id и file_unique_id . Первый можно использовать для повторной отправки одного и того же файла много раз, причём отправка будет мгновенной, т.к. сам файл уже лежит на серверах Telegram. Это самый предпочтительный способ.
    К примеру, следующий код заставит бота моментально ответить пользователю той же гифкой, что была прислана:

    В отличие от file_id , идентификатор file_unique_id нельзя использовать для повторной отправки или скачивания медиафайла, но зато он одинаковый у всех ботов для конкретного медиа. Нужен file_unique_id обычно тогда, когда нескольким ботам требуется знать, что их собственные file_id односятся к одному и тому же файлу.

    Помимо переиспользования для отправки, бот может скачать медиа к себе на компьютер/сервер. Для этого у объекта типа Bot есть метод download() . В примерах ниже файлы скачиваются сразу в файловую систему, но никто не мешает вместо этого сохранить в объект BytesIO в памяти, чтобы передать в какое-то приложение дальше (например, pillow).

    В случае с изображениями мы использовали не message.photo , а message.photo[-1] , почему? Фотографии в Telegram в сообщении приходят сразу в нескольких экземплярах; это одно и то же изображение с разным размером. Соответственно, если мы берём последний элемент (индекс -1), то работаем с максимально доступным размером фото.

    Сервисные (служебные) сообщения

    Сообщения в Telegram делятся на текстовые, медиафайлы и служебные (они же — сервисные). Настало время поговорить о последних.

    Сервисные сообщения

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

    Не будем сильно углубляться в детали и рассмотрим один конкретный пример: отправка приветственного сообщения вошедшему участнику. У такого служебного сообщения будет content_type равный “new_chat_members”, но вообще это объект Message, у которого заполнено одноимённое поле.

    Добавлены несколько юзеров

    Важно помнить, что message.new_chat_members является списком, потому что один пользователь может добавить сразу нескольких участников. Также не надо путать поля message.from_user и message.new_chat_members . Первое — это субъект, т.е. тот, кто совершил действие. Второе — это объекты действия. Т.е. если вы видите сообщение вида «Анна добавила Бориса и Виктора», то message.from_user — это информация об Анне, а список message.new_chat_members содержит информацию о Борисе с Виктором.

    Бонус: прячем ссылку в тексте

    Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того, когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может отправиться не с тем превью, которое хочется увидеть.
    Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что можно поместить ссылку в пробел нулевой ширины и вставить всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет, а сервер Telegram всё видит и честно добавляет предпросмотр.
    Разработчики aiogram для этого даже сделали специальный вспомогательный метод hide_link() :

    Источник: aiogram.ru

    Как изменить сообщение в телеграмм боте

    Какую информацию о нас хранят телеграм‑боты, чем они опасны и как удалить их из аккаунта? Отвечаем вместе с экспертами

    15 августа 2023, 17:41

    Иллюстрация: Мария Толстова / Медиазона

    Какие данные хранят о пользователях телеграм-боты? Как правильно удалить их из своего аккаунта? Как отличить настоящий бот от фейкового? «Медиазона» отвечает на эти вопросы вместе с разработчиком партизанского телеграма и одним из участников объединения «Киберпартизаны».

    Что такое телеграм-бот?

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

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

    Еще по теме:  Как с компьютера копировать на Телеграмм телефона

    Ниже мы расскажем про классические боты.

    Какую информацию собирают телеграм-боты?

    По словам экспертов, после нажатия кнопки Start любой бот может получить доступ к ID пользователя, его имени и фамилии, никнейму, разделу «о себе» и языку, установленному в приложении. Бот автоматически получит доступ к фото профиля, если в настройках конфиденциальности юзер не скрыл его ото всех. Бот не имеет автоматического доступа к номеру телефона пользователя, но может его запросить. Если пользователь разрешит отправку, бот получит доступ к номеру.

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

    — Любые сообщения, отправленные в бот, могут быть им сохранены. Даже если пользователь их удалит. Пользователь не может узнать, как бот распоряжается полученной информацией. То есть бот может как удалять полученные сообщения сразу после прочтения, так и хранить их, — объясняют эксперты.

    Что такое ID в телеграме?

    ID — это набор цифр, по сути номер вашего аккаунта. Изменить его невозможно, даже если пользователь сменит аватарку, имя или никнейм. Опасность в том, что если пользователь оставлял комментарии, потом их удалил и поменял имя и фото в аккаунте, его ID остается тем же, а значит человека можно вычислить.

    Если вы хотите поменять ID — удалите старый аккаунт и зарегистрируйте новый.

    Как мне отличить фейковый бот от настоящего?

    — В партизанском телеграме правильный бот помечен галочкой верификации. А фейковые боты мы стараемся помечать значками фейка.

    Очень важно перепроверять ссылки на боты. Даже если они были присланы человеком, которому вы доверяете.

    Если я перешел по ссылке фейкового бота, значит меня уже сдеанонили?

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

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

    Есть специальные боты силовиков, которые могут вытянуть больше информации?

    Боты не могут вытянуть больше той информации, о которой мы писали выше. То, что существуют боты, которые автоматически получают доступ к геолокации человека или к его личным перепискам — миф. При этом существуют и другие методы сбора информации о пользователе.

    1. Силовики могут автоматически собирать информацию из комментариев в каналах и открытых чатах. Для этого существуют специальные «скринеры», которые отслеживают активность пользователя или чата в целом. Собирая такую базу, они могут сопоставлять ID, «утекшие» через фейковые боты, с комментаторами, а также проверять этот уникальный номер в телеграме при задержании.

    2. Силовики при задержании могут войти в аккаунт человека через свое устройство. Тогда они получат доступ ко всему профилю, в том числе к вашему архиву, в котором могут храниться сообщения из закрытых чатов, из которых вы уже вышли.

    Что делать, если я уже запускал телеграм-боты?

    Специалисты по кибербезопасности говорят, что удалить информацию из ботов, если вы с ними контактировали, у вас уже не получится. Можно считать, что она остается там навсегда, как и любая информация, которую мы оставляем в интернете.

    Есть два варианта того, как можно себя обезопасить.

    Можно полностью уничтожить старый «засвеченный» телеграм-аккаунт, создать новый и пользоваться им. Эксперты рекомендуют создать как минимум два аккаунта: один чистый (чтобы его можно было показать по принуждению и не волноваться) и один «партизанский» (его использовать для непубличных дел, переписок и подписок).

    Второй вариант — почистить «хвосты» своего аккаунта, хотя информация об аккаунте в боте все равно сохранится. Тем не менее, инструкция ниже поможет стереть боты, которые вы запускали, из истории поиска и ваших переписок.

    Как почистить «хвосты» самостоятельно?

    Боты, которыми вы когда-то пользовались, всегда указываются в поиске телеграма (окно вверху приложения). И если ввести в поисковую строку слово bot, то вы увидите всех ботов, которым когда-либо писали. Даже если вы заблокировали бот, то его можно найти по пути «Настройки > Конфиденциальность и безопасность > Заблокированные пользователи». Их же увидят и силовики в случае задержания.

    Чтобы удалить всех ботов, сделайте следующее:

    • Разблокируйте в черном списке всех ботов.
    • Введите слово bot в строке поиска телеграм.
    • Выберите бот, который нужно удалить. Нажмите три вертикальные точки и выберите «Очистить историю».
    • Снова введите слово bot в строке поиска. Нажмите на тот же самый бот и выберите «Удалить чат».

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

    Специалисты по кибербезопасности говорят, что этот вариант — полумера, и никаких гарантий он не дает. Причем на разных устройствах (Windows, macOS, Android и iOS) он работает по-разному. Лучше всего проделывать все эти манипуляции из Web-версии мессенджера или приложения на ПК.

    Источник: iceberg-wakening-334013.appspot.com

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...