Как создать телеграм-бот на Python: пошаговое руководство для начинающих
Для кого эта статья:
- Начинающие и продвинутые разработчики, интересующиеся созданием телеграм-ботов на Python
- Люди, желающие освоить программирование и автоматизацию задач через ботов
Студенты, потенциальные участники курсов по Python-разработке и разработке ботов
Создать своего телеграм-бота — это как собрать первый конструктор Lego 🤖. Сначала кажется сложным, но с правильной инструкцией всё встаёт на свои места! Python с его простотой и гибкостью — идеальный инструмент для этой задачи. Неважно, хотите ли вы автоматизировать рассылку уведомлений, создать интерактивный чат или просто впечатлить друзей — этот гид проведёт вас через весь процесс от первой строчки кода до запуска готового бота.
Хотите не просто создать телеграм-бота, а стать востребованным Python-разработчиком? На курсе Обучение Python-разработке от Skypro вы освоите не только создание ботов, но и веб-приложения, работу с API и базами данных под руководством практикующих разработчиков. Студенты получают поддержку наставников и гарантированную стажировку с возможностью трудоустройства уже через 8 месяцев!
Что такое Telegram-бот и зачем его создавать на Python
Telegram-бот — это специальная программа, работающая внутри мессенджера Telegram, которая может автоматически взаимодействовать с пользователями. Такие боты выполняют различные функции: от простой отправки уведомлений до сложных интерактивных сервисов. В отличие от обычных аккаунтов, боты не требуют номера телефона для регистрации и работают на серверах Telegram через специальный интерфейс Bot API.
Python стал негласным стандартом для создания телеграм-ботов благодаря нескольким весомым преимуществам:
- Простой и интуитивно понятный синтаксис, идеальный для начинающих разработчиков
- Богатая экосистема библиотек, включая специализированные фреймворки для Telegram API
- Отличная документация и большое сообщество, готовое помочь
- Высокая скорость разработки и лёгкое масштабирование проектов
Создание телеграм-ботов на Python открывает множество возможностей для автоматизации и улучшения коммуникации. Вот некоторые популярные сценарии использования ботов:
| Сфера применения | Примеры использования ботов | Преимущества |
|---|---|---|
| Бизнес | Обслуживание клиентов, приём заказов, отправка уведомлений о статусе | Автоматизация рутины, доступность 24/7 |
| Образование | Викторины, курсы с домашними заданиями, напоминания о дедлайнах | Интерактивность, геймификация обучения |
| Личное использование | Отслеживание расходов, напоминания, агрегация новостей | Персонализация, конфиденциальность данных |
| Медиа | Рассылка контента, сбор обратной связи, опросы | Прямой контакт с аудиторией, аналитика |
Дмитрий Петров, Python-разработчик
Когда я только начинал изучать Python, меня попросили создать бота для небольшого книжного магазина. Владелец хотел автоматизировать ответы на частые вопросы клиентов и уведомления о новых поступлениях. Несмотря на мой начальный уровень, я решил попробовать. Первая версия была простой — бот отвечал на базовые команды вроде /help или /catalog.
Через неделю экспериментов я добавил поиск по названию книги и автору, а ещё через месяц реализовал систему предзаказов. Владелец был в восторге — количество повторных покупок выросло на 30%. Для меня же это стало отличным портфолио и первым коммерческим проектом. Самое главное — я понял, что даже с базовыми знаниями Python можно создать что-то действительно полезное.

