Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Боти в Telegram - це програми, які допомагають налагодити контакт з аудиторією або спрощують дії, які раніше доводилося виконувати вручну. Ці програми написані спеціально для платформи месенджерів. Боти працюють таким чином: користувач відправляє команду через рядок введення, а система відповідає текстовим або інтерактивним повідомленням. Іноді програма навіть імітує дії реальної людини – такий бот викликає більше довіри у клієнтів.

Існує кілька видів систем автоматичної допомоги користувачам. Деякі боти просто спілкуються з клієнтами, інші регулярно надають інформацію. Чітко розділити програми на типи неможливо – розробники часто поєднують кілька функцій в одному боті.

Написати простого бота для Telegram з інтерактивними елементами у вигляді екранних кнопок можна за 9 кроків. Розглянемо кожен з них докладніше і відповімо на кілька запитань:

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

Крок 0: теоретичні знання про API ботів Telegram

Основним інструментом, який використовується для створення ботів Telegram, є HTML Application Programming Interface або HTML API. Цей елемент приймає запити відвідувачів і надсилає відповіді у вигляді інформації. Готові дизайни спрощують роботу над програмою. Щоб написати бота для Telegram, вам потрібно використовувати цю електронну адресу: https://api.telegram.org/bot/METHOD_NAME

Для коректної роботи бота також необхідний токен – комбінація символів, яка захищає програму та відкриває до неї доступ перевіреним розробникам. Кожен жетон унікальний. Рядок призначається боту під час створення. Методи можуть бути різними: 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, результат: { id: 231757398, first_name: "Exchange Rate Bot", ім'я користувача: "exchangetestbot" } }

Результат буде отриманий, якщо ok дорівнює правда. В іншому випадку система повідомить про помилку.

Є два способи отримати власні повідомлення в ботів. Обидва способи ефективні, але підходять в різних випадках. Щоб отримати повідомлення, ви можете вручну написати запит методом getUpdates – програма виведе на екран масив даних Оновлення. Запити потрібно відправляти регулярно, після аналізу кожного масиву відправка повторюється. Зсув — це параметр, який визначає кількість пропущених записів перед завантаженням нового результату, щоб уникнути повторної появи перевірених об’єктів. Переваги методу getUpdates відображатимуться, якщо:

  • немає можливості налаштувати HTTPS;
  • використовуються складні скриптові мови;
  • сервер бота час від часу змінюється;
  • бот завантажений користувачами.

Другим методом, який можна записати для отримання повідомлень користувача, є setWebhook. Використовується один раз, не потрібно постійно надсилати нові запити. Вебхук надсилає оновлення даних на вказану URL-адресу. Для цього методу потрібен сертифікат SSL. Вебхук буде корисний у таких випадках:

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

У подальших інструкціях ми будемо використовувати getUpdates.

Телеграм-сервіс @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 re import requests 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) ): for exc in load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in 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", buy:"0.37800", sale:"0.41800" }, { ccy:"BTC", base_ccy:"USD", buy:"11220.0384", sale: "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).

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback 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.' )

РџСЂРё commands=['start'] дорівнює True викликається start_command. Туди потрапляє вміст повідомлення. Далі вам потрібно реалізувати функцію надсилання_повідомлення стосовно конкретного повідомлення.

Крок 5: Створіть обробник команд /help

Команду /help можна реалізувати як кнопку. Натиснувши на нього, користувач потрапляє в обліковий запис Telegram розробника. Дайте кнопці назву, наприклад «Запитати розробника». Установіть параметр reply_markup, який перенаправляє користувача за посиланням, для методу send_message. Запишемо в коді параметр, який створює клавіатуру (InlineKeyboardMarkup). Вам потрібна лише одна кнопка (InlineKeyboardButton).

Остаточний код обробника команд виглядає так:

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

Дія коду в чаті Telegram:

Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Крок 6. Додавання обробника команд /exchange

Цей крок потрібен для відображення в чаті кнопок із символами доступних валют. Екранна клавіатура з опціями допоможе уникнути помилок. ПриватБанк надає інформацію по курсу рубля, долара і євро. Параметр InlineKeyboardButton працює так:

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

/код обробника обміну:

@bot.message_handler(commands=['exchange']) def exchange_command(message): keyboard = 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, 'Натисніть валюту вибору:', reply_markup=клавіатура )

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

Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Крок 7: Написання обробника для кнопок вбудованої клавіатури

Пакет pyTelegramBot API містить функцію декоратора @bot.callback_query_handler. Цей компонент призначений для перетворення зворотного виклику у функцію – API розгортає та повторно створює виклик. Це пишеться так:

@bot.callback_query_handler(func=лямбда-виклик: 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, 'typing') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_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 для кнопки Share потрібен, щоб користувач міг вибирати з кількох чатів. Відвідувач зможе вибрати, кому відправити поточний курс долара, рубля або євро.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) повернути клавіатуру

Іноді потрібно подивитися, наскільки змінився курс за короткий час. Давайте напишемо два методи для кнопки «Оновити», щоб користувачі могли порівнювати курси.

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

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

def serialize_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: результат = '(' + 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">)' повертає результат

Уявіть, що відвідувач хотів дізнатися курс долара. Ось що станеться, якщо ви виберете USD у повідомленні:

Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Крок 8: Реалізація обробника кнопки оновлення

Давайте напишемо код для обробки дій із кнопкою Оновити та додамо до нього частину iq_callback_method. Коли елементи програми починаються з параметра get, ви повинні написати get_ex_callback. В інших ситуаціях ми аналізуємо JSON і намагаємося отримати ключ t.

@bot.callback_query_handler(func=лямбда-виклик: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(запит) крім ValueError: пропуск

Якщо 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 = serialize_ex( exchange_now, get_exchange_diff( get_ex_from_iq_data(data), exchange_now ) ) + 'n' + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_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, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

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

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': 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(): повернення 'Оновлено ' + 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=лямбда-запит: 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 = [] for exc in exchanges: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) повернути результат

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

Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Користувачі можуть фільтрувати результати, ввівши потрібну валюту.

Після натискання на потрібну валюту зі списку чат отримує те саме повідомлення, що й користувачі бота. Ви також можете скористатися кнопкою Оновити. На зображенні нижче показано оновлене повідомлення, надіслане через бота:

Telegram бот на Python. Повний посібник з написання бота з обмінними курсами з нуля

Висновок

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

1 Коментар

залишити коментар