Python → Делаем простого телеграм бота на Python

В этой статье я покажу как сделать простого бота для Телеграм, который умеет конвертировать валюту. 

У вас должен быть установлен Python 3.  Если нет, то вы можете прочитать здесь как это сделать на Windows.

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

Как работает Телеграм бот

Эта диаграмма показывает как все элементы друг с другом взаимодействуют. Люди находят вашего бота в телеграме и пишет ему. Все их сообщения сначала попадают на сервер Телеграма. Если ваша программа-бот запущен, то он будет получать эти сообщения.

Очень важно!

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

И так, начинаем

Оглавление

1. Регистрация бота

2. Первые слова бота

3. Конвертацию валют

 

 

1. Регистрация бота

Бота нужно сначала создать и зарегисрировать в Телеграме. Для этого существует отец все ботов(BotFather), который создает их. 

Откройте Телеграм и найдите через Поиск бота BotFather. 

Делаем Телеграм бота на Python

Вы найдете много чего с таким названием. Вам нужен тот, что с галочкой синей. Выберите этого бота и запустите нажав на кнопку "Start". BotFather вам покажет все свои команды, используя которые, вы будете потом управлять своими ботами. 

Для создания нового бота, вам нужно нажать на команду /newbot или вы можете сразу написать ему так. Вас попросят дать название своему боту. 


Делаем Телеграм бота на Python

 

Здесь вы можете ввести любое имя. Имя можно потом изменить. Я назову своего бота "Валютный бот". После ввода имени нужно придумать уникальный ник для бота(username). Этот ник должен быть на английском и всегда заканчиваться на слово Bot. И еще там не должно быть пробелов. Имейте ввиду, что все популярные названия уже заняты кем-то другим. Поэтому я назову Currency005Bot. 

 

Делаем Телеграм бота на Python

 

 Когда вы придумаете username для бота. Вам покажут такое сообщение, о том что бот успешно зарегистрирован:

 

Делаем Телеграм бота на Python

В самом начале есть ссылка на вашего бота, начинающаяся на t.me/. Нажав на нее вы перейдете к вашему боту. Также эту ссылку можно отправлять всем.

А красным цветом внизу написан токен вашего бота. Этот токен как пароль от вашего бота. Его не нужно никому сообщать. Мы будем использовать его при написании программы для бота. 

У вас официально есть бот! Конечно, он пока ничего не умеет. Только родился. 

 

2. Первое слово бота

Чтобы продолжить дальше, вам нужно научиться работать в Командной строке. Вы можете прочитать статью Работа в терминале в Windows, Linux и MacOS (cli, shell, bash, cmd).

Перед тем как начать учить нашего бота говорить, попробуем что нибудь сделать на языке Python. 

Откройте ваш любимый редактор кода (Sublime Text, PyCharm, Notepad++, Idle и т.п.). Создайте новый пустой файл. Сохраните его с названием bot.py в любую папку(желательно не слишком глубоко, а для начала можно сразу в корне диска С: ). 

В этом файле будет написана наша программа для бота. Давайте для начала напишем простую программу, которая печатает текст "Hello World!". Для этого напишите в файле:

print("Hello world!")

Сохраните файл. 

Теперь попробуем запустить его. Откройте Командную строку(Windows) или Terminal(Linux, Mac). Использую команду cd перейдите в папку, где вы сохранили файл bot.py

Эта команда выходит из текущий папки в родительскую папку:

cd ..

А эта команда переходит в указанную папку(например Projects):

cd Projects

Если вы перешли в папку с файлом bot.py, теперь мы можем его запустить. Напишите в командной строке:

python bot.py

И нажмите Enter. Ваша программа запустится и напечатает "Hello, World!". Мы умеем запускать программы на Python 😎. 

Команда print() в языке Python печатает текст на экране. А в скобках нужно указать что именно нужно напечатать. Наш текст для печати мы указали в кавычках. В Python в кавычках записывает любые текстовые данные. И текстовые данные называются строкой или string. 

Кроме текстовых данных есть еще числовые данные. И команда print() также умеет их тоже печатать:

print(144.23)

Как вы заметили для чисел кавычки не нужны. 

Переменные

Переменные в программировании это временные хранилища данных, т.е. они могут сохранять в себе какое-либо значение. И записываются они как в математике:

x = "Hello World"

print(x)

Мы сначала сохранили в переменной х строку "Hello world" а потом распечатали x. Если вы сохраните такой файл и запустите его снова в командной строке командой:

python bot.py

То вы увидите что программа напечатала на экран не "х", а "Hello World". Потому x - это переменная, которая хранит в себе значение "Hello World". 

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

Скачиваем библиотеку для создания бота

Чтобы написать бота в Python, нам нужно скачать библиотеку(или пакет) python-telegram-bot для Python. Библиотеки - это дополнительные ресурсы для Python, которые улучшают его способности. Если Python что-то не умеет, вы можете скачать ему библиотеку и он научится как это делать 📚. 

Чтобы скачать библиотеку мы будем использовать команду pip. А Pip - это штучка, которая умеет скачивать библиотеки и удалять их. Его еще называют Пакетным менеджером

