Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

Boti v Telegramu so programi, ki pomagajo vzpostaviti stik z občinstvom ali poenostaviti dejanja, ki jih je bilo prej treba izvesti ročno. Ti programi so napisani posebej za platformo messenger. Boti delujejo na ta način: uporabnik pošlje ukaz skozi vnosno vrstico, sistem pa odgovori z besedilnim ali interaktivnim sporočilom. Včasih program celo posnema dejanja resnične osebe - takšen bot vzbuja več zaupanja med strankami.

Obstaja več vrst sistemov za avtomatsko pomoč uporabnikom. Nekateri roboti samo komunicirajo s strankami, drugi redno zagotavljajo informacije. Nemogoče je jasno razdeliti programe na vrste - razvijalci pogosto združujejo več funkcij v enem botu.

Preprostega bota za Telegram z interaktivnimi elementi v obliki zaslonskih gumbov lahko napišete v 9 korakih. Oglejmo si vsakega od njih podrobneje in odgovorimo na nekaj vprašanj:

  • kako zagnati bota;
  • kako registrirati vgrajeno tipkovnico z enim ali več gumbi;
  • kako programirati gumbe za želene funkcije;
  • kaj je inline način in kako ga nastaviti za obstoječega bota.

0. korak: teoretično ozadje o API-ju Telegram botov

Glavno orodje, ki se uporablja za ustvarjanje robotov Telegram, je HTML aplikacijski programski vmesnik ali HTML API. Ta element sprejema zahteve obiskovalcev in pošilja odgovore v obliki informacij. Pripravljeni dizajni poenostavijo delo na programu. Če želite napisati bota za Telegram, morate uporabiti ta e-poštni naslov: https://api.telegram.org/bot/METHOD_NAME

Za pravilno delovanje bota je potreben tudi žeton – kombinacija znakov, ki ščiti program in odpira dostop do njega zaupanja vrednim razvijalcem. Vsak žeton je edinstven. Niz je botu dodeljen ob ustvarjanju. Metode so lahko različne: getUpdates, getChat in druge. Izbira metode je odvisna od tega, kakšen algoritem razvijalci pričakujejo od bota. Primer žetona:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Boti uporabljajo zahteve GET in POST. Parametre metode je treba pogosto dopolniti – na primer, ko naj bi metoda sendMessage poslala ID klepeta in nekaj besedila. Parametre za izboljšanje metode je mogoče posredovati kot poizvedbeni niz URL z uporabo application/x-www-form-urlencoded ali prek application-json. Te metode niso primerne za prenos datotek. Zahtevano je tudi kodiranje UTF-8. Če pošljete zahtevo API-ju, lahko dobite rezultat v formatu JSON. Oglejte si odziv programa na pridobivanje informacij preko metode getME:

PRIDOBITE https://api.telegram.org/bot/getMe{ ok: res, rezultat: { id: 231757398, first_name: "Exchange Rate Bot", uporabniško ime: "exchangetestbot" } }

Rezultat bo dosežen, če ok enako Res. V nasprotnem primeru bo sistem prikazal napako.

Obstajata dva načina za pridobivanje sporočil po meri v robotih. Obe metodi sta učinkoviti, vendar sta primerni v različnih primerih. Za prejemanje sporočil lahko ročno napišete zahtevo z metodo getUpdates – program bo na zaslonu prikazal podatkovno matriko Update. Zahteve je treba pošiljati redno, po analizi posamezne matrike se pošiljanje ponovi. Odmik je parameter, ki določa število preskočenih zapisov pred nalaganjem novega rezultata, da se prepreči ponovno pojavljanje označenih objektov. Prednosti metode getUpdates bodo prišle v poštev, če:

  • HTTPS ni mogoče konfigurirati;
  • uporabljajo se kompleksni skriptni jeziki;
  • botovski strežnik se občasno spremeni;
  • bot je naložen z uporabniki.

Druga metoda, ki jo je mogoče napisati za prejemanje uporabniških sporočil, je setWebhook. Uporablja se enkrat, ni treba nenehno pošiljati novih zahtev. Webhook pošlje posodobitve podatkov na navedeni URL. Ta metoda zahteva potrdilo SSL. Webhook bo uporaben v teh primerih:

  • uporabljajo se spletni programski jeziki;
  • bot ni preobremenjen, ni preveč uporabnikov;
  • strežnik se ne spremeni, program ostane na istem strežniku dalj časa.

