Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Botovi u Telegramu su programi koji pomažu u uspostavljanju kontakta sa publikom ili pojednostavljuju radnje koje su se ranije morale izvoditi ručno. Ovi programi su napisani posebno za messenger platformu. Botovi rade na ovaj način: korisnik šalje komandu kroz liniju za unos, a sistem odgovara tekstualnom ili interaktivnom porukom. Ponekad program čak imitira radnje stvarne osobe - takav bot izaziva više povjerenja među kupcima.

Postoji nekoliko vrsta sistema za automatsku pomoć korisnicima. Neki botovi samo komuniciraju sa kupcima, drugi redovno daju informacije. Nemoguće je jasno podijeliti programe na tipove - programeri često kombiniraju nekoliko funkcija u jednom botu.

Možete napisati jednostavan bot za Telegram sa interaktivnim elementima u obliku dugmadi na ekranu u 9 koraka. Pogledajmo svaki od njih detaljno i odgovorimo na nekoliko pitanja:

  • kako pokrenuti bot;
  • kako registrovati ugrađenu tastaturu sa jednog ili više tastera;
  • kako programirati dugmad za željene funkcije;
  • šta je inline mod i kako ga postaviti za postojećeg bota.

Korak 0: teorijska pozadina o API-ju za Telegram botove

Glavni alat koji se koristi za kreiranje Telegram botova je HTML Application Programming Interface, ili HTML API. Ovaj element prihvata zahtjeve posjetitelja i šalje odgovore u obliku informacija. Gotovi dizajni pojednostavljuju rad na programu. Da biste napisali bota za Telegram, potrebno je da koristite ovu email adresu: https://api.telegram.org/bot/METHOD_NAME

Za ispravno funkcioniranje bota potreban je i token – kombinacija znakova koja štiti program i otvara pristup njemu pouzdanim programerima. Svaki token je jedinstven. String se dodjeljuje botu prilikom kreiranja. Metode mogu biti različite: getUpdates, getChat i druge. Izbor metode zavisi od toga koji algoritam programeri očekuju od bota. Primjer tokena:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Botovi koriste GET i POST zahtjeve. Parametri metode često moraju da se dopunjuju – na primer, kada metoda sendMessage treba da pošalje ID za ćaskanje i neki tekst. Parametri za preciziranje metode mogu se proslijediti kao URL upitni niz koristeći application/x-www-form-urlencoded ili putem application-json. Ove metode nisu prikladne za preuzimanje datoteka. UTF-8 kodiranje je također potrebno. Slanjem zahtjeva API-ju možete dobiti rezultat u JSON formatu. Pogledajte odgovor programa na dohvaćanje informacija putem getME metode:

NABAVITE https://api.telegram.org/bot/getMe{ ok: istina, rezultat: { id: 231757398, first_name: "Razmjenski bot", korisničko ime: "exchangetestbot" } }

Rezultat će se dobiti ako ok jednako istinski. U suprotnom, sistem će pokazati grešku.

Postoje dva načina da dobijete prilagođene poruke u botovima. Obje metode su efikasne, ali su prikladne u različitim slučajevima. Da biste dobili poruke, možete ručno napisati zahtjev metodom getUpdates – program će prikazati Ažuriraj niz podataka na ekranu. Zahtjevi se moraju slati redovno, nakon analize svakog niza slanje se ponavlja. Offset je parametar koji određuje broj preskočenih zapisa prije učitavanja novog rezultata kako bi se izbjeglo ponovno pojavljivanje provjerenih objekata. Prednosti metode getUpdates će doći do izražaja ako:

  • ne postoji način da se konfiguriše HTTPS;
  • koriste se složeni skriptni jezici;
  • bot server se menja s vremena na vreme;
  • bot je napunjen korisnicima.

Drugi metod koji se može napisati za primanje korisničkih poruka je setWebhook. Koristi se jednom, nema potrebe za konstantnim slanjem novih zahtjeva. Webhook šalje ažuriranja podataka na navedeni URL. Ova metoda zahtijeva SSL certifikat. Webhook će biti koristan u ovim slučajevima:

  • koriste se web programski jezici;
  • bot nije preopterećen, nema previše korisnika;
  • server se ne menja, program ostaje na istom serveru dugo vremena.

