Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Boții din Telegram sunt programe care ajută la stabilirea contactului cu publicul sau simplifică acțiunile care anterior trebuiau efectuate manual. Aceste programe sunt scrise special pentru platforma de mesagerie. Boții funcționează în acest fel: utilizatorul trimite o comandă prin linia de intrare, iar sistemul răspunde cu un mesaj text sau interactiv. Uneori, programul chiar imită acțiunile unei persoane reale – un astfel de bot inspiră mai multă încredere clienților.

Există mai multe tipuri de sisteme de asistență automată a utilizatorilor. Unii roboți comunică doar cu clienții, alții oferă în mod regulat informații. Este imposibil să împărțiți în mod clar programele în tipuri - dezvoltatorii combină adesea mai multe funcții într-un singur bot.

Puteți scrie un bot simplu pentru Telegram cu elemente interactive sub formă de butoane pe ecran în 9 pași. Să ne uităm la fiecare dintre ele în detaliu și să răspundem la câteva întrebări:

  • cum să porniți un bot;
  • cum să înregistrați o tastatură încorporată de la unul sau mai multe butoane;
  • modul de programare a butoanelor pentru funcțiile dorite;
  • ce este modul inline și cum să îl configurați pentru un bot existent.

Pasul 0: fundal teoretic despre API-ul telegramei

Instrumentul principal folosit pentru a crea roboți Telegram este interfața de programare a aplicațiilor HTML sau API-ul HTML. Acest element acceptă cererile vizitatorilor și trimite răspunsuri sub formă de informații. Modelele gata făcute simplifică munca la program. Pentru a scrie un bot pentru Telegram, trebuie să utilizați această adresă de e-mail: https://api.telegram.org/bot/METHOD_NAME

Pentru funcționarea corectă a botului, este nevoie și de un token – o combinație de caractere care protejează programul și deschide accesul la acesta dezvoltatorilor de încredere. Fiecare jeton este unic. Șirul este atribuit botului la creare. Metodele pot fi diferite: getUpdates, getChat și altele. Alegerea metodei depinde de ce algoritm se așteaptă dezvoltatorii de la bot. Exemplu de simbol:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Boții folosesc solicitări GET și POST. Parametrii metodei trebuie să fie deseori completați – de exemplu, atunci când metoda sendMessage ar trebui să trimită id-ul de chat și ceva text. Parametrii pentru rafinarea metodei pot fi transmiși ca șir de interogare URL folosind application/x-www-form-urlencoded sau prin application-json. Aceste metode nu sunt potrivite pentru descărcarea fișierelor. De asemenea, este necesară codarea UTF-8. Trimițând o solicitare către API, puteți obține rezultatul în format JSON. Aruncă o privire la răspunsul programului la preluarea informațiilor prin metoda getME:

GET https://api.telegram.org/bot/getMe{ ok: adevărat, rezultat: { id: 231757398, first_name: „Exchange Rate Bot”, nume de utilizator: „exchangetestbot” } }

Rezultatul se va obține dacă ok este egală adevărat. În caz contrar, sistemul va indica o eroare.

Există două moduri de a primi mesaje personalizate în roboți. Ambele metode sunt eficiente, dar sunt potrivite în cazuri diferite. Pentru a primi mesaje, puteți scrie manual o solicitare cu metoda getUpdates – programul va afișa pe ecran matricea de date Actualizare. Solicitările trebuie trimise în mod regulat, după analizarea fiecărei matrice, trimiterea se repetă. Offset este un parametru care determină numărul de înregistrări ignorate înainte de a încărca un nou rezultat pentru a evita reapariția obiectelor verificate. Beneficiile metodei getUpdates vor intra în joc dacă:

  • nu există nicio modalitate de a configura HTTPS;
  • sunt utilizate limbaje de scripting complexe;
  • serverul bot se schimbă din când în când;
  • bot-ul este încărcat cu utilizatori.

A doua metodă care poate fi scrisă pentru a primi mesajele utilizatorului este setWebhook. Este folosit o singură dată, nu este nevoie să trimiteți constant solicitări noi. Webhook-ul trimite actualizări de date la adresa URL specificată. Această metodă necesită un certificat SSL. Webhook va fi util în aceste cazuri:

  • se folosesc limbaje de programare web;
  • botul nu este supraîncărcat, nu sunt prea mulți utilizatori;
  • serverul nu se schimbă, programul rămâne mult timp pe același server.

