Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Боты в Telegram — это программы, которые помогают установить контакт с аудиторией или упрощают действия, которые раньше приходилось выполнять вручную. Эти программы написаны специально для платформы мессенджеров. Боты работают следующим образом: пользователь отправляет команду через строку ввода, а система отвечает текстовым или интерактивным сообщением. Иногда программа даже имитирует действия реального человека — такой бот вызывает больше доверия у клиентов.

Существует несколько типов систем автоматической помощи пользователям. Некоторые боты просто общаются с клиентами, другие регулярно предоставляют информацию. Четко разделить программы на типы невозможно — разработчики часто совмещают в одном боте несколько функций.

Написать простого бота для Telegram с интерактивными элементами в виде наэкранных кнопок можно за 9 шагов. Давайте рассмотрим каждый из них подробно и ответим на несколько вопросов:

  • как запустить бота;
  • как зарегистрировать встроенную клавиатуру с одной или нескольких кнопок;
  • как запрограммировать кнопки на нужные функции;
  • что такое встроенный режим и как его настроить для существующего бота.

Шаг 0: теоретические сведения об API ботов Telegram

Основным инструментом, используемым для создания ботов Telegram, является интерфейс прикладного программирования HTML или HTML API. Этот элемент принимает запросы посетителей и отправляет ответы в виде информации. Готовые проекты упрощают работу над программой. Чтобы написать бота для Telegram, вам нужно использовать этот адрес электронной почты: https://api.telegram.org/bot/МЕТОД_ИМЯ

Для корректного функционирования бота также необходим токен — комбинация символов, которая защищает программу и открывает доступ к ней проверенным разработчикам. Каждый токен уникален. Строка присваивается боту при создании. Методы могут быть разные: getUpdates, getChat и другие. Выбор метода зависит от того, какой алгоритм ожидают от бота разработчики. Пример токена:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Боты используют запросы GET и POST. Параметры метода часто приходится дополнять — например, когда метод sendMessage должен отправить идентификатор чата и некоторый текст. Параметры для уточнения метода можно передать в виде строки запроса URL-адреса с помощью application/x-www-form-urlencoded или через application-json. Эти способы не подходят для скачивания файлов. Также требуется кодировка UTF-8. Отправив запрос к API, вы можете получить результат в формате JSON. Взгляните на реакцию программы на получение информации методом getME:

ПОЛУЧИТЬ https://api.telegram.org/bot/getMe { ok: true, result: { id: 231757398, first_name: «Бот обменного курса», имя пользователя: «exchangetestbot» } }

Результат будет получен, если ok равняется правда. В противном случае система укажет на ошибку.

Есть два способа получить персонализированные сообщения в ботах. Оба метода эффективны, но подходят в разных случаях. Для получения сообщений можно вручную написать запрос методом getUpdates — программа выведет на экран массив данных Update. Запросы необходимо отправлять регулярно, после анализа каждого массива отправка повторяется. Смещение — параметр, определяющий количество пропущенных записей перед загрузкой нового результата во избежание повторного появления проверенных объектов. Преимущества метода getUpdates вступят в силу, если:

  • нет возможности настроить HTTPS;
  • используются сложные скриптовые языки;
  • бот-сервер время от времени меняется;
  • бот загружен пользователями.

Второй метод, который можно написать для получения пользовательских сообщений, — setWebhook. Используется один раз, нет необходимости постоянно отправлять новые запросы. Вебхук отправляет обновления данных на указанный URL-адрес. Для этого метода требуется сертификат SSL. Вебхук будет полезен в следующих случаях:

  • используются языки веб-программирования;
  • бот не перегружен, пользователей не слишком много;
  • сервер не меняется, программа долгое время остается на одном сервере.

В дальнейших инструкциях мы будем использовать getUpdates.