V nadaljnjih navodilih bomo uporabili getUpdates.

Storitev @BotFather Telegram je zasnovana za ustvarjanje robotov za klepet. Prek tega sistema se nastavljajo tudi osnovne nastavitve – BotFather vam bo pomagal narediti opis, dati profilno sliko, dodati podporna orodja. Knjižnice – nabori HTML zahtev za Telegram bote – so na voljo na internetu in jih je kar veliko. Pri ustvarjanju vzorčnega programa je bil uporabljen pyTelegramBotApi.

1. korak: Izvajanje zahtev za menjalni tečaj

Najprej morate napisati kodo, ki izvaja poizvedbe. Uporabili bomo pri pisanju API-ja PrivatBank, spodaj je povezava do njega: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. V kodi morate uporabiti te metode:

  • load_exchange – poišče menjalne tečaje in prikaže kodirane informacije;
  • get_exchange – prikaže podatke o določeni valuti;
  • get_exchanges – prikaže seznam valut po vzorcu.

Posledično je koda v datoteki pb.py videti takole:

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 ): za 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) + '.*' for exc in load_exchange(): če re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) ni None: result.append(exc) vrni rezultat

Program lahko izda naslednji odgovor na navedene zahteve:

[ { ccy:"USD", base_ccy:"UAH", nakup:"25.90000", prodaja:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", nakup:"29.10000", prodaja:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", nakup:"0.37800", prodaja:"0.41800" }, { ccy:"BTC", base_ccy:"USD", nakup:"11220.0384", prodaja: "12401.0950" } ]

2. korak: Ustvarite Telegram Bot z @BotFather

S storitvijo @BotFather lahko ustvarite program za prejemanje sporočil in odgovarjanje nanje. Pojdite na njegovo stran Telegram in vnesite ukaz /newbot. V klepetu se prikažejo navodila, po katerih morate najprej zapisati ime bota in nato njegov naslov. Ko je račun bota ustvarjen, se na zaslonu prikaže pozdravno sporočilo, ki vsebuje žeton. Za nadaljnjo konfiguracijo uporabite te ukaze:

  • /setdescription – opis;
  • /setabouttext – informacije o novem botu;
  • /setuserpic – profilna fotografija;
  • /setinline – način v vrstici;
  • /setcommands – opis ukazov.

V zadnjem koraku konfiguracije opišemo /help in /exchange. Ko so vsi koraki zaključeni, je čas, da nadaljujemo s kodiranjem.

3. korak: Nastavitev in zagon bota

Ustvarimo datoteko config.py. V njem morate določiti edinstveno kodo bota in časovni pas, v katerem bo program našel informacije.

ŽETON = '' # zamenjaj z žetonom svojega botaTIMEZONE = 'Evropa/Kijev' TIMEZONE_COMMON_NAME = 'Kijev'

Nato ustvarimo drugo datoteko z uvozom predhodno napisanega pb.py, knjižnic in drugih potrebnih komponent. Manjkajoče knjižnice so nameščene iz sistema za upravljanje paketov (pip).

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

Uporabimo vsebino pyTelegramBotApi za ustvarjanje bota. Prejeti žeton pošljemo z naslednjo kodo:

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

Parameter none_stop zagotavlja, da se zahteve nenehno pošiljajo. Na delovanje parametra ne bodo vplivale napake metode.

4. korak: Napišite upravljalnik ukazov /start

Če so vsi prejšnji koraki izvedeni pravilno, je bot začel delovati. Program redno ustvarja zahteve, ker uporablja metodo getUpdates. Pred vrstico z elementom none_stop potrebujemo delček kode, ki obdeluje ukaz /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Pozdravljeni! Lahko vam pokažem menjalne tečaje.n' + 'Za pridobitev menjalnih tečajev pritisnite / exchange.n' + 'Za pomoč pritisnite /help.' )

RџSÐRё ukazi=['start'] enako True se kliče start_command. Tja gre vsebina sporočila. Nato morate implementirati funkcijo pošiljanja_sporočilo v zvezi z določenim sporočilom.

5. korak: Ustvarite upravljalnik ukazov /help

