Obsah
- Krok 0: Teoretické základy API pro roboty Telegram
- Krok 1: Implementace požadavků na směnný kurz
- Krok 2: Vytvořte telegramového robota pomocí @BotFather
- Krok 3: Nastavení a spuštění robota
- Krok 4: Napište /start Command Handler
- Krok 5: Vytvořte obslužný program příkazu /help
- Krok 6: Přidání /exchange Command Handler
- Krok 7: Napsání ovladače pro tlačítka vestavěné klávesnice
- Krok 8: Implementace nástroje Update Button Handler
- Krok 9: Implementace vestavěného režimu
- Proč investovat do čističky vzduchu?
Boti v telegramu jsou programy, které pomáhají navázat kontakt s publikem nebo zjednodušit akce, které bylo dříve nutné provádět ručně. Tyto programy jsou napsány speciálně pro platformu messenger. Roboti pracují tímto způsobem: uživatel odešle příkaz přes vstupní řádek a systém odpoví textovou nebo interaktivní zprávou. Někdy program dokonce napodobuje jednání skutečné osoby – takový bot vzbuzuje u zákazníků větší důvěru.
Existuje několik typů systémů pro automatickou pomoc uživatelům. Někteří roboti pouze komunikují se zákazníky, jiní pravidelně poskytují informace. Není možné jednoznačně rozdělit programy na typy – vývojáři často kombinují několik funkcí v jednom botě.
Jednoduchého bota pro Telegram s interaktivními prvky v podobě tlačítek na obrazovce můžete napsat v 9 krocích. Podívejme se na každou z nich podrobně a odpovězte na několik otázek:
- jak spustit robota;
- jak zaregistrovat vestavěnou klávesnici z jednoho nebo více tlačítek;
- jak naprogramovat tlačítka pro požadované funkce;
- co je inline režim a jak jej nastavit pro stávajícího robota.
Krok 0: Teoretické základy API pro roboty Telegram
Hlavním nástrojem používaným k vytváření robotů Telegram je rozhraní HTML Application Programming Interface neboli HTML API. Tento prvek přijímá požadavky návštěvníků a odesílá odpovědi ve formě informací. Hotové návrhy zjednodušují práci na programu. Chcete-li napsat robota pro Telegram, musíte použít tuto e-mailovou adresu: https://api.telegram.org/bot
Pro správné fungování bota je potřeba také token – kombinace znaků, která program chrání a otevírá k němu přístup důvěryhodným vývojářům. Každý token je jedinečný. Řetězec je robotovi přiřazen při vytvoření. Metody mohou být různé: getUpdates, getChat a další. Výběr metody závisí na tom, jaký algoritmus vývojáři od robota očekávají. Příklad tokenu:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Boti používají požadavky GET a POST. Parametry metody se často musí doplňovat – například když má metoda sendMessage odeslat ID chatu a nějaký text. Parametry pro upřesnění metody lze předat jako řetězec URL dotazu pomocí application/x-www-form-urlencoded nebo přes application-json. Tyto metody nejsou vhodné pro stahování souborů. Vyžaduje se také kódování UTF-8. Odesláním požadavku do API můžete získat výsledek ve formátu JSON. Podívejte se na reakci programu na získávání informací pomocí metody getME:
ZÍSKEJTE https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "bot směnného kurzu", uživatelské jméno: "exchangetestbot" } }
Výsledek bude získán, pokud ok rovná se pravdivý. V opačném případě systém oznámí chybu.
Existují dva způsoby, jak získat vlastní zprávy v robotech. Obě metody jsou účinné, ale jsou vhodné v různých případech. Pro příjem zpráv můžete ručně napsat požadavek metodou getUpdates – program zobrazí na obrazovce pole Aktualizace dat. Požadavky je nutné zasílat pravidelně, po analýze každého pole se odeslání opakuje. Offset je parametr, který určuje počet přeskočených záznamů před načtením nového výsledku, aby se zabránilo opětovnému zobrazení kontrolovaných objektů. Výhody metody getUpdates se projeví, pokud:
- neexistuje způsob, jak nakonfigurovat HTTPS;
- používají se složité skriptovací jazyky;
- bot server se čas od času mění;
- robot je nabitý uživateli.
Druhá metoda, kterou lze zapsat pro příjem uživatelských zpráv, je setWebhook. Používá se jednorázově, není třeba neustále posílat nové požadavky. Webhook odesílá aktualizace dat na zadanou adresu URL. Tato metoda vyžaduje certifikát SSL. Webhook bude užitečný v těchto případech:
- používají se webové programovací jazyky;
- robot není přetížený, není příliš mnoho uživatelů;
- server se nemění, program zůstává na stejném serveru dlouhou dobu.
V dalších pokynech použijeme getUpdates.
Služba @BotFather Telegram je určena k vytváření chatovacích robotů. Prostřednictvím tohoto systému se nastavují i základní nastavení – BotFather vám pomůže udělat popis, dát profilovou fotku, přidat podpůrné nástroje. Knihovny – sady HTML požadavků pro telegramové roboty – jsou dostupné na internetu, je jich poměrně hodně. Při vytváření ukázkového programu byl použit pyTelegramBotApi.
Krok 1: Implementace požadavků na směnný kurz
Nejprve musíte napsat kód, který provádí dotazy. Použijeme při psaní PrivatBank API, níže je odkaz na něj: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Ve svém kódu musíte použít tyto metody:
- load_exchange – vyhledá směnné kurzy a zobrazí zakódované informace;
- get_exchange – zobrazuje údaje o konkrétní měně;
- get_exchanges – zobrazí výpis měn podle ukázky.
Výsledkem je, že kód v souboru pb.py vypadá takto:
import znovu importovat požadavky 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 ): pro 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) + '.*' pro exc v load_exchange(): if re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) není None: result.append(exc) return result
Program může na zadané požadavky vydat následující odpověď:
[ { ccy:"USD", base_ccy:"UAH", koupit:"25.90000", prodej:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", koupit:"29.10000", prodej:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", koupit:"0.37800", prodej:"0.41800" }, { ccy:"BTC", base_ccy:"USD", koupit:"11220.0384", výprodej: "12401.0950" } ]
Krok 2: Vytvořte telegramového robota pomocí @BotFather
Pomocí služby @BotFather můžete vytvořit program pro příjem zpráv a odpovídání na ně. Přejděte na jeho stránku Telegram a zadejte příkaz /newbot. V chatu se objeví pokyny, podle kterých musíte nejprve napsat jméno robota a poté jeho adresu. Po vytvoření účtu robota se na obrazovce objeví uvítací zpráva obsahující token. Pro další konfiguraci použijte tyto příkazy:
- /setdescription – popis;
- /setabouttext – informace o novém botovi;
- /setuserpic – profilová fotka;
- /setinline – inline režim;
- /setcommands – popis příkazů.
V posledním konfiguračním kroku popíšeme /help a /exchange. Po dokončení všech kroků je čas přejít ke kódování.
Krok 3: Nastavení a spuštění robota
Vytvoříme soubor config.py. V něm musíte zadat jedinečný kód bota a časové pásmo, ve kterém program najde informace.
TOKEN = '' # nahraďte tokenem vašeho robotaTIMEZONE = 'Evropa/Kyjev' TIMEZONE_COMMON_NAME = 'Kyjev'
Dále vytvoříme další soubor s importem dříve napsaného pb.py, knihoven a dalších potřebných komponent. Chybějící knihovny jsou nainstalovány ze systému správy balíčků (pip).
import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME
Použijme obsah pyTelegramBotApi k vytvoření robota. Přijatý token odešleme pomocí následujícího kódu:
bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)
Parametr none_stop zajišťuje neustálé odesílání požadavků. Funkce parametru nebude ovlivněna chybami metody.
Krok 4: Napište /start Command Handler
Pokud jsou všechny předchozí kroky provedeny správně, robot začal pracovat. Program generuje požadavky pravidelně, protože používá metodu getUpdates. Před řádkem s prvkem none_stop potřebujeme kus kódu, který zpracuje příkaz /start:
@bot.message_handler(commands=['start']) def start_command(zpráva): bot.send_message( message.chat.id, 'Zdravím vás! Můžu vám ukázat směnné kurzy.n' + 'Chcete-li získat směnné kurzy, stiskněte / exchange.n' + 'Chcete-li získat nápovědu, stiskněte /help.' )
RџСўРё commands=['start'] rovná se Pravda se nazývá start_command. Obsah zprávy jde tam. Dále je potřeba implementovat funkci send_zpráva ve vztahu ke konkrétní zprávě.
Krok 5: Vytvořte obslužný program příkazu /help
Příkaz /help lze implementovat jako tlačítko. Kliknutím na něj bude uživatel přesměrován na vývojářský účet Telegram. Dejte tlačítku název, například „Zeptejte se vývojáře“. Nastavte parametr reply_markup, který uživatele přesměruje na odkaz, pro metodu send_message. Zapišme si do kódu parametr, který vytváří klávesnici (InlineKeyboardMarkup). Potřebujete pouze jedno tlačítko (InlineKeyboardButton).
Konečný kód obslužného programu příkazů vypadá takto:
@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Zeptejte se vývojáře', url='ваша сасылка профиль' ) ) bot.send_message( message.chat.id, '1) Chcete-li získat seznam dostupných měn, stiskněte /exchange.n' + '2) Klikněte na měnu, která vás zajímá.n' + '3) Vy obdrží zprávu obsahující informace o zdroji a cílových měnách, ' + 'nákupní a prodejní kurzy.n' + '4) Kliknutím na „Aktualizovat“ získáte aktuální informace týkající se požadavku. ' + 'Bobot také ukáže rozdíl mezi předchozím a aktuálním směnným kurzem.n' + '5) Robot podporuje inline. Napište @v libovolném chatu a první písmena měny.', reply_markup=keyboard )
Akce kódu v telegramovém chatu:
Krok 6: Přidání /exchange Command Handler
Tento krok je nutný pro zobrazení tlačítek se symboly dostupných měn v chatu. Klávesnice na obrazovce s možnostmi vám pomůže vyhnout se chybám. PrivatBank poskytuje informace o rublu, dolaru a euru. Možnost InlineKeyboardButton funguje takto:
- Uživatel klikne na tlačítko s požadovaným označením.
- getUpdates přijímá zpětné volání (CallbackQuery).
- Je známo, jak zacházet se stiskem klávesnice – přenáší se informace o stisknutém tlačítku.
/exchange kód obslužného programu:
@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, 'Klikněte na zvolenou měnu:', reply_markup=keyboard )
Výsledek kódu v telegramu:
Balíček pyTelegramBot Api obsahuje funkci dekorátoru @bot.callback_query_handler. Tato komponenta je navržena tak, aby převedla zpětné volání do funkce – API rozbalí a znovu vytvoří volání. Píše se 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)
Napišme také metodu get_ex_callback:
def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])
Existuje další užitečná metoda – answer_callback_query. Pomáhá odstranit zátěž mezi stisknutím tlačítka a zobrazením výsledku na obrazovce. Můžete odeslat zprávu send_exchange_query předáním kódu měny a zprávy. Zapišme send_exchange_result:
def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'psaní') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex ), parse_mode='HTML' )
Zatímco chatbot obdrží výsledek požadavku z banky API, návštěvník uvidí nápis „zadává zprávu“. Vypadá to, že odpovídá skutečný člověk. Pro zobrazení takového indikátoru na obrazovce budete muset přidat vstupní stavové řádky. Dále použijeme get_exchange – s její pomocí program získá označení měny (rubly, eura nebo dolary). send_message používá další metody: serialize_ex převádí měnu do jiného formátu a get_update_keyboard nastavuje softwarová tlačítka, která aktualizují informace a odesílají data o měnovém trhu do jiných chatů.
Pojďme napsat kód pro get_update_keyboard. Je třeba zmínit dvě tlačítka – t a e značí typ a výměnu. Položka switch_inline_query pro tlačítko Share je potřeba, aby si uživatel mohl vybrat z několika chatů. Návštěvník si bude moci vybrat, komu pošle aktuální kurz dolaru, rublu nebo 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']) ) vrátit klávesnici
Někdy potřebujete vidět, jak moc se směnný kurz během krátké doby změnil. Napišme dvě metody pro tlačítko Aktualizovat, aby uživatelé viděli kurzy v porovnání.
Rozdíl mezi směnnými kurzy je předán do serializátoru přes parametr diff.
Předepsané metody fungují až po aktualizaci dat, neovlivní první zobrazení průběhu.
def serialize_ex(ex_json, diff=None): result = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Koupit: ' + ex_json['buy'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Prodat: ' + 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: výsledek = '(' + 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ýsledek = '(' + 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ýsledek
Představte si, že návštěvník chtěl znát kurz dolaru. Pokud ve zprávě vyberete USD, stane se toto:
Krok 8: Implementace nástroje Update Button Handler
Napíšeme kód pro obsluhu akcí tlačítkem Aktualizovat a přidáme k němu část iq_callback_method. Když položky programu začínají parametrem get, musíte napsat get_ex_callback. V jiných situacích analyzujeme JSON a snažíme se získat klíč 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) kromě ValueError: pass
Pokud se t rovná u, budete muset napsat program pro metodu edit_message_callback. Pojďme si tento proces rozebrat krok za krokem:
- Stahování aktuálních informací o stavu měnového trhu (exchange_now = pb.get_exchange(data['c']).
- Psaní nové zprávy přes serializátor s diff.
- Přidání podpisu (get_edited_signature).
Pokud se počáteční zpráva nezmění, zavolejte metodu 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' )
Pojďme napsat metodu get_ex_from_iq_data pro analýzu JSON:
def get_ex_from_iq_data(exc_json): return { 'koupit': exc_json['b'], 'sale': exc_json['s'] }
Budete potřebovat několik dalších metod: například get_exchange_diff, která přečte staré a nové informace o ceně měn a zobrazí rozdíl.
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']))) }
Poslední, get_edited_signature, ukazuje čas poslední aktualizace kurzu.
def get_edited_signature(): return 'Aktualizováno ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'
V důsledku toho aktualizovaná zpráva od robota se stabilním směnným kurzem vypadá takto:
Při změně kurzu se rozdíly mezi hodnotami zobrazí ve zprávě kvůli předepsaným parametrům.
Krok 9: Implementace vestavěného režimu
Vestavěný režim je potřebný k rychlému odesílání informací z programu do libovolného chatu – nyní nemusíte do konverzace přidávat robota jako účastníka. Když uživatel telegramu zadá název robota se znakem @ před ním, nad vstupním řádkem by se měly objevit možnosti převodu. Pokud kliknete na jednu z položek, bot odešle do konverzace zprávu s výsledky a tlačítky pro aktualizaci a odeslání dat. Jméno odesílatele bude obsahovat popisek „přes
InlineQuery je předán do query_text prostřednictvím knihovny. Kód používá funkci answer_line k načtení výsledků vyhledávání jako pole dat a prvku inline_query_id. Používáme get_exchanges, aby bot našel několik měn na vyžádání.
@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 předáváme pole dat, abychom touto metodou 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='Převést ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) vrátit výsledek
Teď, když napíšeš @
Uživatelé mohou filtrovat výsledky zadáním požadované měny.
Po kliknutí na požadovanou měnu ze seznamu obdrží chat stejnou zprávu, jakou obdrží uživatelé robotů. Můžete také použít tlačítko Aktualizovat. Obrázek níže ukazuje aktualizovanou zprávu odeslanou prostřednictvím robota:
Proč investovat do čističky vzduchu?
Nyní víte, jak vytvořit robota pro telegram. Do svého programu můžete přidat užitečné nástroje: tlačítka pro aktualizaci a odeslání výsledku dalším uživatelům messengeru a vestavěný režim, který vám umožní používat funkce robota mimo chat s ním. Na základě tohoto návodu si můžete vytvořit libovolného jednoduchého robota s dalšími funkcemi – nejen toho, který bude ukazovat směnné kurzy. Nebojte se experimentovat s knihovnami, API a kódem, abyste vytvořili automatizovaného asistenta, který bude chatovat se zákazníky na Telegramu a posílí spojení zainteresovaných lidí s firmou.
Fantástická publicación