Telegram-сервис @BotFather предназначен для создания чат-ботов. Через эту систему также задаются базовые настройки — BotFather поможет составить описание, поставить фото профиля, добавить инструменты поддержки. Библиотеки — наборы HTML-запросов для Telegram-ботов — доступны в Интернете, их довольно много. При создании примера программы использовался pyTelegramBotApi.

Шаг 1. Реализация запросов обменного курса

Сначала вам нужно написать код, выполняющий запросы. Будем использовать при написании API ПриватБанка, ниже ссылка на него: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Вам необходимо использовать эти методы в своем коде:

  • load_exchange – находит курсы валют и отображает закодированную информацию;
  • get_exchange – отображает данные о конкретной валюте;
  • get_exchanges – показывает листинг валют по образцу.

В результате код в файле pb.py выглядит так:

импорт повторных запросов на импорт import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key ): для exc в load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' для exc в load_exchange(): если re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) не имеет значения None: result.append(exc) возвращает результат

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

[ { ccy:"USD", base_ccy:"UAH", buy:"25.90000", sale:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", buy:"29.10000", sale:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", покупка:"0.37800", продажа:"0.41800" }, { ccy:"BTC", base_ccy:"USD", покупка:"11220.0384", продажа: "12401.0950" } ]

Шаг 2. Создайте бота Telegram с помощью @BotFather

Создать программу для получения сообщений и ответа на них можно с помощью сервиса @BotFather. Перейдите на его страницу в Telegram и введите команду /newbot. В чате появится инструкция, согласно которой вам нужно сначала записать имя бота, а затем его адрес. Когда учетная запись бота будет создана, на экране появится приветственное сообщение, содержащее токен. Для дальнейшей настройки используйте следующие команды:

  • /setdescription – описание;
  • /setabouttext – информация о новом боте;
  • /setuserpic – фотография профиля;
  • /setinline – встроенный режим;
  • /setcommands – описание команд.

На последнем этапе настройки мы описываем /help и /exchange. Когда все шаги выполнены, пора переходить к кодированию.

Шаг 3: Настройка и запуск бота

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

ТОКЕН = '' # замените токеном вашего ботаTIMEZONE = 'Европа/Киев' TIMEZONE_COMMON_NAME = 'Киев'

Далее создаем еще один файл с импортом написанного ранее pb.py, библиотек и других необходимых компонентов. Недостающие библиотеки устанавливаются из системы управления пакетами (pip).

импорт телеботимпорта configimport pbimport datetimeimport pytzimport jsonimport трассировка P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Давайте используем содержимое pyTelegramBotApi для создания бота. Отправляем полученный токен, используя следующий код:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

Параметр none_stop гарантирует постоянную отправку запросов. На работу параметра не повлияют ошибки метода.

Шаг 4. Напишите обработчик команды /start.

Если все предыдущие шаги выполнены правильно, бот начал работать. Программа регулярно генерирует запросы, поскольку использует метод getUpdates. Перед строкой с элементом none_stop нам нужен фрагмент кода, обрабатывающий команду /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Приветствую! Я могу показать вам курсы валют.n' + 'Чтобы узнать курсы валют, нажмите / Exchange.n' + 'Чтобы получить помощь, нажмите /help.' )

РџСЂРё команды = ['старт'] равно Истина start_command вызывается. Содержимое сообщения попадает туда. Далее вам необходимо реализовать функцию отправки_сообщение относительно конкретного сообщения.

Шаг 5. Создайте обработчик команды /help.

Команда /help может быть реализована в виде кнопки. Нажав на нее, пользователь попадет в Telegram-аккаунт разработчика. Дайте кнопке имя, например «Спросить разработчика». Установите для метода send_message параметр Answer_markup, который перенаправляет пользователя на ссылку. Пропишем в код параметр, создающий клавиатуру (InlineKeyboardMarkup). Вам понадобится только одна кнопка (InlineKeyboardButton).

Окончательный код обработчика команды выглядит следующим образом:

