Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Botovi u Telegramu su programi koji pomažu u uspostavljanju kontakta s publikom ili pojednostavljuju radnje koje su se prethodno morale izvoditi ručno. Ovi su programi napisani posebno za platformu za slanje poruka. Botovi rade na sljedeći način: korisnik šalje naredbu kroz ulaznu liniju, a sustav odgovara tekstualnom ili interaktivnom porukom. Ponekad program čak imitira radnje stvarne osobe - takav bot potiče više povjerenja među korisnicima.

Postoji nekoliko vrsta sustava za automatsku pomoć korisnicima. Neki botovi samo komuniciraju s kupcima, drugi redovito daju informacije. Nemoguće je jasno podijeliti programe u vrste - programeri često kombiniraju nekoliko funkcija u jednom botu.

Jednostavan bot za Telegram s interaktivnim elementima u obliku gumba na ekranu možete napisati u 9 koraka. Pogledajmo svaki od njih pobliže i odgovorimo na nekoliko pitanja:

  • kako pokrenuti bota;
  • kako registrirati ugrađenu tipkovnicu s jedne ili više tipki;
  • kako programirati tipke za željene funkcije;
  • što je inline mod i kako ga postaviti za postojećeg bota.

Korak 0: teorijska pozadina o API-ju Telegram botova

Glavni alat koji se koristi za stvaranje Telegram botova je HTML Application Programming Interface ili HTML API. Ovaj element prihvaća zahtjeve posjetitelja i šalje odgovore u obliku informacija. Gotovi dizajni pojednostavljuju rad na programu. Da biste napisali bota za Telegram, morate koristiti ovu adresu e-pošte: https://api.telegram.org/bot/METHOD_NAME

Za ispravan rad bota potreban je i token – kombinacija znakova koja štiti program i otvara mu pristup programerima od povjerenja. Svaki token je jedinstven. Niz se dodjeljuje botu nakon izrade. Metode mogu biti različite: getUpdates, getChat i druge. Izbor metode ovisi o tome kakav algoritam programeri očekuju od bota. Primjer tokena:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

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

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

Rezultat će se dobiti ako ok jednak istinski. U suprotnom, sustav će prikazati grešku.

Postoje dva načina za dobivanje prilagođenih poruka u botovima. Obje metode su učinkovite, ali su prikladne u različitim slučajevima. Da biste dobili poruke, možete ručno napisati zahtjev metodom getUpdates – program će na zaslonu prikazati niz podataka za ažuriranje. Zahtjevi se moraju slati redovito, nakon analize svakog niza slanje se ponavlja. Pomak je parametar koji određuje broj preskočenih zapisa prije učitavanja novog rezultata kako bi se izbjeglo ponovno pojavljivanje označenih objekata. Prednosti metode getUpdates doći će do izražaja ako:

  • ne postoji način za konfiguriranje HTTPS-a;
  • koriste se složeni skriptni jezici;
  • bot poslužitelj se mijenja s vremena na vrijeme;
  • bot je pun korisnika.

Druga metoda koja se može napisati za primanje korisničkih poruka je setWebhook. Koristi se jednom, nema potrebe stalno slati nove zahtjeve. Web-dojavnik š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;
  • poslužitelj se ne mijenja, program ostaje na istom poslužitelju duže vrijeme.

U daljnjim uputama koristit ćemo getUpdates.

Usluga @BotFather Telegram dizajnirana je za stvaranje chat botova. Kroz ovaj sustav postavljaju se i osnovne postavke – BotFather će vam pomoći da napravite opis, stavite profilnu sliku, dodate alate za podršku. Biblioteke – skupovi HTML zahtjeva za Telegram botove – dostupne su na internetu, ima ih dosta. Prilikom izrade primjera programa korišten je pyTelegramBotApi.

Korak 1: Implementacija zahtjeva za devizni tečaj

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

  • load_exchange – pronalazi tečajeve i prikazuje kodirane informacije;
  • get_exchange – prikazuje podatke o određenoj valuti;
  • get_exchanges – prikazuje popis valuta prema uzorku.

Kao rezultat toga, kôd 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): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in 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", kupnja:"25.90000", prodaja:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", kupnja:"29.10000", prodaja:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", kupnja:"0.37800", prodaja:"0.41800" }, { ccy:"BTC", base_ccy:"USD", kupovina:"11220.0384", prodaja: "12401.0950" } ]

Korak 2: Stvorite Telegram Bot s @BotFather