Откройте командную строку и напишите:

pip install python-telegram-bot

После этого вы увидите много непонятного текста в командной строке и в конце где-то будет написано 

Successfully installed python-telegram-bot-12.6.1

Значит успешно установлено. Теперь мы можем использовать его. 

Пишем программу для бота

Откройте ваш код и удалите все что вы там написали. И для начала создайте переменную token и присвойте этой переменной токен вашего бота. Помните? Когда мы создавали бота, BotFather отправил нам красный токен. У вас будет примерно так:

token = "802414251:AAGGRWasfg8UmXVJPk79zNdjBQG3w33mvGE"

Токен это строка, поэтому она в кавычках. Здесь мой токен, а вы используйте свой. 

Теперь мы подключим разные классы(классные штучки) с библиотеки телеграма, чтобы использовать их в своей программе. Уберите токен вниз и в самой первой строчке напишите:

from telegram.ext import Updater, CommandHandler

Мы подключили два класса: Updater и MessageHandler. В языке Python имеет значение регистр букв(заглавные, строчные буквы). Обязательно нужно писать именно так. 

Updater - это объект, который умеет связываться с сервером телеграма и получать от него обновления, т.е. новые сообщения от пользователей. Он после запуска всегда слушает сервер Телеграма. 

а про CommandHandler расскажу чуть ниже. 

Давайте создадим новый объект Updater и запустим его. Создается он вот так:

updater = Updater(token, use_context=True)

Мы создали новый Updater и сохранили его в переменную с именем updater. (Переменные умеют еще и объекты разные хранить.) При создании мы указали токен нашего бота, чтобы он используя этот токен мог получать сообщения именно для нашего бота. А про use_context=True я расскажу в другой раз. Пока просто напишите так.

Теперь запускаем Updater:

updater.start_polling()
updater.idle()

Первая строчка запускает, а вторая строчка ждет пока вы нажмете Ctrl+C, а когда нажмете завершает работу бота. 

Сейчас ваш код должен выглядеть примерно таким:

from telegram.ext import Updater, CommandHandler

print("Бот запущен. Нажмите Ctrl+C для завершения")

token = "802414251:AAGGRWasfg8UmXVJPk79zNdjBQG3w33mvGE"

updater = Updater(token, use_context=True)

updater.start_polling()
updater.idle()

я незаметно добавил строчку print("Бот запущен. Нажмите Ctrl+C для завершения"). Вы тоже добавьте. Пора попробовать запустить бота. Сохраните файл. И запустите его: 

C:~/projects/sandbox/PythonCourses>python bot.py
Бот запущен. Нажмите Ctrl+C для завершения

Хотя бот запущен, он все равно ничего не имеет. Какой бесполезный бот! Нажмите Ctrl+C чтобы завершить его работу. Обычно завершение занимает 3-5 секунд. 

Добавляем обработчик команды

У ботов есть команды. Они начинаются со знака / (слэш).  Например: /newbot, /start. У каждого бота они свои. Но у всех есть команда /start, которая запускается когда кто-то начинает чат с ботом.

Мы сейчас сделаем так, чтобы наш бот представлялся, когда кто-то пишет ему команду /start. Для этого нам нужно создать обработчик для команды start. Такой обработчик создается с помощью класса CommandHandler.  

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

Мы скажем этому диспетчеру, что у нас есть новый обработчик для команды start:

dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler("start", on_start))

Другие команды могут быть добавлены так же. В кавычках нужно поменять название команды. 

А вот второй параметр on_start - что это такое? Это функция-обработчик. Функция в программирование  - это мини программа внутри программы, которую можно переиспользовать. Подробнее расскажу как-нибудь в другой раз. 

Для обработки команды будет запущена функция on_start. Теперь создадим эту функцию:


def on_start(update, context):
	pass

Этот код должен быть чуть выше предыдущего кода. И обратите внимание, что в конце есть двоеточие и внутренности функции пишутся через один TAB(клавиша слева для добавления отступа). А pass значит что ничего не нужно делать. 

У этой функции есть два параметра:

update - это обновление, которое пришло с сервера.(в нем есть сообщение, информация о чате, о пользователе)
context - в этом объекте хранятся все важные данные бота. 

Внутри этой функции мы должны ответить в чат текстом "Привет, я Валютный бот". При отправке мы обязательно должны указать идентификатор чата(chat_id). А информацию о чате мы получим его из объекта update и сохраним в переменную chat.

def on_start(update, context):
	chat = update.effective_chat
	context.bot.send_message(chat_id=chat.id, text="Привет, я Валютный бот")

После получение информации о чате, мы отправляем сообщение использую функцию бота send_message указывая id чата и текст. В итоге у вас должен получиться такой код:

from telegram.ext import Updater, CommandHandler

print("Бот запущен. Нажмите Ctrl+C для завершения")

def on_start(update, context):
	chat = update.effective_chat
	context.bot.send_message(chat_id=chat.id, text="Привет, я Валютный бот")


token = "802414251:AAGGRWasfg8UmXVJPk79zNdjBQG3w33mvGE"