@bot.message_handler(commands=['help']) def help_command(message): клавиатура = telebot.types.InlineKeyboardMarkup() клавиатура.add( telebot.types.InlineKeyboardButton( 'Спросите разработчика', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Чтобы получить список доступных валют, нажмите /exchange.n' + '2) Нажмите на интересующую вас валюту.n' + '3) Вы получит сообщение, содержащее информацию об исходной и целевой валютах, ' + 'курсы покупки и продажи.n' + '4) Нажмите «Обновить», чтобы получить текущую информацию о запросе. ' + 'Так же бот покажет разницу между предыдущим и текущим курсами валют.n' + '5) Бот поддерживает инлайн. Тип @ в любом чате и первые буквы валюты.', Answer_markup=keyboard )

Действие кода в чате Telegram:

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Шаг 6. Добавление обработчика команды /exchange

Этот шаг нужен для отображения в чате кнопок с символами доступных валют. Экранная клавиатура с опциями поможет вам избежать ошибок. ПриватБанк предоставляет информацию по рублю, доллару и евро. Параметр InlineKeyboardButton работает следующим образом:

  1. Пользователь нажимает на кнопку с нужным обозначением.
  2. getUpdates получает обратный вызов (CallbackQuery).
  3. Становится известно, как обрабатывать нажатия на клавиатуру — передается информация о нажатой кнопке.

/код обработчика обмена:

@bot.message_handler(commands=['exchange']) def Exchange_command(message): клавиатура = telebot.types.InlineKeyboardMarkup() Keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) Keyboard.row( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR')) ) bot.send_message( message.chat .id, 'Нажмите на выбранную валюту:', ответить_маркуп=клавиатура )

Результат кода в Telegram:

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Шаг 7. Написание обработчика встроенных кнопок клавиатуры

Пакет pyTelegramBot Api содержит функцию декоратора @bot.callback_query_handler. Этот компонент предназначен для преобразования обратного вызова в функцию — API разворачивает и воссоздает вызов. Оно пишется так:

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query)

Давайте также напишем метод get_ex_callback:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

Есть еще один полезный метод — answer_callback_query. Это помогает снять нагрузку между нажатием кнопки и отображением результата на экране. Вы можете отправить сообщение в send_exchange_query, передав код валюты и сообщение. Напишем send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'ввод') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id,serialize_ex(ex), Answer_markup=get_update_keyboard(ex) ), parse_mode='HTML' )

Пока чат-бот получает результат запроса от банка API, посетитель видит надпись «набирает сообщение». Похоже, отвечает реальный человек. Для отображения такого индикатора на экране потребуется добавить строки состояния ввода. Далее воспользуемся get_exchange — с его помощью программа получит обозначение валюты (рубли, евро или доллары). send_message использует дополнительные методы: Serialize_ex конвертирует валюту в другой формат, а get_update_keyboard устанавливает программные клавиши, которые обновляют информацию и отправляют данные валютного рынка в другие чаты.

Давайте напишем код для get_update_keyboard. Следует упомянуть две кнопки – t и e означают тип и обмен. Элемент switch_inline_query для кнопки «Поделиться» нужен для того, чтобы пользователь мог выбирать из нескольких чатов. Посетитель сможет выбрать, кому отправить текущий курс доллара, рубля или евро.

def get_update_keyboard(ex) b': ex['купить'], 's': ex['продажа'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy'])) вернуть клавиатуру

Иногда нужно посмотреть, насколько изменился курс валюты за короткое время. Напишем два метода для кнопки «Обновить», чтобы пользователи могли видеть курсы в сравнении.

Разница между обменными курсами передается сериализатору через параметр diff.

Прописанные методы работают только после обновления данных, на первое отображение курса они не повлияют.

def seriesize_ex(ex_json, diff=None): результат = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Купить: ' + ex_json['buy'] if diff: result += ' ' +serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Продать: ' + ex_json['sale'] + ' ' +serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: результат = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: result = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)' возвращаем результат