Možete izraditi program za primanje poruka i odgovaranje na njih pomoću usluge @BotFather. Idite na njegovu Telegram stranicu i unesite naredbu /newbot. U chatu će se pojaviti upute prema kojima prvo morate napisati ime bota, a zatim njegovu adresu. Kada se kreira bot račun, na ekranu će se pojaviti poruka dobrodošlice koja sadrži token. Za daljnju konfiguraciju koristite ove naredbe:

  • /setdescription – opis;
  • /setabouttext – informacije o novom botu;
  • /setuserpic – profilna slika;
  • /setinline – inline način rada;
  • /setcommands – opis naredbi.

U zadnjem koraku konfiguracije opisujemo /help i /exchange. Kada su svi koraci dovršeni, vrijeme je da prijeđ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 svog botaTIMEZONE = 'Europa/Kijev' TIMEZONE_COMMON_NAME = 'Kijev'

Zatim stvaramo drugu datoteku s uvozom prethodno napisanog pb.py, biblioteka i ostalih potrebnih komponenti. Knjižnice koje nedostaju instalirane su iz sustava 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 izradu bota. Primljeni token šaljemo pomoću sljedećeg koda:

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

Parametar none_stop osigurava stalno slanje zahtjeva. Pogreške metode neće utjecati na rad parametra.

Korak 4: Napišite rukovatelj naredbama /start

Ako su svi prethodni koraci ispravno napravljeni, bot je počeo raditi. Program redovito generira zahtjeve jer koristi metodu getUpdates. Prije retka 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 tečajeve.n' + 'Da biste saznali tečajeve pritisnite / exchange.n' + 'Za pomoć pritisnite /help.' )

RџSЂRo naredbe=['start'] jednako True poziva se start_command. Sadržaj poruke ide tamo. Zatim trebate implementirati funkciju slanja_poruka u odnosu na određenu poruku.

Korak 5: Napravite rukovatelj naredbom /help

Naredba /help može se implementirati kao gumb. Klikom na njega, korisnik će biti prebačen na Telegram račun programera. Dodijelite naziv gumbu, primjerice "Pitajte programera". Postavite parametar reply_markup, koji preusmjerava korisnika na vezu, za metodu send_message. Napišimo u kodu parametar koji kreira tipkovnicu (InlineKeyboardMarkup). Potreban vam je samo jedan gumb (InlineKeyboardButton).

Konačni kod obrađivača naredbi izgleda ovako:

@bot.message_handler(commands=['help']) def help_command(message): tipkovnica = 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 popisa dostupnih valuta pritisnite /exchange.n' + '2) Kliknite na valutu koja vas zanima.n' + '3) Vi primit će poruku koja sadrži informacije o izvoru i ciljanim valutama, ' + 'kupovni tečajevi i prodajni tečajevi.n' + '4) Kliknite na “Ažuriraj” za primanje trenutnih informacija u vezi sa zahtjevom. ' + 'Bot će također pokazati razliku između prethodnog i trenutnog tečaja.n' + '5) Robot podržava inline. Upišite @ u bilo kojem chatu i prva slova valute.', reply_markup=tipkovnica )

Radnja koda u Telegram chatu:

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Korak 6: Dodavanje rukovatelja naredbama /exchange

Ovaj korak je potreban za prikaz gumba sa simbolima dostupnih valuta u chatu. Zaslonska tipkovnica s opcijama pomoći će vam da izbjegnete pogreške. PrivatBank pruža informacije o rublji, dolaru i euru. Opcija InlineKeyboardButton radi ovako:

  1. Korisnik klikne na gumb sa željenom oznakom.
  2. getUpdates prima povratni poziv (CallbackQuery).
  3. Postaje poznato kako postupati s pritiskom na tipkovnicu - prenosi se informacija o pritisnutom gumbu.

/šifra rukovatelja razmjene:

@bot.message_handler(commands=['exchange']) def exchange_command(message): tipkovnica = 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=tipkovnica )

Rezultat koda u Telegramu:

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Korak 7: Pisanje rukovatelja za ugrađene gumbe tipkovnice

Paket pyTelegramBot Api sadrži funkciju dekoratora @bot.callback_query_handler. Ova je komponenta dizajnirana za prevođenje povratnog poziva u funkciju – API razmotava i ponovno stvara 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 pritiskanja gumba i prikaza rezultata na zaslonu. Možete poslati poruku send_exchange_query prosljeđivanjem koda valute i poruke. 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_keyboard(ex) ), parse_mode='HTML' )

