Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Boti v telegrame sú programy, ktoré pomáhajú nadviazať kontakt s publikom alebo zjednodušiť akcie, ktoré sa predtým museli vykonávať manuálne. Tieto programy sú napísané špeciálne pre platformu messenger. Roboty fungujú týmto spôsobom: používateľ odošle príkaz cez vstupný riadok a systém odpovie textovou alebo interaktívnou správou. Niekedy program dokonca napodobňuje činy skutočnej osoby – takýto robot vzbudzuje u zákazníkov väčšiu dôveru.

Existuje niekoľko typov systémov na automatickú pomoc používateľom. Niektorí roboti len komunikujú so zákazníkmi, iní pravidelne poskytujú informácie. Nie je možné jednoznačne rozdeliť programy na typy – vývojári často kombinujú niekoľko funkcií v jednom bote.

Jednoduchý bot pre Telegram s interaktívnymi prvkami vo forme tlačidiel na obrazovke môžete napísať v 9 krokoch. Pozrime sa na každú z nich podrobne a odpovedzme na niekoľko otázok:

  • ako spustiť robota;
  • ako zaregistrovať vstavanú klávesnicu z jedného alebo viacerých tlačidiel;
  • ako naprogramovať tlačidlá pre požadované funkcie;
  • čo je inline režim a ako ho nastaviť pre existujúceho robota.

Krok 0: Teoretické základy o rozhraní API telegramových robotov

Hlavným nástrojom používaným na vytváranie telegramových robotov je rozhranie HTML Application Programming Interface alebo HTML API. Tento prvok prijíma požiadavky návštevníkov a odosiela odpovede vo forme informácií. Hotové návrhy zjednodušujú prácu na programe. Ak chcete napísať robota pre telegram, musíte použiť túto e-mailovú adresu: https://api.telegram.org/bot/Metóda_name

Pre správne fungovanie bota je potrebný aj token – kombinácia znakov, ktorá chráni program a otvára k nemu prístup dôveryhodným vývojárom. Každý token je jedinečný. Reťazec je priradený robotovi pri vytvorení. Metódy môžu byť rôzne: getUpdates, getChat a iné. Výber metódy závisí od toho, aký algoritmus vývojári od robota očakávajú. Príklad tokenu:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Roboty používajú požiadavky GET a POST. Parametre metódy je často potrebné doplniť – napríklad keď metóda sendMessage má odoslať ID chatu a nejaký text. Parametre na spresnenie metódy možno odovzdať ako reťazec dotazu adresy URL pomocou application/x-www-form-urlencoded alebo cez application-json. Tieto metódy nie sú vhodné na sťahovanie súborov. Vyžaduje sa aj kódovanie UTF-8. Odoslaním požiadavky do API môžete získať výsledok vo formáte JSON. Pozrite sa na reakciu programu na získavanie informácií pomocou metódy getME:

ZÍSKAJTE https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Bot výmenného kurzu", používateľské meno: "exchangetestbot" } }

Výsledok sa získa, ak ok rovná pravdivý. V opačnom prípade systém upozorní na chybu.

Existujú dva spôsoby, ako získať vlastné správy v robotoch. Obe metódy sú účinné, ale sú vhodné v rôznych prípadoch. Ak chcete získať správy, môžete manuálne napísať požiadavku metódou getUpdates – program zobrazí na obrazovke pole Aktualizovať údaje. Požiadavky je potrebné posielať pravidelne, po analýze každého poľa sa odosielanie opakuje. Offset je parameter, ktorý určuje počet preskočených záznamov pred načítaním nového výsledku, aby sa zabránilo opätovnému zobrazeniu kontrolovaných objektov. Výhody metódy getUpdates sa prejavia, ak:

  • neexistuje spôsob, ako nakonfigurovať HTTPS;
  • používajú sa zložité skriptovacie jazyky;
  • bot server sa z času na čas mení;
  • robot je nabitý používateľmi.

Druhá metóda, ktorú je možné zapísať na prijímanie používateľských správ, je setWebhook. Používa sa jednorazovo, netreba neustále posielať nové požiadavky. Webhook odosiela aktualizácie údajov na zadanú adresu URL. Táto metóda vyžaduje certifikát SSL. Webhook bude užitočný v týchto prípadoch:

  • používajú sa webové programovacie jazyky;
  • robot nie je preťažený, nie je príliš veľa používateľov;
  • server sa nemení, program zostáva na tom istom serveri dlhú dobu.