În instrucțiuni suplimentare, vom folosi getUpdates.

Serviciul @BotFather Telegram este conceput pentru a crea roboti de chat. Setările de bază sunt, de asemenea, stabilite prin acest sistem – BotFather vă va ajuta să faceți o descriere, să puneți o fotografie de profil, să adăugați instrumente de asistență. Bibliotecile – seturi de solicitări HTML pentru roboții Telegram – sunt disponibile pe Internet, sunt destul de multe. La crearea programului exemplu, a fost folosit pyTelegramBotApi.

Pasul 1: Implementarea cererilor de curs valutar

Mai întâi trebuie să scrieți codul care efectuează interogări. Vom folosi atunci când scriem API-ul PrivatBank, mai jos este un link către acesta: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Trebuie să utilizați aceste metode în codul dvs.:

  • load_exchange – găsește cursurile de schimb și afișează informații codificate;
  • get_exchange – afișează date despre o anumită monedă;
  • get_exchanges – arată lista valutelor conform eșantionului.

Drept urmare, codul din fișierul pb.py arată astfel:

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 ): pentru exc în load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): rezultat = [] ccy_pattern = re.escape(ccy_pattern) + '.*' pentru exc în load_exchange(): dacă re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nu este Niciunul: result.append(exc) returnează rezultatul

Programul poate emite următorul răspuns la solicitările specificate:

[ { ccy:"USD", base_ccy:"UAH", cumpara:"25.90000", reducere:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", cumpara:"29.10000", reducere:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", cumpara:"0.37800", reducere:"0.41800" }, { ccy:"BTC", base_ccy:"USD", cumpara:"11220.0384", reducere: „12401.0950” } ]

Pasul 2: Creați un bot Telegram cu @BotFather

Puteți crea un program pentru a primi mesaje și a răspunde la ele folosind serviciul @BotFather. Accesați pagina lui Telegram și introduceți comanda /newbot. În chat vor apărea instrucțiuni, conform cărora trebuie să scrieți mai întâi numele botului și apoi adresa acestuia. Când contul bot este creat, pe ecran va apărea un mesaj de bun venit care conține un simbol. Pentru o configurare suplimentară, utilizați aceste comenzi:

  • /setdescription – descriere;
  • /setabouttext – informații despre noul bot;
  • /setuserpic – fotografie de profil;
  • /setinline – modul inline;
  • /setcommands – descrierea comenzilor.

La ultimul pas de configurare, descriem /help și /exchange. Când toți pașii au fost finalizați, este timpul să treceți la codare.

Pasul 3: Configurarea și lansarea botului

Să creăm un fișier config.py. În acesta, trebuie să specificați codul bot unic și fusul orar în care programul va găsi informații.

JETON = '' # înlocuiți cu simbolul botului dvs.TIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Apoi, creăm un alt fișier cu importul pb.py scris anterior, biblioteci și alte componente necesare. Bibliotecile lipsă sunt instalate din sistemul de management al pachetelor (pip).

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

Să folosim conținutul pyTelegramBotApi pentru a crea un bot. Trimitem jetonul primit folosind următorul cod:

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

Parametrul none_stop asigură că cererile sunt trimise în mod constant. Funcționarea parametrului nu va fi afectată de erori de metodă.

Pasul 4: Scrieți manerul de comandă /start

Dacă toți pașii anteriori sunt executați corect, botul a început să funcționeze. Programul generează solicitări în mod regulat deoarece folosește metoda getUpdates. Înainte de linia cu elementul none_stop, avem nevoie de o bucată de cod care procesează comanda /start:

@bot.message_handler(commands=['start']) def start_command(mesaj): bot.send_message( message.chat.id, „Salut! Vă pot arăta ratele de schimb.n” + „Pentru a obține cursurile de schimb, apăsați / exchange.n" + „Pentru a obține ajutor, apăsați /help.' )

RџSЂRo comenzi=['pornire'] egal cu True start_command este apelată. Conținutul mesajului merge acolo. Apoi, trebuie să implementați funcția de trimitere_mesaj în legătură cu un anumit mesaj.

Pasul 5: Creați un handler de comandă /help

Comanda /help poate fi implementată ca buton. Făcând clic pe el, utilizatorul va fi dus la contul Telegram al dezvoltatorului. Dați butonului un nume, cum ar fi „Întrebați dezvoltatorul”. Setați parametrul reply_markup, care redirecționează utilizatorul către o legătură, pentru metoda send_message. Să scriem în cod parametrul care creează tastatura (InlineKeyboardMarkup). Aveți nevoie de un singur buton (InlineKeyboardButton).

Codul final de gestionare a comenzii arată astfel:

@bot.message_handler(commands=['ajutor']) def help_command(mesaj): tastatură = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Întreabă dezvoltatorul', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Pentru a primi o listă de valute disponibile apăsaţi /exchange.n' + '2) Faceţi clic pe moneda care vă interesează.n' + '3) Dvs. va primi un mesaj care va contine informatii referitoare la sursa si valutele tinta, ' + 'coste de cumparare si de vanzare.n' + '4) Faceti clic pe “Actualizare” pentru a primi informatiile curente referitoare la cerere. ' + 'Botul va arăta și diferența dintre cursul de schimb anterior și curent.n' + '5) Botul acceptă inline. Tip @ în orice chat și primele litere ale unei monede.', reply_markup=keyboard )

Acțiunea codului în chatul Telegram:

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Pasul 6: Adăugarea controlului de comandă /exchange

Acest pas este necesar pentru a afișa butoanele cu simboluri ale monedelor disponibile în chat. O tastatură pe ecran cu opțiuni vă va ajuta să evitați greșelile. PrivatBank oferă informații despre rublă, dolar și euro. Opțiunea InlineKeyboardButton funcționează astfel:

  1. Utilizatorul face clic pe butonul cu denumirea dorită.
  2. getUpdates primește un apel invers (CallbackQuery).
  3. Devine cunoscut cum să se ocupe de apăsarea tastaturii – se transmit informații despre butonul apăsat.

/cod de gestionare a schimbului:

@bot.message_handler(commands=['exchange']) def exchange_command(mesaj): 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, „Faceți clic pe moneda dorită:”, reply_markup=keyboard )

Rezultatul codului din Telegram:

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Pasul 7: Scrierea unui handler pentru butoanele încorporate de la tastatură

Pachetul pyTelegramBot Api conține funcția de decorare @bot.callback_query_handler. Această componentă este concepută pentru a traduce apelul înapoi într-o funcție – API-ul dezactivează și recreează apelul. Se scrie astfel:

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

Să scriem și metoda get_ex_callback:

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

Există o altă metodă utilă – answer_callback_query. Ajută la eliminarea sarcinii între apăsarea butonului și afișarea rezultatului pe ecran. Puteți trimite un mesaj către send_exchange_query prin transmiterea unui cod de monedă și a unui mesaj. Să scriem 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' )

În timp ce chatbot-ul primește rezultatul solicitării de la bancă API, vizitatorul vede inscripția „tastând un mesaj”. Se pare că o persoană reală răspunde. Pentru a afișa un astfel de indicator pe ecran, va trebui să adăugați linii de stare de intrare. În continuare, vom folosi get_exchange – cu ajutorul acestuia, programul va primi desemnarea monedei (ruble, euro sau dolari). send_message folosește metode suplimentare: serialize_ex convertește moneda într-un alt format, iar get_update_keyboard setează taste soft care actualizează informațiile și trimit datele pieței valutare către alte chat-uri.

Să scriem codul pentru get_update_keyboard. Trebuie menționate două butoane – t și e reprezintă tip și schimb. Elementul switch_inline_query pentru butonul Partajare este necesar pentru ca utilizatorul să poată alege dintre mai multe chat-uri. Vizitatorul va putea alege cui să trimită cursul de schimb curent al dolarului, rublei sau euro.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Actualizare', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['cumpărare'], 's': ex['vânzare'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Partajare', switch_inline_query=ex['ccy']) ) returnează tastatura

Uneori trebuie să vedeți cât de mult s-a schimbat cursul de schimb într-un timp scurt. Să scriem două metode pentru butonul Actualizare, astfel încât utilizatorii să poată vedea cursurile în comparație.

Diferența dintre cursurile de schimb este transmisă serializatorului prin intermediul parametrului diff.

Metodele prescrise funcționează numai după ce datele sunt actualizate, nu vor afecta prima afișare a cursului.