Dok chatbot prima rezultat zahtjeva od banke API, posjetitelj vidi natpis "upisivanje poruke". Čini se kao da odgovara stvarna osoba. Da biste prikazali takav indikator na zaslonu, morat ćete dodati retke statusa unosa. Zatim ćemo koristiti get_exchange - uz njegovu pomoć program će dobiti oznaku valute (rubalje, eure ili dolare). send_message koristi dodatne metode: serialize_ex pretvara valutu u drugi format, a get_update_keyboard postavlja programske tipke koje ažuriraju informacije i šalju podatke o valutnom tržištu drugim chatovima.

Napišimo kod za get_update_keyboard. Treba spomenuti dva gumba – t i e označavaju tip i razmjenu. Stavka switch_inline_query za gumb Dijeli potrebna je kako bi korisnik mogao birati između nekoliko razgovora. Posjetitelj će moći odabrati kome će poslati trenutni tečaj dolara, rublje ili eura.

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']) ) vrati tipkovnicu

Ponekad je potrebno vidjeti koliko se tečaj promijenio u kratkom vremenu. Napišimo dvije metode za gumb Ažuriraj kako bi korisnici mogli vidjeti tečajeve u usporedbi.

Razlika između tečajeva prosljeđuje se serijalizatoru preko parametra diff.

Propisane metode rade tek nakon ažuriranja podataka, neće utjecati na prvi prikaz tečaja.

def serialize_ex(ex_json, diff=None): rezultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Kupi: ' + ex_json['kupi'] if diff: rezultat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Prodaj: ' + 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: 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 posjetitelj želi znati tečaj dolara. Evo što se događa ako u poruci odaberete USD:

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Korak 8: Implementacija rukovatelja gumbom ažuriranja

Napišimo kod za rukovanje akcijama s gumbom Ažuriraj i dodajmo mu dio iq_callback_method. Kada stavke programa počinju s get parametrom, 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(query) osim ValueError: pass

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

  1. Preuzimanje ažurnih informacija o stanju na valutnom tržištu (exchange_now = pb.get_exchange(data['c']).
  1. Pisanje nove poruke kroz serijalizator s 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_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( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Napišimo metodu get_ex_from_iq_data za raščlanjivanje JSON-a:

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

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

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

Posljednji, get_edited_signature, pokazuje vrijeme zadnjeg ažuriranja tečaja.

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

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

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Kada se tečaj promijeni, razlike između vrijednosti se prikazuju u poruci zbog propisanih parametara.

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Korak 9: Implementacija ugrađenog načina rada

Ugrađeni način rada potreban je za brzo slanje informacija iz programa u bilo koji chat - sada ne morate dodavati bota u razgovor kao sudionika. Kada korisnik Telegrama unese ime bota sa znakom @ ispred njega, opcije konverzije bi se trebale pojaviti iznad reda za unos. Ako kliknete na jednu od stavki, bot će poslati poruku razgovoru s rezultatima i gumbima za ažuriranje i slanje podataka. Ime pošiljatelja sadržavat će natpis “putem ".

InlineQuery se prosljeđuje query_text putem biblioteke. Kôd koristi funkciju answer_line za dohvaćanje rezultata pretraživanja kao niza podataka i elementa inline_query_id. Koristimo get_exchanges tako da bot pronalazi nekoliko valuta na zahtjev.

@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)) )

Prosljeđujemo niz podataka get_iq_articles kako bismo vratili objekte iz InlineQueryResultArticle putem ove metode.

def get_iq_articles(exchanges): result = [] za exc u razmjenama: 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 ) ) vratiti rezultat

Sad, ako napišeš @ i razmaka u retku, na ekranu će se pojaviti rezultati pretraživanja – opcije za pretvaranje u tri dostupne valute.

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Korisnici mogu filtrirati rezultate unosom željene valute.

Nakon klika na željenu valutu s popisa, chat dobiva istu poruku koju primaju korisnici bota. Također možete koristiti gumb Ažuriraj. Slika ispod prikazuje ažuriranu poruku poslanu putem bota:

Telegram bot u Pythonu. Kompletan vodič za pisanje bota s tečajevima od nule

Zaključak

Sada znate kako napraviti bota za Telegram. U svoj program možete dodati korisne alate: gumbe za ažuriranje i slanje rezultata drugim korisnicima glasnika i ugrađeni način rada koji vam omogućuje korištenje funkcija bota izvan razgovora s njim. Na temelju ove upute možete stvoriti bilo koji jednostavan bot s drugim funkcijama - ne samo onaj koji će prikazivati ​​tečajeve. Nemojte se bojati eksperimentirati s bibliotekama, API-jima i kodom kako biste stvorili automatiziranog pomoćnika koji će razgovarati s korisnicima na Telegramu i ojačati vezu zainteresiranih ljudi s tvrtkom.

Kako 1

  1. Fantastica publicación

Ostavi odgovor