V ďalších pokynoch použijeme getUpdates.

Služba @BotFather Telegram je určená na vytváranie chatovacích robotov. Cez tento systém sa nastavujú aj základné nastavenia – BotFather vám pomôže urobiť popis, dať profilovú fotku, pridať podporné nástroje. Knižnice – sady HTML požiadaviek pre telegramových botov – sú dostupné na internete, je ich pomerne veľa. Pri vytváraní vzorového programu bol použitý pyTelegramBotApi.

Krok 1: Implementácia žiadostí o výmenný kurz

Najprv musíte napísať kód, ktorý vykonáva dotazy. Použijeme pri písaní API PrivatBank, nižšie je odkaz naň: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Vo svojom kóde musíte použiť tieto metódy:

  • load_exchange – nájde výmenné kurzy a zobrazí zakódované informácie;
  • get_exchange – zobrazuje údaje o konkrétnej mene;
  • get_exchanges – zobrazuje výpis mien podľa vzoru.

Výsledkom je, že kód v súbore pb.py vyzerá takto:

import opätovný import žiadostí 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 ): pre exc v load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' pre exc v load_exchange(): ak re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nie je None: result.append(exc) vráti výsledok

Program môže vydať nasledujúcu odpoveď na zadané požiadavky:

[ { ccy:"USD", base_ccy:"UAH", kúpiť:"25.90000", predaj:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", kúpiť:"29.10000", predaj:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", kúpiť:"0.37800", predaj:"0.41800" }, { ccy:"BTC", base_ccy:"USD", kúpiť:"11220.0384", predaj: "12401.0950" } ]

Krok 2: Vytvorte telegramového robota pomocou @BotFather

Pomocou služby @BotFather si môžete vytvoriť program na prijímanie správ a odpovedanie na ne. Prejdite na jeho stránku Telegram a zadajte príkaz /newbot. V chate sa objavia pokyny, podľa ktorých musíte najprv napísať meno robota a potom jeho adresu. Po vytvorení účtu robota sa na obrazovke zobrazí uvítacia správa obsahujúca token. Pre ďalšiu konfiguráciu použite tieto príkazy:

  • /setdescription – popis;
  • /setabouttext – informácie o novom bote;
  • /setuserpic – profilová fotka;
  • /setinline – inline režim;
  • /setcommands – popis príkazov.

V poslednom kroku konfigurácie popíšeme /help a /exchange. Po dokončení všetkých krokov je čas prejsť na kódovanie.

Krok 3: Nastavenie a spustenie robota

Vytvorme súbor config.py. V ňom musíte zadať jedinečný kód bota a časové pásmo, v ktorom program nájde informácie.

TOKEN = '' # nahraďte tokenom vášho robotaTIMEZONE = 'Európa/Kyjev' TIMEZONE_COMMON_NAME = 'Kyjev'

Ďalej vytvoríme ďalší súbor s importom predtým napísaného pb.py, knižníc a ďalších potrebných komponentov. Chýbajúce knižnice sú nainštalované zo systému správy balíkov (pip).

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Využime obsah pyTelegramBotApi na vytvorenie robota. Prijatý token odosielame pomocou nasledujúceho kódu:

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

Parameter none_stop zabezpečuje neustále odosielanie požiadaviek. Prevádzka parametra nebude ovplyvnená chybami metódy.

Krok 4: Napíšte /start Command Handler

Ak sú všetky predchádzajúce kroky vykonané správne, robot začal pracovať. Program generuje požiadavky pravidelne, pretože používa metódu getUpdates. Pred riadkom s prvkom none_stop potrebujeme kúsok kódu, ktorý spracuje príkaz /start:

@bot.message_handler(commands=['start']) def start_command(správa): bot.send_message( message.chat.id, 'Dobrý deň! Môžem vám ukázať výmenné kurzy.n' + 'Ak chcete získať výmenné kurzy, stlačte / exchange.n' + 'Ak chcete získať pomoc, stlačte /help.' )

RџSЂRo commands=['start'] rovná Pravda volá sa príkaz start_command. Obsah správy ide tam. Ďalej musíte implementovať funkciu odosielania_správa vo vzťahu ku konkrétnej správe.

Krok 5: Vytvorte obslužný program príkazov /help

