Довольно часто происходят ситуации, когда доступ к серверу нужен здесь и сейчас. Однако, не всегда подключение по SSH является наиболее удобным способом, потому что под рукой может не оказаться SSH клиента, адреса сервера или связки «пользователь/пароль». Конечно, есть Webmin , который упрощает администрирование, но он также не даёт моментальный доступ.
Поэтому я решил реализовать простое, но любопытное решение. А именно — написать Telegram-бота, который, запускаясь на самом сервере, будет выполнять присылаемые ему команды и возвращать результат. Изучив несколько статей на эту тему, я понял, что подобных реализаций ещё никто не описывал.
Объекты и сущности telegram. Модуль aiogram.types
Модуль aiogram.types обеспечивает более удобное и понятное взаимодействие с различными объектами и сущностями, используемыми в Telegram API. Что это за объекты и сущности?
Объекты aiogram.types
- User : Представляет информацию о пользователе Telegram. Содержит такие поля, как идентификатор пользователя, имя пользователя, имя и фамилия и другие данные.
- Message : Содержит информацию о сообщении, отправленном в чат. Включает в себя текст сообщения, информацию о чате, отправителе и дате отправки.
- Chat : Предоставляет информацию о чате. Может быть как групповым чатом, так и личным диалогом. Включает в себя идентификатор чата, название (для групповых чатов), и другие свойства.
- InlineKeyboardButton : Представляет кнопку встроенной клавиатуры. Позволяет создавать интерактивные кнопки для быстрого взаимодействия с пользователем.
- InlineQuery : Содержит информацию о встроенном запросе пользователя. Используется, например, для создания ботов, которые могут отвечать на запросы прямо из поля ввода сообщений.
- Update : Представляет обновление в чате, такое как новое сообщение, изменение состава участников и другие события.
- KeyboardButton : Представляет кнопку на пользовательской клавиатуре. Может быть использована для создания пользовательских интерфейсов с кнопками.
- CallbackQuery : Содержит информацию о callback-запросе, который генерируется при нажатии на кнопку с callback-данными. Позволяет реализовывать интерактивные действия в боте.
- Audio : Информация о аудиофайле, отправленном пользователем. Включает в себя длительность, название, исполнителя и другие данные.
- PhotoSize : Представляет размер одной из фотографий, отправленных пользователем или доступных в чате.
- Document : Информация о документе (например, PDF, архивы и другие файлы), отправленном пользователем.
- Sticker : Данные о стикере, отправленном или полученном в чате.
- Video : Информация о видеофайле, отправленном пользователем. Включает в себя длительность, размер, превью и другие параметры.
- Voice : Информация о голосовом сообщении, отправленном пользователем.
- Venue : Предоставляет информацию о местоположении (месте встречи), например, координаты, название, адрес и другие данные.
- Location : Содержит информацию о географическом местоположении.
И это только небольшая часть типов, предоставляемых модулем aiogram.types . Эти типы помогают упростить работу с данными, получаемыми из Telegram API, и делают код более читаемым и понятным.
How to Find Your Telegram Chat ID and Token for Python Bot | Prakash Info
Класс user
Объект класса User из модуля aiogram.types представляет информацию о пользователе Telegram. Этот класс содержит различные атрибуты, которые предоставляют доступ к данным о пользователе, а также может использоваться для отправки сообщений и взаимодействия с ним.
Вот некоторые атрибуты и методы класса User :
Атрибуты:
Бот, который приветствует пользователя.
В данном примере бот реагирует на команду /start и отправляет пользователю приветственное сообщение с упоминанием его имени. Обратите внимание, что в данном случае объект user получен из атрибута from_user объекта Message.
Не забудьте заменить ‘YOUR_BOT_API_TOKEN’ на реальный API-токен вашего бота, чтобы код работал правильно.
Класс message
Работу с сообщениями, мы разбирали в отдельном уроке по сообщениям.
Класс chat
Объект класса Chat из модуля aiogram.types представляет информацию о чате в Telegram. Этот класс содержит различные атрибуты, которые предоставляют доступ к данным о чате, а также может использоваться для отправки сообщений и взаимодействия с чатом.
Вот некоторые атрибуты и методы класса Chat :
Атрибуты:
Методы:
- ban(chat_id, user_id) : Этот метод позволяет банить пользователя в чате. Он может использоваться для запрета пользователю отправлять сообщения и взаимодействовать с чатом.
- unban(chat_id, user_id) : Данный метод служит для разблокировки пользователя в чате после бана.
- leave(chat_id) : Позволяет боту покинуть чат.
- get_member(chat_id, user_id) : Получает информацию о члене чата по его ID.
- get_administrators(chat_id) : Получает список администраторов чата.
- set_title(chat_id, title) : Устанавливает название для чата, если это возможно.
- promote(chat_id, user_id) : Повышает пользователя до администратора чата.
Пример бота, который выдает информацию о чате, где задействована команда /info
Работа с встроенными кнопками
В телеграм боте, возможна работа с двумя видами кнопок: встроенными и текстовыми. Встроенные кнопки появляются в тексте, и при нажатии на них, происходит определенное действие.
При нажатии на текстовую кнопку, боту передается сообщение с текстом, написанным на кнопке.
Объекты класса InlineKeyboardButton и InlineKeyboardMarkup используются для создания встроенной (inline) клавиатуры в ботах Telegram. Встроенная клавиатура позволяет пользователям взаимодействовать с ботом, выбирая опции или выполняя действия, прямо из поля ввода сообщения.
Класс InlineKeyboardButton
Этот класс представляет собой кнопку во встроенной клавиатуре. Вот некоторые атрибуты и методы:
Атрибуты:
- text : Текст кнопки.
- callback_data : Данные, которые будут переданы обратно боту при нажатии кнопки.
Класс InlineKeyboardMarkup
Этот класс представляет собой встроенную клавиатуру, содержащую кнопки. Вот некоторые методы:
Методы:
- add() : Добавляет кнопку или несколько кнопок к клавиатуре.
- insert() : Вставляет кнопку в определенное место в клавиатуре.
- row() : Добавляет кнопки в одной строке.
- clear() : Удаляет все кнопки из клавиатуры.
Пример бота с инлайн кнопкой:
В этом примере бот отправляет пользователю сообщение с встроенной клавиатурой, содержащей одну кнопку. При нажатии на кнопку вызывается обработчик button_pressed , который отправляет ответное сообщение.
Текстовые кнопки
Объект класса KeyboardButton из модуля aiogram.types используется для создания кнопок на пользовательской клавиатуре в ботах Telegram. Эти кнопки позволяют пользователям взаимодействовать с ботом, выбирая опции или отправляя текстовые команды.
Вот некоторые атрибуты и методы класса KeyboardButton :
Атрибуты:
- text : Текст, который будет отображаться на кнопке.
В данном примере бот реагирует на команду /start , отправляя пользователю сообщение с пользовательской клавиатурой, содержащей одну кнопку «Привет!». Когда пользователь нажимает эту кнопку и отправляет текст «Привет!», бот отвечает приветственным сообщением.
Обратите внимание, что использование пользовательских клавиатур стоит осторожно, так как слишком много кнопок может создать путаницу у пользователей, и нежелательное использование может нарушить пользование чатами и диалогами.
Как выровнять кнопки на клавиатуре?
Для выравнивания кнопок на пользовательской клавиатуре в Telegram можно использовать атрибуты и методы, предоставляемые классом ReplyKeyboardMarkup или InlineKeyboardMarkup , в зависимости от того, какой тип клавиатуры вы используете.
ReplyKeyboardMarkup:
Для выравнивания кнопок с помощью ReplyKeyboardMarkup можно использовать метод row() . Этот метод добавляет кнопки в одну строку на клавиатуре.
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton keyboard = ReplyKeyboardMarkup(resize_keyboard=True) button1 = KeyboardButton(text=»Кнопка 1″) button2 = KeyboardButton(text=»Кнопка 2″) keyboard.row(button1, button2)
Как к текстовой кнопке привязать команду?
При нажатии текстовой кнопки, в бот отправляется текст, содержащийся на кнопке. Часто необходима обработка нажатия кнопки. Это делается через специальный обработчик callback_query_handler
В этом примере, когда пользователь нажимает кнопку «Информация», бот отправляет callback-запрос с callback_data=»info_command» . Обработчик info_callback реагирует на этот запрос и выполняет команду для отправки информации.
Обратите внимание, что использование InlineKeyboardButton с callback_data более гибкое, чем передача текстовой команды в тексте кнопки. Вы можете передавать разные значения callback_data для разных действий, и в обработчиках CallbackQuery легко идентифицировать, какое действие было выполнено пользователем.
Работа с медиа данными от пользователя
Пример бота, который в случае получения информации о свойствах различных медиа, отправленных пользователем: фото, видео, голосового сообщения, документа, сообщает о свойствах полученного контента.
В каждом из этих примеров бот реагирует на разные типы медиа, получая информацию о свойствах каждого медиа и отправляя пользователю соответствующее сообщение с этой информацией. Обратите внимание, что обработчики определяются с помощью атрибута content_types и соответствующих типов медиа из aiogram.types.ContentTypes .
Создание опроса с помощью бота
В этом примере бот позволяет пользователям создавать опросы, добавлять варианты ответов и отправлять опросы в произвольный чат. Каждый пользователь может иметь только один активный опрос. Бот сохраняет данные об опросе в словаре polls .
Источник: victor-komlev.ru
Как написать Telegram-бота на Python: инструкция
В этой инструкции разберем процесс создания простого бота-ремайндера, единственная задача которого — напоминать пользователю о важных делах. Это базовая конструкция, которую можно усложнять и менять под свои потребности.
Инструкция подойдет для новичков, которые знают Python на базовом уровне, пробовали писать код и установили на компьютер редактор кода.
Первый этап: подготовка проекта и развертывание окружения
Найдем в поиске Telegram BotFather — официального бота мессенджера, который создает другие боты и управляет ими. В интерфейсе выбираем /start, затем — /newbot, и следом задаем имя и адрес. В этой инструкции это будут Elbrus Reminder и elbrus_reminder_bot соответственно.
После этого шага BotFather пришлет сообщение с токеном и ссылкой на бот:
Токен нужно хранить в безопасном месте — он дает контроль над ботом. и, как следствие, позволяет получить доступ к данным пользователей.
На время закроем Telegram и создадим на компьютере папку с именем проекта: например, reminder_bot. Откроем папку в среде разработки и создадим рабочий файл с понятным названием — bot.py.
Откроем терминал редактора кода и создадим для проекта новое окружение. В среде разработки с помощью команды python -m venv .venv создадим папку с окружением .venv .
Если окружение не активировалось автоматически, можно сделать это вручную, прописав путь к файлу активации в формате source .venv/bin/activate , где source — команда языка программирования Bash. Другой вариант — перезапустить среду разработки. Он работает для Visual Studio Code, но нужно предварительно принять предложение редактора привязать среду к папке проекта сразу после создания окружения.
Практика создания нового окружения под каждый проект позволяет повыстить безопасности и стабильность проекта — в окружении вы можете использовать только те библиотеки и их версии, которые требуются в проекте. Если в проекте появятся дополнительные функции, все изменения будут храниться в этом окружении. При этом оно будет изолировано от других окружений и проектов — это повысит безопасность проекта.
Второй этап: подключаем библиотеки
Проект создан и окружение готово: пора переходить к написанию кода. По правилам хорошего тона в первую очередь через import добавляем несколько предустановленных библиотек Python. При создании бота нам пригодятся logging и time , которые отвечают за определение времени и логирование сообщений.
import time import logging
Затем добавим асинхронную библиотеку aiogram, на основе которой будет работать бот. Она, например, определяет, какое сообщение пришло, как его нужно обработать и какие порты нужны. Сначала устанавливаем ее через терминал командой pip install aiogram , а в редакторе кода пишем следующее:
from aiogram import Bot, Dispatcher, executor, types
Из этой библиотеки нам нужны только отдельные модули и классы — все ее возможности для создания базовой версии бота не пригодятся. Поэтому вместо одиночного import использована команда from <> import <> .
Когда библиотеки импортированы, создадим переменные с токеном бота и сообщением, которое он будет отправлять пользователю. Вы можете заменить это сообщение на любое другое, которое вам необходимо. Это статические переменные, поэтому их имена написаны капслоком:
TOKEN = «здесьбудетваштокенот от BotFather» MSG = «Программировал ли ты сегодня, <>?»
Токены, ключи и прочие данные для настройки проекта лучше загружать более безопасным способом (например, создавать переменные окружения или файлы конфигурации). Но в данном случае сделаем все в одном файле для наглядности, а примеры более безопасной работы с такими переменными разберем в следующих постах.
Теперь создадим экземпляр класса Bot , передав ему в качестве аргумента наш токен, и экземпляр класса Dispatcher (dp), который в качестве аргумента получит bot . В результате получаем связку объекта класса bot с ключем, который привязан к боту, и диспетчера, который привязан к этому боту:
bot = Bot(token=TOKEN) dp = Dispatcher(bot=bot)
Следующим шагом добавим конструкцию под названием декоратор ( massage_handler ) — она помогает получить из диспетчера нужный функционал. В качестве аргумента прописываем команды, которые обрабатывает декоратор — в данном случае это команда /start , которая запускает бот.
Под декоратором прописываем функцию, которая будет обрабатывать команду /start и определяет логику, в соответствии с которой будет работать бот. Поскольку мы работаем с асинхронной библиотекой, функция тоже должна быть асинхронной. Для этого перед указанием def добавим ключевое слово async :
async def start_handler(message: types.Message):
Функция приветствует пользователя и обрабатывает сообщение, которое он отправляет в ответ. Из сообщения можно получить информацию о пользователе, который его прислал, время отправки и его ID.
Создаем переменную и сохраняем в ней user id :
user_id = message.from_user.id
Затем получаем из сообщения короткое и полное имя пользователя:
user_name = message.from_user.first_name user_full_name = message.from_user.full_name
Для того, чтобы в логах отображалась информация о пользователе, передаем в виде текста ID и полное имя, а также используем возможности библиотеки time , чтобы определить время, когда писал пользователь:
logging.info(f’ ‘)
Здесь отойдем в сторону и проверим корректность работы модуля time . Сделать это можно в терминале: для этого напишем import time , а затем — time.asctime .
Вернемся к коду. Поскольку функция, которую мы используем, асинхронна, вместо обычного для функций return используем await :
await message.reply(f»Привет, !»)
Ответить пользователю в боте можно несколькими способами — в данном случае используем reply. Выше в переменной MSG мы задали стандартное сообщение: «Программировал ли ты сегодня, <>?». Зададим частоту напоминаний: семь раз каждые семь суток (60х60х24 — количество секунд в одних сутках) с момента отправки команды /start боту от пользователя:
for i in range(7): await asyncio.sleep(60*60*24)
Затем настроим отправку сообщения с указанием имени пользователя в этом же цикле:
await bot.send_message(user_id, MSG.format(user_name))
Третий этап: финал
Переходим к финальной части: в конце скрипта напишем несколько строк. Они могут показаться странными для новичка, но это общепринятая практика, к которой многие программисты прибегают при разработке. В этой строке мы проверяем, равна ли переменная __name__ строке «__main__» . Это условие всегда будет True, если мы запускаем этот файл как python-скрипт через терминал:
if __name__ == ‘__main__’:
Теперь делаем нашего бота доступным в сети:
executor.start_polling(dp)
Сохраняем файл. Запускаем бота в терминале, открытом в папке проекта, с помощью команды python bot.py .
Вернемся в BotFather и перейдем по ссылке, которую получили вместе с токеном. Нажимаем «Начать» — готово, бот, написанный меньше, чем в 30 строк, работает.
Так выглядит его код целиком:
В следующий раз подробно расскажем, как написать подобный бот на языке программирования JavaScript. Подписывайтесь, чтобы не пропустить инструкцию.
Катрин Алимова
Вам может также понравиться.
Скрипты async, defer и оптимизация
12 сент. 2023 г.
Пишем нашу первую сопрограмму
21 авг. 2023 г.
Источник: elbrusboot.camp