В предыдущем материале мы разобрали, как создать базового "мертвого" бота, получив только его токен. Теперь пойдем дальше и научимся добавлять в бота собственные команды и реализуем полноценную систему обратной связи между пользователями и администратором.
Подготовка рабочей среды
Для начала работы необходимо убедиться, что на компьютере установлен Python. Затем потребуется библиотека PyTelegramBotAPI. Установите её, выполнив в командной строке следующую последовательность действий:
Перейдите в директорию скриптов Python: cd <путь_к_папке_scripts>. После этого выполните команду установки: pip install pytelegrambotapi. Дождитесь завершения процесса.
Написание кода бота
Для удобства разработки и тестирования будем писать код в текстовом редакторе (например, Sublime Text) и запускать бота локально на своем компьютере. Важный момент: если вы находитесь в России, для корректной работы Telegram Bot API, скорее всего, потребуется использовать VPN. Можно выбрать любой надежный сервис, например WindScribe, который предоставляет ежемесячный бесплатный трафик после подтверждения email.
Чтобы основной код не был перегружен конфигурационными данными, создадим отдельный файл config.py. В него вынесем критически важные переменные, такие как токен бота и идентификатор владельца (администратора).
Пример содержимого config.py:
token = 'ВАШ_ТОКЕН_БОТА' # Замените на реальный токен, полученный от @BotFather
owner = ВАШ_ID # Ваш числовой идентификатор в Telegram
Базовая команда /ping
Начнем с простой, но полезной команды /ping, которая позволит проверить, активен ли бот. Вот как может выглядеть её реализация:
@bot.message_handler(commands=["ping"]) # Декоратор для обработки команды
def start(message):
try: # Используем try-except для отлова ошибок
bot.send_message(message.chat.id, "PONG!", parse_mode="HTML") # Отправляем ответ
except:
# В случае ошибки уведомляем администратора, но не прерываем работу бота
bot.send_message(config.owner, 'Что-то пошло не так!')
Оборачивание логики в блок try-except — хорошая практика, которая позволяет боту продолжать работу даже при возникновении неожиданных ошибок.
Реализация системы обратной связи
Система обратной связи будет состоять из двух частей: приём сообщений от пользователей и возможность администратора отвечать на них через специальную команду /send.
Приём сообщений от пользователей
Следующий код обрабатывает все текстовые сообщения, поступающие боту, и разделяет логику для администратора и обычных пользователей.
@bot.message_handler(content_types=["text"])
def messages(message):
# Если пишет администратор
if int(message.chat.id) == config.owner:
try:
bot.send_message(message.chat.id, 'Сообщение от администратора было получено')
except:
# Детализированное сообщение об ошибке для отладки
bot.send_message(config.owner, 'Ошибка в блоке обработки текста.', parse_mode='HTML')
# Если пишет обычный пользователь
else:
try:
# Пересылаем сообщение администратору
bot.forward_message(config.owner, message.chat.id, message.message_id)
# Отправляем пользователю подтверждение
bot.send_message(message.chat.id, f'{message.from_user.first_name}, я получил твоё сообщение и скоро отвечу :)')
except:
bot.send_message(config.owner, 'Ошибка при пересылке сообщения пользователя.')
Таким образом, любое сообщение от пользователя автоматически пересылается владельцу бота, а отправитель получает вежливый автоматический ответ.
Ответ пользователям через команду /send
Чтобы администратор мог отвечать на полученные сообщения, создадим команду /send. Ответ должен быть отправлен как ответ (реплай) на пересланное ботом сообщение от пользователя.
@bot.message_handler(commands=['send'])
def process_start(message):
# Команда доступна только администратору
if int(message.chat.id) == config.owner:
try:
bot.send_message(message.chat.id, 'Чтобы ответить пользователю, сделай реплей на его пересланное сообщение и напиши текст.')
# Регистрируем следующий шаг — ожидание ответа с реплаем
bot.register_next_step_handler(message, process_mind)
except:
bot.send_message(message.chat.id, "Ошибка при обработке команды /send.", parse_mode='HTML')
else:
bot.send_message(message.chat.id, 'У вас нет прав для использования этой команды!')
# Функция, которая обрабатывает ответ администратора
def process_mind(message):
if int(message.chat.id) == config.owner:
# Проверяем, является ли сообщение ответом (реплаем)
if message.reply_to_message:
try:
# Отправляем ответ исходному пользователю
bot.forward_message(message.reply_to_message.forward_from.id, config.owner, message.message_id)
# Уведомляем администратора об успехе
bot.send_message(config.owner, f'Сообщение отправлено пользователю {message.reply_to_message.forward_from.first_name}')
except:
bot.send_message(config.owner, 'Не удалось отправить ответ. Убедитесь, что вы ответили на пересланное сообщение.')
else:
bot.send_message(config.owner, 'Ошибка: это сообщение не является ответом (реплаем).')
else:
bot.send_message(message.chat.id, 'Доступ запрещен.')
Алгоритм работы: администратор пишет /send, бот просит сделать реплей на нужное сообщение и написать ответ. Если реплей корректен, бот перешлёт ответ адресату и уведомит администратора.
Полный исходный код проекта можно найти в репозитории по ссылке.
Если материал был полезен, поддержите автора — подпишитесь и поставьте лайк. Остались вопросы? Задавайте их в комментариях, с радостью помогу разобраться.