Príkaz /help môže byť implementovaný ako tlačidlo. Kliknutím naň sa používateľ dostane na účet vývojára v telegrame. Pomenujte tlačidlo, napríklad „Opýtajte sa vývojára“. Nastavte parameter reply_markup, ktorý presmeruje používateľa na odkaz pre metódu send_message. Napíšme do kódu parameter, ktorý vytvára klávesnicu (InlineKeyboardMarkup). Potrebujete iba jedno tlačidlo (InlineKeyboardButton).

Konečný kód obsluhy príkazov vyzerá takto:

@bot.message_handler(commands=['help']) def help_command(správa): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Opýtajte sa vývojára', url='ваша сасылка профиль' ) ) bot.send_message( message.chat.id, '1) Ak chcete získať zoznam dostupných mien, stlačte /exchange.n' + '2) Kliknite na menu, o ktorú máte záujem.n' + '3) Vy dostane správu obsahujúcu informácie týkajúce sa zdroja a cieľových mien, ' + 'nákupné a predajné kurzy.n' + '4) Kliknutím na „Aktualizovať“ získate aktuálne informácie týkajúce sa požiadavky. ' + 'Robot tiež ukáže rozdiel medzi predchádzajúcim a aktuálnym výmenným kurzom.n' + '5) Robot podporuje inline. Napíšte @ v akomkoľvek rozhovore a prvé písmená meny.', reply_markup=keyboard )

Akcia kódu v telegramovom rozhovore:

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Krok 6: Pridanie /exchange Command Handler

Tento krok je potrebný na zobrazenie tlačidiel so symbolmi dostupných mien v chate. Klávesnica na obrazovke s možnosťami vám pomôže vyhnúť sa chybám. PrivatBank poskytuje informácie o rubľoch, dolároch a eurách. Možnosť InlineKeyboardButton funguje takto:

  1. Používateľ klikne na tlačidlo s požadovaným označením.
  2. getUpdates prijíma spätné volanie (CallbackQuery).
  3. Je známe, ako zaobchádzať so stláčaním klávesnice – prenáša sa informácia o stlačenom tlačidle.

/Výmena kódu obsluhy:

@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, 'Kliknite na zvolenú menu:', reply_markup=keyboard )

Výsledok kódu v telegrame:

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Krok 7: Napísanie obsluhy pre tlačidlá vstavanej klávesnice

Balík pyTelegramBot Api obsahuje funkciu dekorátora @bot.callback_query_handler. Tento komponent je navrhnutý tak, aby preložil spätné volanie do funkcie – API rozbalí a znova vytvorí volanie. Píše sa to takto:

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

Napíšme tiež metódu get_ex_callback:

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

Existuje ďalšia užitočná metóda – answer_callback_query. Pomáha odstrániť záťaž medzi stlačením tlačidla a zobrazením výsledku na obrazovke. Správu send_exchange_query môžete odoslať zadaním kódu meny a správy. Napíšeme send_exchange_result:

def send_exchange_result(správa, ex_code): bot.send_chat_action(message.chat.id, 'zadanie') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard (napr. ), parse_mode='HTML' )

Zatiaľ čo chatbot dostane výsledok požiadavky z banky API, návštevníkovi sa zobrazí nápis „písanie správy“. Vyzerá to tak, že odpovedá skutočná osoba. Ak chcete zobraziť takýto indikátor na obrazovke, budete musieť pridať riadky stavu vstupu. Ďalej použijeme get_exchange – s jeho pomocou program získa označenie meny (ruble, eurá alebo doláre). send_message používa ďalšie metódy: serialize_ex konvertuje menu do iného formátu a get_update_keyboard nastavuje softvérové ​​tlačidlá, ktoré aktualizujú informácie a odosielajú údaje o menovom trhu do iných chatov.

Poďme napísať kód pre get_update_keyboard. Treba spomenúť dve tlačidlá – t a e znamenajú typ a výmenu. Položka switch_inline_query pre tlačidlo Zdieľať je potrebná, aby si používateľ mohol vybrať z niekoľkých chatov. Návštevník si bude môcť vybrať, komu pošle aktuálny kurz dolára, rubľa alebo eura.

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']) ) návratová klávesnica

Niekedy potrebujete vidieť, ako veľmi sa zmenil výmenný kurz v krátkom čase. Napíšme dve metódy pre tlačidlo Aktualizovať, aby používatelia videli kurzy v porovnaní.

Rozdiel medzi výmennými kurzami sa prenáša do serializátora cez parameter diff.

Predpísané metódy fungujú až po aktualizácii údajov, neovplyvnia prvé zobrazenie kurzu.