U daljnjim uputama koristit ćemo getUpdates.

Usluga @BotFather Telegram je dizajnirana za kreiranje chat botova. Kroz ovaj sistem se postavljaju i osnovna podešavanja – BotFather će vam pomoći da napravite opis, stavite sliku profila, dodate alate za podršku. Biblioteke – skupovi HTML zahtjeva za Telegram botove – dostupni su na Internetu, ima ih dosta. Prilikom kreiranja primjera programa korišten je pyTelegramBotApi.

Korak 1: Implementacija zahtjeva za deviznim kursom

Prvo morate napisati kod koji izvršava upite. Koristićemo pri pisanju PrivatBank API-ja, u nastavku je link do njega: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Morate koristiti ove metode u svom kodu:

  • load_exchange – pronalazi kurseve i prikazuje kodirane informacije;
  • get_exchange – prikazuje podatke o određenoj valuti;
  • get_exchanges – prikazuje listu valuta prema uzorku.

Kao rezultat, kod u datoteci pb.py izgleda ovako:

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 u load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): rezultat = [] ccy_pattern = re.escape(ccy_pattern) + '.*' za exc u load_exchange(): ako re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nije Ništa: result.append(exc) vrati rezultat

Program može izdati sljedeći odgovor na navedene zahtjeve:

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

Korak 2: Kreirajte Telegram bota sa @BotFather

Pomoću usluge @BotFather možete kreirati program za primanje poruka i odgovaranje na njih. Idite na njegovu Telegram stranicu i unesite komandu /newbot. U chatu će se pojaviti instrukcije prema kojima prvo morate zapisati ime bota, a zatim njegovu adresu. Kada se bot nalog kreira, na ekranu će se pojaviti poruka dobrodošlice koja sadrži token. Za dalju konfiguraciju koristite ove naredbe:

  • /setdescription – opis;
  • /setabouttext – informacije o novom botu;
  • /setuserpic – fotografija profila;
  • /setinline – inline mod;
  • /setcommands – opis komandi.

U posljednjem koraku konfiguracije opisujemo /help i /exchange. Kada su svi koraci završeni, vrijeme je da pređete na kodiranje.

Korak 3: Postavljanje i pokretanje bota

Kreirajmo datoteku config.py. U njemu morate navesti jedinstveni kod bota i vremensku zonu u kojoj će program pronaći informacije.

TOKEN = '' # zamijenite tokenom vašeg botaTIMEZONE = 'Evropa/Kijev' TIMEZONE_COMMON_NAME = 'Kijev'

Zatim kreiramo još jedan fajl sa uvozom prethodno napisanog pb.py, biblioteka i ostalih potrebnih komponenti. Biblioteke koje nedostaju se instaliraju iz sistema za upravljanje paketima (pip).

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

Iskoristimo sadržaj pyTelegramBotApi za kreiranje bota. Primljeni token šaljemo koristeći sljedeći kod:

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

Parametar none_stop osigurava da se zahtjevi stalno šalju. Greške metode neće utjecati na rad parametra.

Korak 4: Napišite /start rukovao komandom

Ako su svi prethodni koraci urađeni ispravno, bot je počeo sa radom. Program redovno generiše zahtjeve jer koristi metodu getUpdates. Prije reda s elementom none_stop, potreban nam je dio koda koji obrađuje naredbu /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Pozdrav! Mogu vam pokazati kurseve.n' + 'Da dobijete kurseve pritisnite / exchange.n' + 'Da dobijete pomoć pritisnite /help.')

RџSĐRë commands=['start'] jednako Tačno start_command se poziva. Sadržaj poruke ide tamo. Zatim morate implementirati funkciju slanja_message u odnosu na određenu poruku.

Korak 5: Kreirajte /help rukovatelj naredbama

Komanda /help se može implementirati kao dugme. Klikom na njega, korisnik će biti preusmjeren na Telegram račun programera. Dajte dugmetu ime, kao što je „Pitajte programera“. Postavite parametar reply_markup, koji preusmjerava korisnika na vezu, za metodu send_message. Upišimo u kod parametar koji kreira tastaturu (InlineKeyboardMarkup). Treba vam samo jedno dugme (InlineKeyboardButton).

