Наверняка вам уже приходилось сталкиваться с ботами в Telegram. Боты помогают автоматизировать рутинные задачи как для обычных пользователей (например, боты-планировщики или боты для учета финансов), так и для компаний. Последние могут использовать ботов-рекламщиков, которые занимаются рассылками по клиентской базе, ботов-ассистентов, которые выполняют роль технической поддержки, и так далее.
В этой инструкции опишем процесс создания бота в Telegram на Python. В качестве примера создадим Telegram-бот компании Timeweb Cloud, который будет приветствовать пользователя и предлагать ему перейти на сайт компании.
В первую очередь зарегистрируйте бота в Telegram. Для этого введите в поисковой строке мессенджера @BotFather и перейдите к нему, как это показано на картинке ниже.
После нажмите кнопку «Запустить» в нижней части окна и выберите в открывшемся списке команду /newbot
. Бот предложит указать имя создаваемого бота. В нашем случае укажем TimewebCloudBot, и его же продублируем в качестве короткого имени.
После этого бот будет создан.
Надежно сохраните токен бота — в будущем он понадобится для авторизации и работы с ботом.
Переходим к подготовке необходимых компонентов. На вашем компьютере должен быть установлен Python и среда разработки (в нашем случае это PyCharm).
Установить Python на Windows 10 можно по нашей инструкции, а после скачать PyCharm с сайта разработчика и установить его.
В качестве библиотеки мы будем использовать pyTelegramBotAPI. Установить ее можно, с помощью следующей команды:
pip install pyTelegramBotAPI
Все необходимые компоненты установлены. Переходим к следующему шагу.
Cloud server
В первую очередь подключите установленную библиотеку и уникальный токен, о котором мы говорили выше, а также импортируйте типы, которые потребуются для работы кнопок (о них расскажем немного позже).
import telebot
botTimeWeb = telebot.TeleBot('Уникальный токен')
from telebot import types
Вместо Уникальный токен
укажите токен, который вы получили при регистрации бота. Кавычки необходимо сохранить.
Теперь реализуем так называемые обработчики сообщений. Они отвечают за фильтрацию входящих сообщений бота и вызов указанной функции для этих сообщений.
С помощью кода ниже реализуйте команду /start
, которая будет отвечать за запуск бота:
@botTimeWeb.message_handler(commands=['start'])
def startBot(message):
first_mess = f"<b>{message.from_user.first_name} {message.from_user.last_name}</b>, привет!\nХочешь расскажу немного о нашей компании?"
markup = types.InlineKeyboardMarkup()
button_yes = types.InlineKeyboardButton(text = 'Да', callback_data='yes')
markup.add(button_yes)
botTimeWeb.send_message(message.chat.id, first_mess, parse_mode='html', reply_markup=markup)
Разберем написанный выше код по порядку.
Первые две строчки объявляют метод обработки входящих сообщений. В нашем случае в качестве параметра передается команда /start
.
Далее объявляется переменная first_mess
, хранящая указанную строку. Она будет отображаться пользователю после вызова команды /start
. Здесь также используется объект Message
, необходимый для определения имени (first_name
) и фамилии (last_name
) пользователя.
Далее следуют 3 строчки кода, отвечающие за добавление кнопки, которая в будущем будет перенаправлять пользователя на следующее сообщение. Тип данной кнопки — Inline. Это значит, что такая кнопка будет отображаться прямо под сообщением. Для ее создания необходимо использовать метод InlineKeyboardButton
. Параметр text
отвечает за имя кнопки, а callback_data
— за возвращаемую строку при нажатии. Второй параметр понадобится для реализации функционала кнопки.
И наконец, добавляется метод send_message
, необходимый для отправки сообщения пользователю. У него указаны 4 параметра:
message.chat.id
отвечает за синхронизацию сообщения с чатом бота;first_mess
передает ранее указанное сообщение;parse_mode
необходим для указания режима разметки сообщений;reply_markup
отвечает за добавление созданной кнопки.Сейчас кнопка создана, но при ее нажатии ничего не происходит. Необходимо реализовать её функционал. Для этого используем следующий фрагмент кода:
@botTimeWeb.callback_query_handler(func=lambda call:True)
def response(function_call):
if function_call.message:
if function_call.data == "yes":
second_mess = "Мы облачная платформа для разработчиков и бизнеса. Более детально можешь ознакомиться с нами на нашем сайте!"
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Перейти на сайт", url="https://timeweb.cloud/"))
botTimeWeb.send_message(function_call.message.chat.id, second_mess, reply_markup=markup)
botTimeWeb.answer_callback_query(function_call.id)
В начале объявляется метод для обработки запросов обратного вызова. Выполняется проверка на соответствие строки, указанной после ==
и возвращенной после нажатия кнопки. Так как ранее мы указали значение параметра callback_data = 'yes'
, то проверка пройдет успешно.
После проверки реализован функционал кнопки. Переменная second_mess
хранит текст ответного сообщения. А далее описана реализация кнопки, которая хранит ссылку на сайт компании Timeweb Cloud.
Последним шагом будет указать боту на то, что обработка команды закончена. Для этого указываем команду answer_callback_query
.
После всех методов необходимо добавить последнюю строчку, которая отвечает за непрерывное продолжение работы бота:
botTimeWeb.infinity_polling()
В итоге у вас должен получиться код со следующей структурой и содержимым:
Бот создан. Сохраните файл с кодом и переходите к его запуску.
Откройте терминал и выполните запуск проекта:
python main.py
Теперь бот запущен, можно переходить в Telegram и тестировать его.
Для дополнительной безопасности и стабильности рекомендуется запускать бота на виртуальном сервере. Арендовать надежный облачный сервер можно на Timeweb Cloud.
Откроем Telegram и перейдем к созданному боту, используя поиск и короткое имя, которое указывалось на первом шаге.
Для начала работы нажмем «Запустить» внизу экрана.
Бот обработает команду и выведет приветственное сообщение.
Для продолжения работы с ботом нажмем кнопку под сообщением.
Бот среагирует на нажатие кнопки и выведет следующее сообщение. Под ним также отображается кнопка, которая содержит ссылку на сайт компании. Проверим ее работоспособность.
В ответ на нажатие кнопки бот предложит перейти по ссылке. Нажимаем «Перейти» и переходим на сайт компании.
Запустите бота на облачном сервере Timeweb Cloud
Мы рассмотрели, как создать бота в Telegram на Python пошагово — от его регистрации до запуска. Вы можете не останавливаться на достигнутом, а подробно изучить возможности используемой библиотеки и продолжить наполнять свой первый бот необходимым функционалом.
Как изменить размер кнопок?
Как сделать так чтобы сообщения бота заменялись на следующее сообщение, что бы не было предыдущего сообщения
Во время запуска бота появляется ошибка: File "C:\Users\КХМ КХМ\Desktop\КХМ КХМ\main_bot.py", line 17 def response(function_call): IndentationError: unexpected unindent
Вот код: import telebot
botTimeWeb = telebot.TeleBot('тут был токен')
from telebot import types
@botTimeWeb.message_handler(commands=['start']) def startBot(message): first_mess = f"<b>{message.from_user.first_name} {message.from_user.last_name}</b>, привет!\ntest?" markup = types.InlineKeyboardMarkup() button_yes = types.InlineKeyboardButton(text = 'Да', callback_data='yes') markup.add(button_yes) botTimeWeb.send_message(message.chat.id, first_mess, parse_mode='html', reply_markup=markup) @botTimeWeb.callback_query_handler(func=lambda call:True)
def response(function_call): if function_call.message: if function_call.data == "yes": second_mess = "test!" markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton("test", url="Кхм-Кхм")) botTimeWeb.send_message(function_call.message.chat.id, second_mess, reply_markup=markup) botTimeWeb.answer_callback_query(function_call.id) botTimeWeb.infinity_polling()
Прошу помочь
python main.py эту команду надо вводить в скачанный Python 3.10, если да то мне пишет SyntaxError: invalid syntax
Почему бот не отправляет мне заявку после нажатия на кнопку Написать заявку, а продолжает сверять имя пользователя
Здравствуйте! Попробуйте добавить следующее условие в
handle_message
:Чтобы получилось:
Здравствуйте, переписал код 1 в 1, нажал старт в боте, бот написал сообщение, но кнопки inline нет, хотя в настройках bot Father он включен
Добрый день! Если один в один, то все должно работать :thinking_face: Пришлите, пожалуйста, свой код целиком — посмотрим.
После активации main.py файл на секунду появляется и закрывается
починил уже
когда я ввожув кмд python main.py, ничего не происходит, путь указан правильно, ошибок не появляется, просто ничего не происходит, что с этим делать?
Добрый день! Проверьте, что в коде бота есть директива
botTimeWeb.infinity_polling()
— при ее отсутствии сервер Телеграм не слушает поступающие команды и не дает ответы. Ее добавление описано на Шаге 3, в самом конце подраздела.что это????
Добрый день! Первая ошибка указывает на то, что в сообщении, отправляемом через Telegram API, есть проблема с разметкой HTML - "Unsupported start tag «3» at byte offset".
Все остальные ошибки, скорее всего, вызваны ошибкой выше. Проверьте, что у вас используются только поддерживаемые HTML-теги.
здравствуйте а как например дополнительно прикрепить фото к этому тексту ? second_mess = "Мы облачная платформа для разработчиков и бизнеса. Более детально можешь ознакомиться с нами на нашем сайте!"
Добрый день! Чтобы прикрепить фото к текстовому сообщению, нужно отправить изображение с подписью, содержащей ваш текст и кнопки. Для этого измените ваш текущий обработчик
callback_query_handler
, а именно:Добавьте переменную
photo_url
:Замените метод
send_message
наsend_photo
со следующими параметрами:Здесь
photo_url
— это URL нашей фотографии, аcaption
— это подпись к фотографии (second_mess
).Для наглядности — изменения кода на скриншоте.
Здравствуйте, я переписал ваш код но он все равно не работает. Терминал жалуется на «telebot», выдает ошибку о том что такого не существует. И еще вопрос вместо названия вашего сервиса в коде нужно вводить название моего бота?
Добрый день! Если у вас возникает ошибка, связанная с отсутствием модуля
telebot
, скорее всего библиотекаpyTelegramBotAPI
не установлена в вашем проекте PyCharm. Для решения этой проблемы выполните следующие шаги:TelegramBotAPI
и нажмите «Install Package».В коде Python, который управляет вашим Telegram-ботом, переменная, содержащая экземпляр бота, может быть названа как угодно. Это никак не влияет на функциональность. А вот токен бота, полученный от @BotFather в Telegram, должен быть уникальным. Не забудьте поменять его в скопированном коде.
No such file or directory вылетает в терминале после команды python main.py
Добрый день! Ошибка "No such file or directory" указывает на то, что интерпретатор Python не может найти файл
main.py
в текущей директории, из которой вы пытаетесь запустить команду.Возможные пути решения:
main.py
. Если это не так, то воспользуйтесь командойcd
для перемещения в правильную директорию.main.py
.Добрый день,помогите пожалуйста. Ввожу код,нажимаю старт и бот выдаёт сообщение как нужно,но когда нажимаю на инлайн кнопку ничего не происходит и в консоле пишет
вот код,помогите пожалуйста
Добрый день! Необходимо добавить параметр
callback_data
для кнопки «Самый кайфовый трек»:Проблема с неработающей кнопкой
project
не была напрямую связана с этой кнопкой. На самом деле, сложность возникла из-за отсутствия параметраcallback_data
у кнопки «Самый кайфовый трек», которая добавлялась в ответное сообщение после выбораproject
. Telegram требует, чтобы каждая кнопка во встроенной клавиатуре имелаcallback_data
или другой параметр, определяющий её функцию. Добавлениеcallback_data='track'
к этой кнопке решает проблему, позволяя Telegram корректно обрабатывать и отображать встроенную клавиатуру.Здравствуйте, я переписал в точь-в-точь как у Вас, но мне выдает ошибку "Traceback (most recent call last):", и дальше ниже идут ошибки. Что мне делать?
Добрый день! Сообщение об ошибке «Traceback (most recent call last)» появляется в случае, когда интерпретатор Python сталкивается с проблемой, которую он не может обработать, и начинает выводить путь, по которому возникла ошибка. Следующие строки после этого сообщения будут содержать детальную информацию о том, где именно в коде возникла ошибка, поэтому тщательно изучите их.
Если вы не сможете самостоятельно решить проблему, пожалуйста, предоставьте точное сообщение об ошибке, которое вы видите после строки «Traceback (most recent call last):». Это поможет определить проблему и предложить конкретное решение.
Также убедитесь, пожалуйста, что библиотека pyTelegramBotAPI установлена и обновлена до последней версии.
Здравствуйте а если закрыть среду разработки бот будет работать?
Добрый день! Бот, запущенный на локальной машине, перестанет работать, если вы закроете среду разработки или выключите компьютер. Чтобы бот работал постоянно, его нужно развернуть на сервере, который будет работать непрерывно.
Помогите пожалуйста Вот код:
В терминале ввожу python main.py, но ничего не работает
Добрый день! Проверьте, пожалуйста, что у вас правильная структура кода. Скорее всего, вы добавили команду для непрерывной работы бота в блок кода с вложенным условием
if function_call.data == "yes"
. Прикладываем скриншот с правильной структурой.В функции startBot сделал две кнопки да/нет и в функции response проверку callback.data == yes/no в случае выбора no - выпадает ответ и кнопка "вернуться". Как реализовать возврат на стартовое сообщение при нажатии на кнопку "вернуться" ? Запустить функцию startBot не могу, т.к ей необходимо передать параметр message далее из которого берется ферстнейм и ластнейм, на что можно заменить ?
Добрый день! Чтобы реализовать возврат на стартовое сообщение при нажатии на кнопку «вернуться», вы можете просто отправить начальное сообщение с помощью новой функции
send_start_message
без вызоваstartBot
.send_start_message
— это дополнительная функция, которая будет отвечать за отправку начального сообщения с кнопками в чате. Она вызывается в функцииstartBot
при обработке команды/start
. При этом, она должна принимать параметрыchat_id
,first_name
иlast_name
, чтобы формировать начальное сообщение для конкретного пользователя. После созданияsend_start_message
, вы можете вызвать ее из функцииresponse
для кнопки «вернуться».как исправить эту ошибку?
Добрый день! Токен необходимо обернуть кавычками, чтобы получилось:
Отдельно уточнили этот момент в статье 👌
не работает скопировал всё отредактировал как надо и нет пишет что команда pip не найдена(я и сам такой не знаю) install тоже самое может я тупой может лыжи не едут я хз
виртуалку нормально поставь анскилл
pip пропиши сначала в среде
Добавили в инструкцию ссылку на гайд по установке необходимой библиотеки ????