def serialize_ex(ex_json, diff=None): vysledok = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Kúpiť: ' + ex_json['buy'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Predať: ' + ex_json['predaj'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nPredaj: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: výsledok = '(' + 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: výsledok = '(' + 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">)' návratový výsledok

Predstavte si, že návštevník chcel vedieť výmenný kurz dolára. Ak v správe vyberiete USD, stane sa toto:

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Krok 8: Implementácia nástroja Update Button Handler

Napíšeme kód na obsluhu akcií tlačidlom Aktualizovať a pridáme k nemu časť iq_callback_method. Keď položky programu začínajú parametrom get, musíte napísať get_ex_callback. V iných situáciách analyzujeme JSON a snažíme sa získať kľúč 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: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(query) okrem ValueError: pass

Ak sa t rovná u, budete musieť napísať program pre metódu edit_message_callback. Rozoberme si tento proces krok za krokom:

  1. Sťahovanie aktuálnych informácií o stave menového trhu (exchange_now = pb.get_exchange(data['c']).
  1. Písanie novej správy cez serializátor s rozdielom.
  2. Pridanie podpisu (get_edited_signature).

Ak sa úvodná správa nezmení, zavolajte metódu 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_idline_mess : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Napíšme metódu get_ex_from_iq_data na analýzu JSON:

def get_ex_from_iq_data(exc_json): return { 'kúpiť': exc_json['b'], 'predaj': exc_json['s'] }

Budete potrebovať niekoľko ďalších metód: napríklad get_exchange_diff, ktorá prečíta staré a nové informácie o cene mien a zobrazí rozdiel.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(teraz['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(teraz['kúpiť']) - float(posledný['kúpiť']))) }

Posledný, get_edited_signature, zobrazuje čas poslednej aktualizácie kurzu.

def get_edited_signature(): return 'Aktualizované ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

V dôsledku toho aktualizovaná správa od robota so stabilným výmenným kurzom vyzerá takto:

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Pri zmene kurzu sa rozdiely medzi hodnotami zobrazia v správe kvôli predpísaným parametrom.

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Krok 9: Implementácia vstavaného režimu

Vstavaný režim je potrebný na rýchle odosielanie informácií z programu do akéhokoľvek chatu – teraz už nemusíte do konverzácie pridávať robota ako účastníka. Keď používateľ telegramu zadá názov robota so znakom @ pred ním, nad vstupným riadkom by sa mali objaviť možnosti konverzie. Ak kliknete na jednu z položiek, robot odošle do konverzácie správu s výsledkami a tlačidlami na aktualizáciu a odoslanie údajov. Meno odosielateľa bude obsahovať nápis „cez ".

InlineQuery je odovzdaný do query_text cez knižnicu. Kód používa funkciu answer_line na získanie výsledkov vyhľadávania ako poľa údajov a prvku inline_query_id. Používame get_exchanges, aby robot na požiadanie našiel niekoľko mien.

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

Do get_iq_articles odovzdávame pole údajov, aby sme touto metódou vrátili objekty z 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='Konvertovať ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) vrátiť výsledok

Ak teraz napíšeš @ a medzeru v riadku, na obrazovke sa zobrazia výsledky vyhľadávania – možnosti prevodu na tri dostupné meny.

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

Používatelia môžu filtrovať výsledky zadaním požadovanej meny.

Po kliknutí na požadovanú menu zo zoznamu dostane chat rovnakú správu, akú dostávajú používatelia robotov. Môžete tiež použiť tlačidlo Aktualizovať. Obrázok nižšie zobrazuje aktualizovanú správu odoslanú prostredníctvom robota:

Telegramový robot v Pythone. Kompletný sprievodca písaním robota s výmennými kurzami od začiatku

záver

Teraz viete, ako vytvoriť robota pre telegram. Do svojho programu môžete pridať užitočné nástroje: tlačidlá na aktualizáciu a odoslanie výsledku ostatným používateľom messengeru a vstavaný režim, ktorý vám umožní používať funkcie robota mimo chatu s ním. Na základe tohto návodu si môžete vytvoriť ľubovoľného jednoduchého robota s ďalšími funkciami – nielen toho, ktorý bude zobrazovať výmenné kurzy. Nebojte sa experimentovať s knižnicami, API a kódom, aby ste vytvorili automatizovaného asistenta, ktorý bude chatovať so zákazníkmi na Telegrame a posilní spojenie zainteresovaných ľudí so spoločnosťou.

1 Comment

  1. Fantástická publikácia

Nechaj odpoveď