Konačni kod rukovaoca komandom izgleda ovako:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Pitajte programera', url='vaša ssylka na profilʹ' ) ) bot.send_message( message.chat.id, '1) Za primanje liste dostupnih valuta pritisnite /exchange.n' + '2) Kliknite na valutu koja vas zanima.n' + '3) Vi će primiti poruku koja sadrži informacije o izvornoj i ciljnoj valuti, ' + 'kupovne stope i prodajne stope.n' + '4) Kliknite na "Ažuriraj" da biste primili trenutne informacije u vezi sa zahtjevom. ' + 'Bot će takođe pokazati razliku između prethodnog i trenutnog kursa.n' + '5) Bot podržava inline. Upišite @ u bilo kojem chatu i prva slova valute.', reply_markup=keyboard )

Akcija koda u Telegram chatu:

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Korak 6: Dodavanje rukovaoca komandama /exchange

Ovaj korak je potreban za prikaz dugmadi sa simbolima dostupnih valuta u chatu. Tastatura na ekranu sa opcijama pomoći će vam da izbjegnete greške. PrivatBank pruža informacije o rubljama, dolarima i evrima. Opcija InlineKeyboardButton funkcionira ovako:

  1. Korisnik klikne na dugme sa željenom oznakom.
  2. getUpdates prima povratni poziv (CallbackQuery).
  3. Postaje poznato kako se postupa s pritiskom na tastaturu – prenose se informacije o pritisnutom dugmetu.

/ kod rukovaoca razmjene:

@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 valutu po izboru:', reply_markup=keyboard )

Rezultat koda u Telegramu:

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Korak 7: Pisanje rukovaoca za dugmad ugrađene tastature

pyTelegramBot Api paket sadrži @bot.callback_query_handler funkciju dekoratora. Ova komponenta je dizajnirana da prevede povratni poziv u funkciju – API odmotava i ponovo kreira poziv. Piše se ovako:

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

Napišimo i metodu get_ex_callback:

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

Postoji još jedna korisna metoda – answer_callback_query. Pomaže u uklanjanju opterećenja između pritiska na dugme i prikazivanja rezultata na ekranu. Možete poslati poruku na send_exchange_query tako što ćete unijeti neki kod valute i poruku. Napišimo send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'tipkanje') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update(ex) ), parse_mode='HTML' )

Dok chatbot prima rezultat zahtjeva od banke API, posjetitelj vidi natpis „kucanje poruke“. Izgleda kao da prava osoba odgovara. Da biste prikazali takav indikator na ekranu, morat ćete dodati statusne linije unosa. Zatim ćemo koristiti get_exchange - uz njegovu pomoć program će dobiti oznaku valute (rublje, eure ili dolari). send_message koristi dodatne metode: serialize_ex konvertuje valutu u drugi format, a get_update_keyboard postavlja softverske tastere koji ažuriraju informacije i šalju podatke o tržištu valuta u druge razgovore.

Hajde da napišemo kod za get_update_keyboard. Treba spomenuti dva dugmeta – t i e označavaju tip i zamjenu. Stavka switch_inline_query za dugme Dijeli je potrebna kako bi korisnik mogao birati između nekoliko razgovora. Posetilac će moći da bira kome će poslati trenutni kurs dolara, rublje ili evra.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Ažuriranje', 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']) ) vrati tastaturu

Ponekad je potrebno da vidite koliko se kurs promenio za kratko vreme. Napišimo dvije metode za dugme Ažuriraj kako bi korisnici mogli vidjeti kurseve u poređenju.

Razlika između kurseva se prenosi na serijalizator preko parametra diff.

Propisane metode djeluju tek nakon ažuriranja podataka, neće utjecati na prvi prikaz kursa.

def serialize_ex(ex_json, diff=Ništa): rezultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Kupiti: ' + ex_json['kupiti'] if diff: rezultat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Prodati: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' ostalo: rezultat += 'nSell: ' + ex_json['sale'] + 'n' vrati 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">)' vrati rezultat

Zamislite da je posetilac želeo da sazna kurs dolara. Evo šta se dešava ako u poruci odaberete USD:

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Korak 8: Implementacija upravljača gumbom za ažuriranje

Hajde da napišemo kod za rukovanje akcijama sa dugmetom Ažuriraj i dodamo mu deo iq_callback_method. Kada stavke programa počnu sa parametrom get, morate napisati get_ex_callback. U drugim situacijama, analiziramo JSON i pokušavamo dobiti ključ t.