updater = Updater(token, use_context=True)

dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler("start", on_start))

updater.start_polling()
updater.idle()

Сохраните код, перейдите в командную строку и перезапустите вашего бота. 

Откройте бота в Телеграме и напишит ему /start  и вы услышите первые слова вашего бота.

 

3. Конвертация валюты

Наш бот умеет здороваться. Но, если вы ему напишете что нибудь другое, он ничего не ответит. Так как умеет отвечать только на команду start. 

Давайте сделаем так, чтобы он на любое другие сообщение отвечал каким-нибудь предложением.

Для этого нам нужен еще один обработчик. В прошлый раз мы использовали CommandHandler, в этот раз мы будем использовать MessageHandler. Этот обработчик умеет отвечать на любые сообщения. Подключается он также: 

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

Я также добавил Filters - с помощью него можно указывать какие сообщения должен обрабатывать обработчик. 

Теперь сообщаем диспетчеру о новом обработчике:

dispatcher.add_handler(MessageHandler(Filters.all, on_message))

У этого обработчика указывается фильтр. Мы указали что фильтровать не нужно, что нужно отвечать на все сообщения(all). Для обработки сообщения будет использована функция on_message. 

Чуть выше мы объявим эту функцию:

def on_message(update, context):
	chat = update.effective_chat
	context.bot.send_message(chat_id=chat.id, text="Напишите число для перевода")

Как вы, наверное, заметили эта функция очень похожа на функцию on_start. Единственное, что эта пишет пользователю "Напишите число для перевода"

Давайте попробуем сохранить файл и перезапустить бота. Теперь бот на любое сообщение отвечает одинаково:

 

Делаем Телеграм бота на Python

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

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

В Python есть выражение try, которое позволяет проверить какой-либо участок кода на ошибку. Если ошибок нет, то код выполнится. Если есть ошибка, то этот участок кода прекратит свое выполнение и перейдет в другой участок кода, который написан после слова except. Вот так:

def on_message(update, context):
	chat = update.effective_chat
	text = update.message.text
	try:
		number = float(text)
	except:
		context.bot.send_message(chat_id=chat.id, text="Напишите число для перевода")

В третьей строчке мы получили текст из сообщения пользователя и сохранили в переменной text. После try и except внутренние участки кода пишутся с дополнительным отступом слева в 1 TAB. 

Внутри блока try мы пробуем перевести текст в числовой тип (float) и сохранить в переменную number. Мы получили число. Теперь попробуем сконвертировать его. В нашем примере мы будем конвертировать с долларов на сомы. Возьмем текущий курс 80.34. Этот курс мы сохраним в переменную rate и затем вычислим сомы:

def on_message(update, context):
	chat = update.effective_chat
	text = update.message.text
	try:
		number = float(text)
		rate = 80.34
		soms = number * rate
		context.bot.send_message(chat_id=chat.id, text=str(soms) + " сом")
	except:
		context.bot.send_message(chat_id=chat.id, text="Напишите число для перевода")

Функция float() переводит строку в число, а функция str переводит число в строку. А если две строки сплюсовать, то они просто объединятся. Поэтому в этом случае пользователь увидит что нибудь такое: "23 сом". Так давайте узнаем это, сохранив код и перезапустив бота. 

 

Делаем Телеграм бота на Python

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

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

message = "$%.2f = %.2f сом" % (number, soms)

Здесь мы использовали форматирование текст с помощью команды %. Эта команда заменит участки с процентом в тексте на значения последующих переменных number и soms. А f означает что туда нужно подставить число (float). А .2 означает что в числе нужно оставить два знака после запятого. 

Теперь в переменную message как текст сообщения:

context.bot.send_message(chat_id=chat.id, text=message)

В итоге весь ваш код должен выглядеть так:

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

print("Бот запущен. Нажмите Ctrl+C для завершения")

def on_start(update, context):
	chat = update.effective_chat
	context.bot.send_message(chat_id=chat.id, text="Привет, я Валютный бот")


def on_message(update, context):
	chat = update.effective_chat
	text = update.message.text
	try:
		number = float(text)
		rate = 80.34
		soms = number * rate
		message = "$%.2f = %.2f сом" % (number, soms)
		context.bot.send_message(chat_id=chat.id, text=message)
	except:
		context.bot.send_message(chat_id=chat.id, text="Напишите число для перевода")

token = "802414251:AAGGRWasfg8UmXVJPk79zNdjBQG3w33mvGE"

updater = Updater(token, use_context=True)

dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler("start", on_start))
dispatcher.add_handler(MessageHandler(Filters.all, on_message))

updater.start_polling()
updater.idle()

Давайте в последний раз сохраним и перезапустим бота. 

 

Делаем Телеграм бота на Python

 

Теперь наш бот умеет красиво отвечать.

На этом все! Ваш первый бот готов, вы можете создавать также других ботов. А вот документация на английском по библиотеке python-telegram-bot. Если у вас возникли вопросы по статье, что-то непонятно, пишите мне на почту: masteraalish@gmail.com . 

 

1930 0
Alisher Alikulov