Подготовка среды разработки и получение токена API
Прежде чем приступить к написанию кода, необходимо настроить рабочую среду и получить доступ к API Telegram. Этот подготовительный этап критически важен для успешной разработки бота. 🔧
Настройка среды разработки
Для комфортной работы над проектом вам понадобится:
- Python 3.7 или выше — убедитесь, что у вас установлена актуальная версия интерпретатора
- Виртуальное окружение — для изоляции зависимостей проекта
- Библиотека для работы с Telegram Bot API
Создадим и активируем виртуальное окружение:
# Для Windows
python -m venv venv
venv\Scripts\activate
# Для macOS/Linux
python3 -m venv venv
source venv/bin/activate
Установим библиотеку python-telegram-bot, которая значительно упрощает взаимодействие с API Telegram:
pip install python-telegram-bot
Получение токена API от BotFather
Для взаимодействия с Telegram Bot API вам понадобится уникальный токен. Получить его можно через специального бота в Telegram — BotFather. Вот пошаговая инструкция:
- Откройте Telegram и найдите бота @BotFather
- Отправьте команду /newbot
- Следуйте инструкциям: укажите имя бота (отображаемое имя) и его username (должен заканчиваться на "bot")
- После успешного создания вы получите токен API — длинную строку, выглядящую примерно так: 123456789:ABCDefGhIJKlmNoPQRsTUVwxyZ
Важно! Храните токен в безопасности и не публикуйте его в открытом доступе. Злоумышленники могут использовать его для управления вашим ботом. 🔒
Для безопасной разработки рекомендуется использовать переменные окружения или отдельный файл конфигурации, который не будет загружаться в публичные репозитории.
# Создайте файл config.py
TOKEN = 'ваш_токен_здесь'
# В основном коде
from config import TOKEN
Перед началом разработки полезно проверить, что токен работает корректно. Самый простой способ — отправить запрос к методу getMe:
import requests
url = f"https://api.telegram.org/bot{TOKEN}/getMe"
response = requests.get(url)
print(response.json())
Если всё настроено правильно, вы получите информацию о своём боте в формате JSON.
Основы создания простого эхо-бота с python-telegram-bot
Теперь, когда среда разработки настроена и токен получен, можно приступить к созданию простейшего бота — эхо-бота, который будет повторять все сообщения пользователя. Этот пример поможет понять основную структуру проекта и ключевые концепции библиотеки python-telegram-bot. 🦜
Создадим файл echo_bot.py и напишем следующий код:
from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, filters
# Функция для обработки команды /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Привет! Я эхо-бот. Отправь мне сообщение, и я отправлю его обратно.')
# Функция для обработки текстовых сообщений
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(update.message.text)
# Основная функция
def main():
# Создаем приложение
application = ApplicationBuilder().token('ВАШ_ТОКЕН_API').build()
# Регистрируем обработчики
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
# Запускаем бота
print("Бот запущен...")
application.run_polling()
if __name__ == '__main__':
main()
Разберём этот код более детально:
- Импорт необходимых классов и функций из библиотеки python-telegram-bot
- Определение обработчиков для различных типов сообщений:
- start() — обрабатывает команду /start и отправляет приветствие
- echo() — обрабатывает любые текстовые сообщения и отправляет их обратно пользователю
- Функция main() инициализирует приложение, регистрирует обработчики и запускает бота
Ключевые элементы архитектуры python-telegram-bot:
| Компонент | Описание | Назначение |
|---|---|---|
| Update | Объект, содержащий информацию о входящем обновлении | Доступ к данным сообщения, пользователя и контексту |
| Context | Объект контекста, хранящий состояние и данные между обновлениями | Хранение данных сессии и общего состояния |
| Handler | Обработчик определенного типа обновлений | Маршрутизация входящих сообщений к соответствующим функциям |
| Filter | Фильтры для более точного определения типа обрабатываемых сообщений | Детальная настройка условий обработки |
Чтобы запустить бота, замените 'ВАШТОКЕНAPI' в коде на токен, полученный от BotFather, и выполните файл:
python echo_bot.py
Теперь откройте Telegram, найдите своего бота по имени пользователя и начните диалог. Отправьте команду /start, чтобы получить приветствие, а затем попробуйте отправить любой текст — бот должен ответить тем же сообщением.
Это простейший пример, но он демонстрирует основную структуру телеграм-бота на Python. На этой базе вы сможете строить более сложные и функциональные боты. 🚀
Добавление команд и обработка сообщений пользователей
После создания базового эхо-бота, пора добавить больше функциональности через команды и обработку различных типов сообщений. Это позволит вашему боту стать по-настоящему полезным и интерактивным. 🛠️
Расширим наш предыдущий пример, добавив новые команды и обработчики сообщений:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, CallbackQueryHandler, filters
import datetime
# Обработчик команды /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.effective_user
await update.message.reply_text(f'Привет, {user.first_name}! Я многофункциональный бот.\n'
f'Используй /help для получения списка команд.')
# Обработчик команды /help
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
help_text = """
Доступные команды:
/start – Начать взаимодействие с ботом
/help – Показать это сообщение
/time – Узнать текущее время
/menu – Показать интерактивное меню
"""
await update.message.reply_text(help_text)
# Обработчик команды /time
async def time_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
now = datetime.datetime.now().strftime("%H:%M:%S")
await update.message.reply_text(f'Текущее время: {now}')
# Обработчик команды /menu
async def menu_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [
[InlineKeyboardButton("Опция 1", callback_data='option1')],
[InlineKeyboardButton("Опция 2", callback_data='option2')],
[InlineKeyboardButton("Опция 3", callback_data='option3')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text('Выберите опцию:', reply_markup=reply_markup)
# Обработчик нажатий на кнопки
async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == 'option1':
await query.edit_message_text(text="Вы выбрали Опцию 1!")
elif query.data == 'option2':
await query.edit_message_text(text="Вы выбрали Опцию 2!")
elif query.data == 'option3':
await query.edit_message_text(text="Вы выбрали Опцию 3!")
# Обработчик текстовых сообщений
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = update.message.text.lower()
if 'привет' in text:
await update.message.reply_text('И тебе привет! 👋')
elif 'как дела' in text:
await update.message.reply_text('У меня всё отлично, я же бот! А у тебя?')
elif 'погода' in text:
await update.message.reply_text('Я пока не умею узнавать погоду, но это можно добавить!')
else:
await update.message.reply_text('Я не совсем понял, что ты имеешь в виду. Попробуй /help для списка команд.')
# Обработчик фото
async def handle_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Красивое фото! Но я пока не умею их анализировать.')
# Основная функция
def main():
application = ApplicationBuilder().token('ВАШ_ТОКЕН_API').build()
# Регистрируем обработчики команд
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("help", help_command))
application.add_handler(CommandHandler("time", time_command))
application.add_handler(CommandHandler("menu", menu_command))
# Регистрируем обработчик кнопок
application.add_handler(CallbackQueryHandler(button_callback))
# Регистрируем обработчики сообщений
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text))
application.add_handler(MessageHandler(filters.PHOTO, handle_photo))
# Запускаем бота
print("Бот запущен...")
application.run_polling()
if __name__ == '__main__':
main()
В этом примере мы реализовали несколько важных улучшений:
- Расширенный набор команд:
- /start – Теперь приветствует пользователя по имени
- /help – Отображает список доступных команд
- /time – Показывает текущее время
- /menu – Отображает интерактивное меню с кнопками
- Интерактивные элементы:
- Встроенная клавиатура (InlineKeyboardMarkup)
- Обработка нажатий на кнопки (CallbackQueryHandler)
- Обработка различных типов сообщений:
- Текстовые сообщения с контекстно-зависимыми ответами
- Фотографии (с простым ответом)
Анна Соколова, Python-инструктор
На одном из моих курсов студентка Мария создавала своего первого телеграм-бота. Ей нужен был помощник для своего небольшого онлайн-магазина косметики. Изначально Мария думала, что сможет сделать только простые команды, но быстро освоила более сложную функциональность.
Ключевым прорывом стало добавление интерактивного каталога с кнопками. Покупатели могли выбирать категории товаров, просматривать описания и даже оставлять заказы. Особенно удачно реализовали "умную" обработку вопросов — бот распознавал ключевые слова в сообщениях клиентов и предлагал подходящие товары или отвечал на частые вопросы.
За первый месяц работы бота количество заказов выросло на 40%, при этом Мария тратила гораздо меньше времени на консультирование клиентов. Сейчас она планирует добавить интеграцию с платежной системой и автоматическое формирование накладных — всё это с использованием Python и той же библиотеки python-telegram-bot.
Давайте рассмотрим некоторые продвинутые техники обработки команд и сообщений:
Команды с аргументами
Вы можете создавать команды, принимающие аргументы. Например, команда для конвертации валют:
# /convert 100 USD EUR
async def convert_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Получаем аргументы из контекста
args = context.args
if len(args) != 3:
await update.message.reply_text('Использование: /convert [сумма] [из_валюты] [в_валюту]')
return
try:
amount = float(args[0])
from_currency = args[1].upper()
to_currency = args[2].upper()
# Здесь должен быть код для реального конвертирования
# Для примера просто умножим на случайный коэффициент
import random
result = amount * random.uniform(0.5, 2.0)
await update.message.reply_text(f'{amount} {from_currency} = {result:.2f} {to_currency}')
except ValueError:
await update.message.reply_text('Ошибка: неверный формат суммы.')
Сохранение состояния и контекста
Для создания многошаговых взаимодействий можно использовать контекст для сохранения данных между сообщениями:
from telegram.ext import ConversationHandler
# Определяем состояния для беседы
CHOOSING_NAME, CHOOSING_AGE, CONFIRMING = range(3)
async def start_survey(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Привет! Как вас зовут?')
return CHOOSING_NAME
async def received_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Сохраняем имя в контексте
context.user_data['name'] = update.message.text
await update.message.reply_text(f'Приятно познакомиться, {context.user_data["name"]}! Сколько вам лет?')
return CHOOSING_AGE
async def received_age(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Сохраняем возраст в контексте
try:
age = int(update.message.text)
context.user_data['age'] = age
await update.message.reply_text(
f'Проверьте данные:\nИмя: {context.user_data["name"]}\nВозраст: {context.user_data["age"]}\n\nВсё верно? (да/нет)'
)
return CONFIRMING
except ValueError:
await update.message.reply_text('Пожалуйста, введите возраст числом.')
return CHOOSING_AGE
async def confirm_data(update: Update, context: ContextTypes.DEFAULT_TYPE):
if update.message.text.lower() == 'да':
await update.message.reply_text('Спасибо! Ваши данные сохранены.')
else:
await update.message.reply_text('Давайте попробуем ещё раз. Как вас зовут?')
return CHOOSING_NAME
return ConversationHandler.END
# В функции main() добавляем ConversationHandler
conv_handler = ConversationHandler(
entry_points=[CommandHandler('survey', start_survey)],
states={
CHOOSING_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, received_name)],
CHOOSING_AGE: [MessageHandler(filters.TEXT & ~filters.COMMAND, received_age)],
CONFIRMING: [MessageHandler(filters.TEXT & ~filters.COMMAND, confirm_data)]
},
fallbacks=[CommandHandler('cancel', lambda update, context: ConversationHandler.END)]
)
application.add_handler(conv_handler)
Эти примеры демонстрируют более сложные взаимодействия, которые можно реализовать в вашем боте. Комбинируя различные обработчики, вы можете создать бота, который будет отвечать практически на любые потребности пользователей. 🚀
Публикация бота и практические советы по его улучшению
После создания функционального бота настало время сделать его доступным для пользователей и подумать о его дальнейшем совершенствовании. В этом разделе мы рассмотрим различные аспекты публикации и поддержки бота, а также поделимся практическими советами по его улучшению. 🚀
Развертывание бота на сервере
Для полноценной работы бот должен быть запущен на сервере с постоянным доступом в интернет. Существует несколько вариантов размещения бота:
| Платформа | Преимущества | Недостатки | Подходит для |
|---|---|---|---|
| VPS/VDS (DigitalOcean, Linode, Vultr) | Полный контроль, гибкость настроек | Требует знания администрирования Linux | Средних и крупных ботов с высокой нагрузкой |
| PythonAnywhere | Простота настройки, бесплатный тариф | Ограничения на бесплатном тарифе | Начинающих разработчиков, тестирования |
| Heroku | Интеграция с Git, автоматические деплои | Ограниченное время работы на бесплатном плане | Средних проектов с умеренной нагрузкой |
| AWS Lambda | Оплата за фактическое использование | Сложная настройка для новичков | Ботов с непредсказуемой нагрузкой |
Рассмотрим базовый процесс развертывания на VPS с использованием systemd для автоматического запуска и перезапуска бота:
# Создаем сервисный файл
sudo nano /etc/systemd/system/telegrambot.service
# Содержимое файла
[Unit]
Description=Telegram Bot Service
After=network.target
[Service]
User=yourusername
WorkingDirectory=/path/to/your/bot
ExecStart=/path/to/your/bot/venv/bin/python bot.py
Restart=always
[Install]
WantedBy=multi-user.target
# Активируем и запускаем сервис
sudo systemctl enable telegrambot
sudo systemctl start telegrambot
# Проверяем статус
sudo systemctl status telegrambot
Управление зависимостями и версионностью
Для надежной работы бота важно правильно управлять зависимостями:
- Создайте файл
requirements.txtс списком всех зависимостей:
pip freeze > requirements.txt
- Используйте конкретные версии библиотек для предотвращения неожиданных изменений:
python-telegram-bot==20.3
- Используйте системы контроля версий (Git) для отслеживания изменений в коде
- Тестируйте обновления в тестовой среде перед применением на рабочем боте
Мониторинг и обработка ошибок
Для обеспечения стабильной работы бота реализуйте систему мониторинга и обработки ошибок:
import logging
from telegram.ext import ApplicationBuilder
# Настраиваем логирование
logging.basicConfig(
format='%(asctime)s – %(name)s – %(levelname)s – %(message)s',
level=logging.INFO,
filename='bot.log'
)
# Функция для обработки ошибок
async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
logging.error(f"Возникла ошибка: {context.error}")
# Уведомляем администратора
admin_id = 'YOUR_ADMIN_TELEGRAM_ID'
if update:
error_message = f"Произошла ошибка при обработке обновления: {update}"
else:
error_message = f"Произошла ошибка: {context.error}"
await context.bot.send_message(chat_id=admin_id, text=error_message)
# В функции main()
application = ApplicationBuilder().token('YOUR_TOKEN').build()
application.add_error_handler(error_handler)
Практические советы по улучшению бота
Оптимизация производительности
- Используйте асинхронные запросы для взаимодействия с внешними API
- Кэшируйте часто запрашиваемые данные
- Используйте базы данных для хранения больших объемов информации (SQLite, PostgreSQL)
Улучшение пользовательского опыта
- Добавьте встроенные подсказки при вводе команд
- Реализуйте интуитивно понятные меню с кнопками
- Добавьте приятные визуальные элементы: эмодзи, форматирование текста, изображения
- Создайте функцию помощи и документацию по использованию бота
Безопасность
- Валидируйте все входные данные от пользователя
- Защитите административные команды через систему авторизации
- Не храните токены и пароли в коде — используйте переменные окружения
- Регулярно обновляйте зависимости для устранения уязвимостей
Расширенная функциональность
- Интеграция с другими сервисами через API (погода, новости, переводы)
- Многоязычная поддержка для пользователей из разных стран
- Планировщик задач для отправки уведомлений в определенное время
- Аналитика использования для улучшения функциональности
Примеры расширенной функциональности
Интеграция с внешним API (на примере получения погоды):
import aiohttp
import json
async def get_weather(city):
api_key = 'YOUR_WEATHER_API_KEY'
url = f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
data = await response.json()
return {
'temp': data['main']['temp'],
'description': data['weather'][0]['description'],
'humidity': data['main']['humidity']
}
else:
return None
async def weather_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
if len(context.args) < 1:
await update.message.reply_text('Пожалуйста, укажите город. Например: /weather Москва')
return
city = ' '.join(context.args)
weather_data = await get_weather(city)
if weather_data:
reply = f"Погода в {city}:\n"
reply += f"🌡️ Температура: {weather_data['temp']}°C\n"
reply += f"🌤️ {weather_data['description'].capitalize()}\n"
reply += f"💧 Влажность: {weather_data['humidity']}%"
else:
reply = f"Извините, не могу найти информацию о погоде для {city}."
await update.message.reply_text(reply)
# В функции main()
application.add_handler(CommandHandler("weather", weather_command))
Планировщик заданий для регулярных уведомлений:
from telegram.ext import JobQueue
# Функция для отправки регулярных обновлений
async def send_daily_update(context: ContextTypes.DEFAULT_TYPE):
chat_id = context.job.chat_id
await context.bot.send_message(chat_id=chat_id, text="Это ваше ежедневное обновление! 📅")
# Обработчик команды для подписки на обновления
async def subscribe_daily(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
# Удаляем существующие задания для этого чата, если они есть
current_jobs = context.job_queue.get_jobs_by_name(f"daily_{chat_id}")
for job in current_jobs:
job.schedule_removal()
# Планируем новое задание – каждый день в 9:00
context.job_queue.run_daily(
send_daily_update,
time=datetime.time(hour=9, minute=0, second=0),
chat_id=chat_id,
name=f"daily_{chat_id}"
)
await update.message.reply_text('Вы успешно подписались на ежедневные обновления в 9:00!')
# Обработчик команды для отмены подписки
async def unsubscribe_daily(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
# Удаляем существующие задания для этого чата
current_jobs = context.job_queue.get_jobs_by_name(f"daily_{chat_id}")
for job in current_jobs:
job.schedule_removal()
await update.message.reply_text('Вы отписались от ежедневных обновлений.')
# В функции main()
application.add_handler(CommandHandler("subscribe", subscribe_daily))
application.add_handler(CommandHandler("unsubscribe", unsubscribe_daily))
Помните, что создание бота — это итеративный процесс. Начните с малого, получайте обратную связь от пользователей и постепенно улучшайте функциональность. Регулярно анализируйте логи и статистику использования, чтобы понять, какие функции востребованы, а какие нет. 📊
Создание телеграм-бота на Python — это не просто технический навык, а мощный инструмент для решения практических задач. Освоив основы, описанные в этом руководстве, вы сможете автоматизировать рутинные процессы, улучшить взаимодействие с аудиторией и реализовать творческие идеи без сложной инфраструктуры. Главное помнить: лучший бот — тот, который решает конкретную проблему пользователя. Начните с простого прототипа, собирайте обратную связь и постепенно совершенствуйте его. Ваш первый бот может стать началом увлекательного путешествия в мир программирования и автоматизации.
Читайте также
- Google Colab: бесплатная Python-среда для обработки данных
- TensorFlow для разработчиков: установка и настройка фреймворка
- Python и CSV: эффективная обработка табличных данных – инструкция
- Топ-7 инструментов интерактивной визуализации данных для бизнеса
- Запуск Python скриптов через командную строку: руководство разработчика
- Python API интеграция: 10 примеров кода для работы с сервисами
- 5 методов добавления столбцов по условиям в pandas: руководство
- Обучение с подкреплением на Python: от теории к созданию умных алгоритмов
- Установка Keras для Python: простое руководство для начинающих
- Как превратить Python-списки в DataFrame pandas: техники и примеры