@bot.callback_query_handler(func=lambda poziv: 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(upit) osim ValueError: prolaz

Ako je t jednako u, morat ćete napisati program za metodu edit_message_callback. Raskinimo ovaj proces korak po korak:

  1. Preuzimanje ažuriranih informacija o stanju na tržištu valuta (exchange_now = pb.get_exchange(data['c']).
  1. Pisanje nove poruke kroz serijalizator sa diff.
  2. Dodavanje potpisa (get_edited_signature).

Ako se početna poruka ne promijeni, pozovite 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_now(data)), exchange)_ + 'n' + get_edited_signature() ako query.message: bot.edit_message_text(text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode) elif'query_HTML : bot.edit_message_text(text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML')

Hajde da napišemo get_ex_from_iq_data metodu da analiziramo JSON:

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

Trebat će vam još nekoliko metoda: na primjer, get_exchange_diff, koji čita stare i nove informacije o cijeni valuta i prikazuje razliku.

def get_exchange_diff(last, sada): return { 'sale_diff': float("%.6f" % (float(sada['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(sada['buy']) - float(last['buy']))) }

Posljednji, get_edited_signature, pokazuje vrijeme posljednjeg ažuriranja kursa.

def get_edited_signature(): vrati 'Ažurirano ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

Kao rezultat toga, ažurirana poruka od bota sa stabilnim tečajem izgleda ovako:

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Kada se kurs promijeni, razlike između vrijednosti se prikazuju u poruci zbog propisanih parametara.

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Korak 9: Implementacija ugrađenog načina rada

Ugrađeni način rada je potreban za brzo slanje informacija iz programa na bilo koji chat – sada ne morate da dodajete bota u razgovor kao učesnika. Kada korisnik Telegrama unese ime bota sa znakom @ ispred njega, opcije konverzije bi se trebale pojaviti iznad linije za unos. Ako kliknete na jednu od stavki, bot će poslati poruku razgovoru sa rezultatima i dugmadima za ažuriranje i slanje podataka. Ime pošiljaoca će sadržavati natpis „preko ".

InlineQuery se prosljeđuje query_text preko biblioteke. Kod koristi funkciju answer_line za dohvaćanje rezultata pretraživanja kao niza podataka i elementa inline_query_id. Koristimo get_exchanges tako da bot pronađe nekoliko valuta na zahtjev.

@bot.inline_handler(func=lambda upit: Tačno) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Mi prosljeđujemo niz podataka get_iq_articles da bismo kroz ovu metodu vratili objekte iz InlineQueryResultArticle.

def get_iq_articles(exchanges): rezultat = [] za exc u razmjenama: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessage ( serialize_ex(exc), parse_mode='HTML'), reply_markup=get_update_keyboard(exc), description='Pretvori ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) vratiti rezultat

Sada, ako napišete @ i razmak u redu, rezultati pretrage će se pojaviti na ekranu – opcije za konverziju u tri dostupne valute.

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

Korisnici mogu filtrirati rezultate unosom željene valute.

Nakon klika na željenu valutu sa liste, chat dobija istu poruku koju primaju korisnici bota. Takođe možete koristiti dugme Ažuriraj. Slika ispod prikazuje ažuriranu poruku poslanu preko bota:

Telegram bot u Pythonu. Potpuni vodič za pisanje bota sa deviznim kursevima od nule

zaključak

Sada znate kako napraviti bota za Telegram. U svoj program možete dodati korisne alate: dugmad za ažuriranje i slanje rezultata drugim korisnicima messengera i ugrađeni način rada koji vam omogućava da koristite funkcije bota izvan razgovora s njim. Na osnovu ovog uputstva možete kreirati bilo koji jednostavan bot sa drugim funkcijama – ne samo onaj koji će prikazivati ​​kurseve. Nemojte se plašiti eksperimentisanja sa bibliotekama, API-jem i kodom kako biste kreirali automatizovanog pomoćnika koji će razgovarati sa korisnicima na Telegramu i ojačati vezu zainteresovanih ljudi sa kompanijom.

1 Komentar

  1. Fantástica publicación

Ostavite odgovor