Ukaz /help je mogoče implementirati kot gumb. S klikom nanj bo uporabnik preusmerjen na račun razvijalca Telegram. Poimenujte gumb, na primer »Vprašaj razvijalca«. Nastavite parameter reply_markup, ki uporabnika preusmeri na povezavo, za metodo send_message. V kodo zapišimo parameter, ki ustvari tipkovnico (InlineKeyboardMarkup). Potrebujete samo en gumb (InlineKeyboardButton).

Končna koda upravljalnika ukazov je videti takole:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Vprašajte razvijalca', url='vaša povezava na profil' ) ) bot.send_message( message.chat.id, '1) Če želite prejeti seznam razpoložljivih valut, pritisnite /exchange.n' + '2) Kliknite valuto, ki vas zanima.n' + '3) Vi bo prejel sporočilo z informacijami o izvorni in ciljni valuti, ' + 'nakupni in prodajni tečaji.n' + '4) Kliknite »Posodobi«, če želite prejeti trenutne informacije o zahtevi. ' + 'Bot bo prikazal tudi razliko med prejšnjim in trenutnim menjalnim tečajem.n' + '5) Bot podpira inline. Vnesite @ v katerem koli klepetu in prve črke valute.', reply_markup=tipkovnica )

Dejanje kode v klepetu Telegram:

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

6. korak: Dodajanje upravljalnika ukazov /exchange

Ta korak je potreben za prikaz gumbov s simboli razpoložljivih valut v klepetu. Zaslonska tipkovnica z možnostmi vam bo pomagala preprečiti napake. PrivatBank zagotavlja informacije o rublju, dolarju in evru. Možnost InlineKeyboardButton deluje takole:

  1. Uporabnik klikne na gumb z želeno oznako.
  2. getUpdates prejme povratni klic (CallbackQuery).
  3. Postane znano, kako ravnati s pritiskom na tipkovnico - posreduje se informacija o pritisnjenem gumbu.

/koda upravljalnika izmenjave:

@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 izbrano valuto:', reply_markup=tipkovnica )

Rezultat kode v Telegramu:

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

7. korak: Pisanje upravljalnika za vgrajene gumbe tipkovnice

Paket pyTelegramBot API vsebuje funkcijo okrasitve @bot.callback_query_handler. Ta komponenta je zasnovana za pretvorbo povratnega klica v funkcijo – API odvije in znova ustvari klic. Napisano je takole:

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

Napišimo tudi metodo get_ex_callback:

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

Obstaja še ena uporabna metoda – answer_callback_query. Pomaga zmanjšati obremenitev med pritiskom na gumb in prikazom rezultata na zaslonu. Sporočilo lahko pošljete na send_exchange_query tako, da posredujete kodo valute in sporočilo. Napišimo 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' )

Medtem ko chatbot od banke prejme rezultat zahteve API, obiskovalec vidi napis »tipkanje sporočila«. Videti je, kot da odgovarja prava oseba. Za prikaz takšnega indikatorja na zaslonu boste morali dodati vrstice stanja vnosa. Nato bomo uporabili get_exchange - z njegovo pomočjo bo program prejel oznako valute (rubljev, evrov ali dolarjev). send_message uporablja dodatne metode: serialize_ex pretvori valuto v drugo obliko, get_update_keyboard pa nastavi programske tipke, ki posodabljajo informacije in pošiljajo podatke o valutnem trgu v druge klepete.

Napišimo kodo za get_update_keyboard. Omeniti je treba dva gumba – t in e pomenita tip in menjavo. Element switch_inline_query za gumb Share je potreben, da lahko uporabnik izbira med več klepeti. Obiskovalec bo lahko izbral, komu bo poslal trenutni tečaj dolarja, rublja ali evra.

def get_update_keyboard(ex): tipkovnica = 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']) ) vrni tipkovnico

Včasih morate videti, koliko se je menjalni tečaj spremenil v kratkem času. Napišimo dve metodi za gumb Posodobi, da bodo uporabniki lahko primerjali tečaje.

Razlika med menjalnimi tečaji se posreduje serializatorju prek parametra diff.

Predpisani načini delujejo šele po posodobitvi podatkov, ne bodo vplivali na prvi prikaz proge.