def serialize_ex(ex_json, diff=None): rezultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Cumpără: ' + ex_json['cumpără'] dacă dif: rezultat += '' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Vând: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' returnează rezultatul def serialize_exchange_diff(diff): rezultat = '' dacă dif > 0: rezultat = '(' + str(dif) + ' " 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">)" returnează rezultatul

Imaginați-vă că vizitatorul a vrut să cunoască cursul de schimb al dolarului. Iată ce se întâmplă dacă selectați USD în mesaj:

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Pasul 8: Implementarea handlerului de buton de actualizare

Să scriem codul pentru gestionarea acțiunilor cu butonul Actualizare și să adăugăm partea iq_callback_method la acesta. Când elementele programului încep cu parametrul get, trebuie să scrieți get_ex_callback. În alte situații, analizăm JSON și încercăm să obținem cheia 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) except ValueError: pass

Dacă t este egal cu u, va trebui să scrieți un program pentru metoda edit_message_callback. Să descompunem acest proces pas cu pas:

  1. Descărcarea informațiilor actualizate despre starea pieței valutare (exchange_now = pb.get_exchange(data['c']).
  1. Scrierea unui mesaj nou printr-un serializator cu diff.
  2. Adăugarea unei semnături (get_edited_signature).

Dacă mesajul inițial nu se modifică, apelați metoda edit_message_text.

def edit_message_callback(interogare): 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' )

Să scriem metoda get_ex_from_iq_data pentru a analiza JSON:

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

Veți avea nevoie de încă câteva metode: de exemplu, get_exchange_diff, care citește informațiile vechi și noi despre costul valutelor și afișează diferența.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(acum['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(acum['cumpără']) - float(ultimul['cumpără']))) }

Ultimul, get_edited_signature, arată ora la care cursul a fost actualizat ultima dată.

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

Ca urmare, mesajul actualizat de la bot cu un curs de schimb stabil arată astfel:

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Când cursul se schimbă, diferențele dintre valori sunt afișate în mesaj datorită parametrilor prescriși.

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Pasul 9: Implementarea modului încorporat

Modul încorporat este necesar pentru a trimite rapid informații din program către orice chat - acum nu trebuie să adăugați un bot la conversație ca participant. Când un utilizator Telegram introduce un nume de bot cu un semn @ în fața acestuia, opțiunile de conversie ar trebui să apară deasupra liniei de introducere. Dacă faceți clic pe unul dintre elemente, botul va trimite un mesaj la conversație cu rezultatele și butoanele pentru actualizarea și trimiterea datelor. Numele expeditorului va conține legenda „via ".

InlineQuery este transmis către query_text prin intermediul bibliotecii. Codul folosește funcția answer_line pentru a prelua rezultatele căutării ca o matrice de date și elementul inline_query_id. Folosim get_exchanges, astfel încât botul să găsească mai multe valute la cerere.

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

Trecem o serie de date către get_iq_articles pentru a returna obiecte din InlineQueryResultArticle prin această metodă.

def get_iq_articles(exchanges): rezultat = [] pentru exc în schimburi: 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='Convertire ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) returnează rezultatul

Acum, dacă scrii @ și un spațiu în linie, rezultatele căutării vor apărea pe ecran – opțiuni de conversie în trei monede disponibile.

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Utilizatorii pot filtra rezultatele introducând moneda dorită.

După ce faceți clic pe moneda dorită din listă, chatul primește același mesaj pe care îl primesc utilizatorii bot. De asemenea, puteți utiliza butonul Actualizare. Imaginea de mai jos arată mesajul actualizat trimis prin bot:

Botul Telegram în Python. Un ghid complet pentru scrierea unui bot cu rate de schimb de la zero

Concluzie

Acum știi cum să creezi un bot pentru Telegram. Puteți adăuga instrumente utile programului dvs.: butoane pentru actualizarea și trimiterea rezultatului către alți utilizatori ai messengerului și un mod încorporat care vă permite să utilizați funcțiile botului în afara chat-ului cu acesta. Pe baza acestei instrucțiuni, puteți crea orice bot simplu cu alte funcții – nu numai cea care va afișa cursurile de schimb. Nu vă fie teamă să experimentați cu biblioteci, API-uri și cod pentru a crea un asistent automat care va discuta cu clienții pe Telegram și va consolida legătura persoanelor interesate cu compania.

1 Comentariu

  1. Publicare fantastică

Lasă un comentariu