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{ок: праўда, вынік: {ідэнтыфікатар: 231757398, first_name: "Бот абменнага курсу", імя карыстальніка: "exchangetestbot" }}

Вынік будзе атрыманы, калі ok ўраўноўваецца праўда. У адваротным выпадку сістэма пакажа памылку.

Ёсць два спосабу атрымаць карыстальніцкія паведамленні ў ботаў. Абодва спосабу эфектыўныя, але падыходзяць у розных выпадках. Каб атрымаць паведамленні, вы можаце ўручную напісаць запыт метадам getUpdates – праграма адлюструе на экране масіў дадзеных Update. Запыты павінны адпраўляцца рэгулярна, пасля аналізу кожнага масіва адпраўка паўтараецца. Зрушэнне - гэта параметр, які вызначае колькасць прапушчаных запісаў перад загрузкай новага выніку, каб пазбегнуць паўторнага з'яўлення адзначаных аб'ектаў. Перавагі метаду getUpdates уступяць у гульню, калі:

  • няма магчымасці наладзіць HTTPS;
  • выкарыстоўваюцца складаныя мовы сцэнарыяў;
  • сервер бота час ад часу мяняецца;
  • бот загружаны карыстальнікамі.

Другі метад, які можна запісаць для атрымання паведамленняў карыстальнікаў, - setWebhook. Выкарыстоўваецца адзін раз, не трэба пастаянна адпраўляць новыя запыты. Вэбхук адпраўляе абнаўленні даных на ўказаны URL. Гэты метад патрабуе сертыфіката SSL. Webhook будзе карысны ў наступных выпадках:

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

У далейшых інструкцыях мы будзем выкарыстоўваць 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 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:"грн", купля:"25.90000", продаж:"26.25000" }, { ccy:"Еўра", base_ccy:"грн", купля:"29.10000", продаж:"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).

імпартаваць telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Давайце выкарыстаем змесціва pyTelegramBotApi для стварэння бота. Мы адпраўляем атрыманы токен з дапамогай наступнага кода:

бот = 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.' )

РџСЂРё каманды=['пачаць'] роўна 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) Бот падтрымлівае інлайн. Увядзіце @ у любым чаце і першыя літары валюты.', 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): клавіятура = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Абнаўленне', 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( розн.)[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(query) акрамя ValueError: пропуск

Калі t роўна u, вам трэба будзе напісаць праграму для метаду edit_message_callback. Давайце разбяром гэты працэс крок за крокам:

  1. Загрузка актуальнай інфармацыі аб стане валютнага рынку (exchange_now = pb.get_exchange(data['c']).
  1. Напісанне новага паведамлення праз серыялізатар з розн.
  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( тэкст, 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 { 'купіць': exc_json['b'], 'продаж': exc_json['s']}

Вам спатрэбіцца яшчэ некалькі метадаў: напрыклад, get_exchange_diff, які счытвае старую і новую інфармацыю аб кошце валют і адлюстроўвае розніцу.

def get_exchange_diff(апошні, зараз): 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='Пераўтварыць ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) вярнуць вынік

Цяпер, калі вы пішаце @ і прабел у радку, на экране з'явяцца вынікі пошуку - варыянты канвертацыі ў тры даступныя валюты.

Telegram бот на Python. Поўнае кіраўніцтва па напісанню бота з абменнымі курсамі з нуля

Карыстальнікі могуць фільтраваць вынікі, уводзячы патрэбную валюту.

Пасля націску на патрэбную валюту са спісу чат атрымлівае тое ж паведамленне, што і карыстальнікі бота. Вы таксама можаце выкарыстоўваць кнопку Абнавіць. На малюнку ніжэй паказана абноўленае паведамленне, адпраўленае праз бота:

Telegram бот на Python. Поўнае кіраўніцтва па напісанню бота з абменнымі курсамі з нуля

заключэнне

Цяпер вы ведаеце, як стварыць бота для Telegram. Вы можаце дадаць у сваю праграму карысныя інструменты: кнопкі для абнаўлення і адпраўкі выніку іншым карыстальнікам мессенджера і ўбудаваны рэжым, які дазваляе выкарыстоўваць функцыі бота па-за чатам з ім. На аснове гэтай інструкцыі вы можаце стварыць любога простага бота з іншымі функцыямі - не толькі той, які будзе паказваць курсы валют. Не бойцеся эксперыментаваць з бібліятэкамі, API і кодам, каб стварыць аўтаматызаванага памочніка, які будзе мець зносіны з кліентамі ў Telegram і ўмацоўваць сувязь зацікаўленых людзей з кампаніяй.

1 Каментарыі

Пакінуць каментар