Представьте, что посетитель захотел узнать курс доллара. Вот что произойдет, если вы выберете доллары США в сообщении:

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Шаг 8. Реализация обработчика кнопки обновления

Напишем код обработки действий с кнопкой Обновить и добавим в него часть iq_callback_method. Если элементы программы начинаются с параметра get, необходимо написать get_ex_callback. В других ситуациях мы парсим JSON и пытаемся получить ключ t.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: попробуйте: if json.loads(data)[ 't'] == 'u': edit_message_callback(query), кроме ValueError: pass

Если t равно u, вам нужно будет написать программу для метода edit_message_callback. Давайте разберем этот процесс шаг за шагом:

  1. Загрузка актуальной информации о состоянии валютного рынка (exchange_now = pb.get_exchange(data['c']).
  1. Запись нового сообщения через сериализатор с помощью diff.
  2. Добавление подписи (get_edited_signature).

Если исходное сообщение не изменится, вызовите метод edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] Exchange_now = pb.get_exchange(data['c']) text = seriesize_ex( Exchange_now, get_exchange_diff( get_ex_from_iq_data(data), Exchange_now) ) + 'n' + get_edited_signature(), если query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, report_markup=get_update_keyboard(exchange_now), parse_mode='HTML' ) elif query.inline_message_id : bot.edit_message_text( text, inline_message_id=query.inline_message_id, report_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Давайте напишем метод get_ex_from_iq_data для анализа JSON:

def get_ex_from_iq_data(exc_json): return { 'купить': exc_json['b'], 'продажа': exc_json['s'] }

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

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(now['buy']) - float(last['buy']))) }

Последний, get_edited_signature, показывает время последнего обновления курса.

def get_edited_signature(): return 'Обновлено ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

В результате обновленное сообщение от бота со стабильным курсом выглядит так:

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

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

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Шаг 9: Реализация встроенного режима

Встроенный режим нужен для быстрой отправки информации из программы в любой чат – теперь вам не нужно добавлять в беседу бота в качестве участника. Когда пользователь Telegram вводит имя бота со знаком @ перед ним, над строкой ввода должны появиться параметры преобразования. Если нажать на один из пунктов, бот отправит в беседу сообщение с результатами и кнопками обновления и отправки данных. Имя отправителя будет содержать подпись «через ».

InlineQuery передается в query_text через библиотеку. В коде используется функция answer_line для получения результатов поиска в виде массива данных и элемента inline_query_id. Мы используем get_exchanges, чтобы бот по запросу находил несколько валют.

@bot.inline_handler(func=lambda query: True) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Мы передаем массив данных в get_iq_articles, чтобы вернуть объекты из InlineQueryResultArticle через этот метод.

def get_iq_articles(exchanges): result = [] для exc в обменах: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent (serialize_ex(exc), parse_mode='HTML'), Answer_markup=get_update_keyboard(exc),description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], Thumb_height=1 ) ) вернуть результат

Теперь, если вы напишете @ и пробел в строке, на экране появятся результаты поиска – варианты конвертации в три доступные валюты.

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Пользователи могут фильтровать результаты, введя желаемую валюту.

После нажатия на нужную валюту из списка в чат приходит то же сообщение, что и пользователи бота. Вы также можете использовать кнопку «Обновить». На изображении ниже показано обновленное сообщение, отправленное через бота:

Telegram-бот на Python. Полное руководство по написанию бота с курсами валют с нуля

Заключение

Теперь вы знаете, как создать бота для Telegram. Вы можете добавить в свою программу полезные инструменты: кнопки обновления и отправки результата другим пользователям мессенджера и встроенный режим, позволяющий использовать функции бота вне чата с ним. На основе этой инструкции вы можете создать любого простого бота с другими функциями – не только того, который будет показывать курсы валют. Не бойтесь экспериментировать с библиотеками, API и кодом, чтобы создать автоматизированного помощника, который будет общаться с клиентами в Telegram и укреплять связь заинтересованных людей с компанией.

1 комментарий

Оставьте комментарий