def serialize_ex(ex_json, diff=None): rezultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Nakup: ' + ex_json['buy'] if diff: rezultat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Prodaja: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: rezultat += 'nSell: ' + ex_json['sale'] + 'n' vrni rezultat def serialize_exchange_diff(diff): rezultat = '' if diff > 0: rezultat = '(' + 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: rezultat = '(' + 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">)' vrni rezultat

Predstavljajte si, da je obiskovalec želel izvedeti tečaj dolarja. Evo, kaj se zgodi, če v sporočilu izberete USD:

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

8. korak: Implementacija upravljalnika gumba za posodobitev

Napišimo kodo za obdelavo dejanj z gumbom Posodobi in ji dodajmo del iq_callback_method. Ko se elementi programa začnejo s parametrom get, morate napisati get_ex_callback. V drugih situacijah razčlenimo JSON in poskušamo pridobiti ključ 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) razen ValueError: pass

Če je t enako u, boste morali napisati program za metodo edit_message_callback. Razčlenimo ta postopek korak za korakom:

  1. Prenos najnovejših informacij o stanju na valutnem trgu (exchange_now = pb.get_exchange(data['c']).
  1. Pisanje novega sporočila prek serializatorja z diff.
  2. Dodajanje podpisa (get_edited_signature).

Če se prvotno sporočilo ne spremeni, pokličite metodo 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( besedilo, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Napišimo metodo get_ex_from_iq_data za razčlenitev JSON:

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': exc_json['s'] }

Potrebovali boste še nekaj metod: na primer get_exchange_diff, ki prebere stare in nove podatke o stroških valut in prikaže razliko.

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']))) }

Zadnji, get_edited_signature, prikazuje čas, ko je bil tečaj nazadnje posodobljen.

def get_edited_signature(): vrni 'Posodobljeno ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + '(' + TIMEZONE_COMMON_NAME + ')'

Kot rezultat, posodobljeno sporočilo bota s stabilnim menjalnim tečajem izgleda takole:

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

Ob spremembi smeri se v sporočilu izpišejo razlike med vrednostmi zaradi predpisanih parametrov.

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

Korak 9: Implementacija vdelanega načina

Vgrajeni način je potreben za hitro pošiljanje informacij iz programa v kateri koli klepet - zdaj vam ni treba dodati bota v pogovor kot udeleženca. Ko uporabnik Telegrama vnese ime bota z znakom @ pred njim, se morajo možnosti pretvorbe prikazati nad vnosno vrstico. Če kliknete enega od elementov, bo bot v pogovor poslal sporočilo z rezultati in gumbi za posodobitev in pošiljanje podatkov. Ime pošiljatelja bo vsebovalo napis »prek ".

InlineQuery se posreduje v query_text prek knjižnice. Koda uporablja funkcijo answer_line za pridobivanje rezultatov iskanja kot niza podatkov in elementa inline_query_id. Uporabljamo get_exchanges, tako da bot na zahtevo najde več valut.

@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 posredujemo niz podatkov, da prek te metode vrnemo objekte iz InlineQueryResultArticle.

def get_iq_articles(exchanges): rezultat = [] za exc v izmenjavah: 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='Pretvori ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) vrni rezultat

Zdaj, če napišete @ in presledek v vrstici, se na zaslonu prikažejo rezultati iskanja – možnosti pretvorbe v tri razpoložljive valute.

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

Uporabniki lahko filtrirajo rezultate z vnosom želene valute.

Po kliku na želeno valuto s seznama klepet prejme isto sporočilo kot uporabniki botov. Uporabite lahko tudi gumb Posodobi. Spodnja slika prikazuje posodobljeno sporočilo, poslano prek bota:

Telegram bot v Pythonu. Popoln vodnik za pisanje bota z menjalnimi tečaji iz nič

zaključek

Zdaj veste, kako ustvariti bota za Telegram. V svoj program lahko dodate uporabna orodja: gumbe za posodabljanje in pošiljanje rezultatov drugim uporabnikom messengerja in vgrajeni način, ki vam omogoča uporabo funkcij bota zunaj klepeta z njim. Na podlagi tega navodila lahko ustvarite katerega koli preprostega bota z drugimi funkcijami - ne samo tistega, ki bo prikazoval menjalne tečaje. Ne bojte se eksperimentirati s knjižnicami, API-ji in kodo, da ustvarite avtomatiziranega pomočnika, ki bo klepetal s strankami na Telegramu in okrepil povezavo zainteresiranih ljudi s podjetjem.

kako 1

  1. Fantástica publicación

Pustite Odgovori