Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Bots in Telegram sò prugrammi chì aiutanu à stabilisce u cuntattu cù l'audienza o simplificà l'azzioni chì prima avianu da esse realizatu manualmente. Questi prugrammi sò scritti apposta per a piattaforma di messageria. I bots funzionanu in questu modu: l'utilizatore manda un cumandamentu attraversu a linea di input, è u sistema risponde cù un testu o missaghju interattivu. A volte u prugramma imita ancu l'azzioni di una persona reale - un tali bot inspira più fiducia trà i clienti.

Ci sò parechji tippi di sistemi per l'assistenza automatica à l'utilizatori. Certi bots solu cumunicà cù i clienti, altri furnisce regularmente informazioni. Hè impussibile di dividisce chjaramente i prugrammi in tipi - i sviluppatori spessu combinanu parechje funzioni in un bot.

Pudete scrive un bot simplice per Telegram cù elementi interattivi in ​​forma di buttuni nantu à u screnu in 9 passi. Fighjemu ognuna di elli in dettagliu è risponde à uni pochi di dumande:

  • cumu principià un bot;
  • cumu registrà un teclatu integratu da unu o più buttoni;
  • quantu à programà i buttoni per e funzioni desiderate;
  • ciò chì hè u modu inline è cumu cunfigurà per un bot esistente.

Passu 0: sfondate teorica nantu à l'API di i bots di Telegram

L'uttellu principale utilizatu per creà i bots di Telegram hè l'Interfaccia di Programmazione di l'Applicazione HTML, o API HTML. Stu elementu accetta richieste di i visitori è manda risposte in forma di informazioni. I disinni pronti simplificanu u travagliu nantu à u prugramma. Per scrive un bot per Telegram, avete bisognu di utilizà stu indirizzu email: https://api.telegram.org/bot/METHOD_NAME

Per u funziunamentu currettu di u bot, un token hè ancu necessariu - una cumminazione di caratteri chì prutegge u prugramma è apre l'accessu à i sviluppatori di fiducia. Ogni token hè unicu. A stringa hè assignata à u bot nantu à a creazione. I metudi ponu esse sfarenti: getUpdates, getChat è altri. L'scelta di u metudu dipende da quale algoritmu i sviluppatori aspettanu da u bot. Esempiu di token:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

I bots utilizanu richieste GET è POST. I paràmetri di u metudu spessu anu da esse supplementati - per esempiu, quandu u metudu sendMessage hè suppostu di mandà l'id di chat è qualchì testu. I paràmetri per a perfezione di u metudu ponu esse passati cum'è una stringa di query URL usendu application/x-www-form-urlencoded o via application-json. Questi metudi ùn sò micca adattati per scaricà i fugliali. A codificazione UTF-8 hè ancu necessaria. Mandendu una dumanda à l'API, pudete ottene u risultatu in formatu JSON. Fighjate à a risposta di u prugramma à ricuperà l'infurmazioni via u metudu getME:

GET https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Bot di tassi di scambiu", username: "exchangetestbot" } }

U risultatu serà ottenutu se ok ugguali vera. Altrimenti, u sistema indicà un errore.

Ci hè dui modi per uttene messagi persunalizati in bots. I dui metudi sò efficaci, ma sò adattati in parechji casi. Per uttene i missaghji, pudete scrive manualmente una dumanda cù u metudu getUpdates - u prugramma mostrarà a matrice di dati Update nantu à u screnu. E dumande devenu esse mandate regularmente, dopu l'analisi di ogni array, u mandatu hè ripetutu. Offset hè un paràmetru chì determina u numeru di registri saltati prima di carica un novu risultatu per evità a riapparizione di l'uggetti verificati. I benefici di u metudu getUpdates entreranu in ghjocu se:

  • ùn ci hè manera di cunfigurà HTTPS;
  • sò usati linguaggi di scrittura cumplessi;
  • u servore bot cambia da u tempu à u tempu;
  • u bot hè carricu cù utilizatori.

U sicondu metudu chì pò esse scrittu per riceve missaghji di l'utilizatori hè setWebhook. Hè aduprata una volta, ùn hè micca bisognu di mandà constantemente novi richieste. U webhook manda l'aghjurnamenti di dati à l'URL specificatu. Stu metudu richiede un certificatu SSL. Webhook serà utile in questi casi:

  • I linguaggi di prugrammazione web sò usati;
  • u bot ùn hè micca overloaded, ùn ci hè micca troppu utilizatori;
  • u servore ùn cambia micca, u prugramma ferma in u stessu servitore per un bellu pezzu.

In più struzzioni, useremu getUpdates.

U serviziu @BotFather Telegram hè pensatu per creà chat bots. I paràmetri di basa sò ancu stabiliti attraversu stu sistema - BotFather vi aiuterà à fà una descrizzione, mette una foto di prufilu, aghjunghje strumenti di supportu. Biblioteche - sette di richieste HTML per i bots di Telegram - sò dispunibuli in Internet, ci sò assai. Quandu crea u prugramma di esempiu, pyTelegramBotApi hè stata utilizata.

Passu 1: Implementazione di e dumande di tassi di scambiu

Prima avete bisognu di scrive u codice chì eseguisce e dumande. Avemu aduprà quandu scrive l'API PrivatBank, quì sottu hè un ligame à questu: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Avete bisognu di utilizà sti metudi in u vostru codice:

  • load_exchange - trova i tassi di scambiu è mostra l'infurmazioni codificate;
  • get_exchange - mostra dati nantu à una valuta specifica;
  • get_exchanges - mostra a lista di valute secondu a mostra.

In u risultatu, u codice in u schedariu pb.py s'assumiglia cusì:

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) ): for exc in 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 (): se re.match (ccy_pattern, exc ['ccy'], re.IGNORECASE) ùn hè micca Nimu: result.append (exc) turnà u risultatu

U prugramma pò emette a seguente risposta à e richieste specificate:

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

Passu 2: Crea un Telegram Bot cù @BotFather

Pudete creà un prugramma per riceve missaghji è risponde à elli cù u serviziu @BotFather. Andà à a so pagina di Telegram è entre in u cumandimu / newbot. Istruzzioni apparisceranu in u chat, secondu chì avete bisognu di scrive u nome di u bot prima, è dopu u so indirizzu. Quandu u contu bot hè creatu, un missaghju di benvenuta chì cuntene un token appariscerà nantu à u screnu. Per più cunfigurazione, utilizate questi cumandamenti:

  • /setdescription - descrizzione;
  • / setabouttext - infurmazione nantu à u novu bot;
  • /setuserpic - foto di prufilu;
  • / setinline - modalità in linea;
  • / setcommands - descrizzione di cumandamenti.

À l'ultimu passu di cunfigurazione, descrivimu /help è /exchange. Quandu tutti i passi sò stati cumpletati, hè ora di passà à codificazione.

Passu 3: Stallà è Lanciari u Bot

Creemu un schedariu config.py. In questu, avete bisognu di specificà u codice bot unicu è u fusu orariu in quale u prugramma hà da truvà infurmazione.

TOKEN = '' # rimpiazzà cù u token di u vostru botTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

In seguitu, creamu un altru schedariu cù l'importazione di u pb.py scrittu prima, biblioteche è altri cumpunenti necessarii. E biblioteche mancanti sò stallate da u sistema di gestione di pacchetti (pip).

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

Utilizemu u cuntenutu di pyTelegramBotApi per creà un bot. Mandemu u token ricevutu cù u codice seguente:

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

U paràmetru none_stop assicura chì e dumande sò mandate constantemente. U funziunamentu di u paràmetru ùn serà micca affettatu da errori di metudu.

Passu 4: Scrivite u /start Command Handler

Se tutti i passi previ sò fatti bè, u bot hà cuminciatu à travaglià. U prugramma genera richieste regularmente perchè usa u metudu getUpdates. Prima di a linea cù l'elementu none_stop, avemu bisognu di un pezzu di codice chì processa u cumandamentu /start:

@bot.message_handler(commands=['start']) def start_command(messaggio): bot.send_message( message.chat.id, 'Saluti! Vi possu mostrà i tassi di scambiu.n' + 'Per ottene i tassi di scambiu presse / exchange.n' + 'Per uttene aiutu presse /help.' )

RџSЂRё cumandamenti = ['iniziu'] uguale à True start_command hè chjamatu. U cuntenutu di u missaghju va quì. Dopu, avete bisognu di implementà a funzione di mandà_messagiu in relazione à un missaghju particulare.

Passu 5: Crea un /help Command Handler

U cumandamentu /help pò esse implementatu cum'è un buttone. Cliccà nantu à questu, l'utilizatore serà purtatu à u cuntu Telegram di u sviluppatore. Dà u buttone un nome, cum'è "Pregunte à u sviluppatore". Pone u paràmetru reply_markup, chì redirige l'utilizatore à un ligame, per u metudu send_message. Scrivemu in u codice u paràmetru chì crea u teclatu (InlineKeyboardMarkup). Avete bisognu solu un buttone (InlineKeyboardButton).

U codice finale di u gestore di cumandamenti s'assumiglia cusì:

@bot.message_handler(commands=['help']) def help_command(messaggio): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton('Pregunte à u sviluppatore', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Per riceve una lista di e valute dispunibili appughjà /exchange.n' + '2) Cliccate nantu à a valuta chì vi interessa.n' + '3) You riceverà un missaghju chì cuntene l'infurmazioni riguardanti a fonte è e valute di destinazione, ' + 'tassi di compra è di vendita. ' + 'U bot mostrarà ancu a diffarenza trà i tassi di scambiu precedenti è attuali.n' + '4) U bot supporta inline. Type @ in ogni chat è e prime lettere di una valuta.', reply_markup=keyboard )

Azzione di codice in u chat di Telegram:

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Passu 6: Adding the /exchange Command Handler

Stu passu hè necessariu per vede i buttoni cù simboli di muniti dispunibuli in u chat. Un teclatu nantu à u screnu cù opzioni vi aiuterà à evità i sbagli. PrivatBank furnisce infurmazioni nantu à u rublu, u dollaru è l'euro. L'opzione InlineKeyboardButton funziona cusì:

  1. L'utilizatore cliccà nantu à u buttone cù a designazione desiderata.
  2. getUpdates riceve una callback (CallbackQuery).
  3. Hè diventatu cunnisciutu cumu manighjà pressu u teclatu - l'infurmazioni nantu à u buttone pressatu sò trasmessi.

/ codice di gestore di scambiu:

@bot.message_handler (cumandamenti = ['scambiu']) def exchange_command (messagiu): 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, 'Cliccate nantu à a valuta di scelta:', reply_markup=keyboard )

U risultatu di u codice in Telegram:

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Passu 7: Scrivite un gestore per i buttoni di u teclatu integratu

U pacchettu pyTelegramBot Api cuntene a funzione di decoratore @bot.callback_query_handler. Stu cumpunente hè pensatu per traduce a callback in una funzione - l'API unwraps è ricrea a chjama. Hè scrittu cusì:

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

Scrivemu ancu u metudu get_ex_callback:

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

Ci hè un altru mètudu utile - answer_callback_query. Aiuta à caccià a carica trà pressu u buttone è vede u risultatu nantu à u screnu. Pudete mandà un missaghju à send_exchange_query passendu qualchì codice di valuta è Missaghju. Scrivemu send_exchange_result:

def send_exchange_result (messaggio, 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' )

Mentre u chatbot riceve u risultatu di a dumanda da u bancu API, u visitore vede l'inscription "typing a message". Sembra chì una persona vera risponde. Per vede un tali indicatore nantu à u screnu, avete bisognu di aghjunghje linee di statutu di input. Dopu, avemu aduprà get_exchange - cù u so aiutu, u prugramma riceverà a designazione di munita (rubles, euru o dollari). send_message usa metudi supplementari: serialize_ex cunverte a valuta in un altru formatu, è get_update_keyboard crea softkeys chì aghjurnà l'infurmazioni è mandà dati di u mercatu di valuta à altri chats.

Scrivemu u codice per get_update_keyboard. Dui buttoni deve esse mintuatu - t è e stand for type and exchange. L'elementu switch_inline_query per u buttone Share hè necessariu per chì l'utilizatore pò sceglie trà parechji chats. U visitatore hà da pudè sceglie à quale mandà u scambiu attuale di u dollaru, u rublu o l'euro.

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']) ) torna a tastiera

Calchì volta ci vole à vede quantu u tassu di scambiu hè cambiatu in pocu tempu. Scrivemu dui metudi per u buttone Update per chì l'utilizatori ponu vede i corsi in paragone.

A diffarenza trà i tassi di scambiu hè passata à u serializzatore via u paràmetru diff.

I metudi prescritti travaglianu solu dopu chì i dati sò aghjurnati, ùn anu micca affettatu a prima mostra di u corsu.

def serialize_ex (ex_json, diff=None): result = '' + ex_json ['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Compra: ' + ex_json ['buy'] if diff: result += ' ' + serialize_exchange_diff (diff ['buy_diff']) + 'n' + 'Vendi: ' + 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: result = '(' + 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: result = '(' + 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">)' u risultatu di ritornu

Imagine chì u visitore vulia sapè u scambiu di u dollaru. Eccu ciò chì succede se selezziunate USD in u messagiu:

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Passu 8: Implementazione di u Handler Button Update

Scrivemu u codice per a gestione di l'azzioni cù u buttone Update è aghjunghje a parte iq_callback_method à questu. Quandu l'articuli di u prugramma cumincianu cù u paràmetru get, duvete scrive get_ex_callback. In altre situazioni, analizemu JSON è pruvate d'avè a chjave t.

@bot.callback_query_handler(func=lambda call: True) def iq_callback (query): data = query.data if data.startswith('get-'): get_ex_callback (query) altru: pruvate: if json.loads (data)[ 't'] == 'u': edit_message_callback (questione) eccettu ValueError: pass

Se t uguale à u, vi tuccherà à scrive un prugramma per u metudu edit_message_callback. Scuprite stu prucessu passu à passu:

  1. Scaricà infurmazione aghjurnata nantu à u statu di u mercatu di valuta (exchange_now = pb.get_exchange(data['c']).
  1. Scrivite un novu missaghju attraversu un serializzatore cù diff.
  2. Aghjunghje una firma (get_edited_signature).

Se u missaghju iniziale ùn cambia micca, chjamate u metudu 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')

Scrivemu u metudu get_ex_from_iq_data per analizà JSON:

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

Avete bisognu di uni pochi di metudi più: per esempiu, get_exchange_diff, chì leghje l'infurmazioni vechji è novi nantu à u costu di muniti è mostra a diferenza.

def get_exchange_diff(last, now): return { 'sale_diff': float ("%. 6f" % (float (avà ['sale']) - float (last ['sale']))), 'buy_diff': float ("%.6f" % (float(avà ['cumprà']) - float (ultimu ['cumprà']))) }

L'ultimu, get_edited_signature, mostra l'ora di l'ultima aghjurnazione di u corsu.

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

In u risultatu, u messagiu aghjurnatu da u bot cun un tassu di scambiu stabile s'assumiglia cusì:

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Quandu u corsu cambia, e differenze trà i valori sò affissate in u missaghju per via di i parametri prescritti.

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

Passu 9: Implementazione Mode Embedded

U modu integratu hè necessariu per mandà rapidamente infurmazioni da u prugramma à qualsiasi chat - avà ùn avete micca bisognu di aghjunghje un bot à a conversazione cum'è participante. Quandu un utilizatore di Telegram inserisce un nome di bot cù un segnu @ davanti, l'opzioni di cunversione deve apparisce sopra a linea di input. Se clicate nantu à unu di l'articuli, u bot mandarà un missaghju à a cunversazione cù i risultati è i buttoni per l'aghjurnamentu è l'invio di dati. U nome di u mittente cuntene a didascalia "via ".

InlineQuery hè passatu à query_text via a biblioteca. U codice usa a funzione answer_line per ricuperà i risultati di ricerca cum'è un array di dati è l'elementu inline_query_id. Usemu get_exchanges per chì u bot trova parechje valute nantu à dumanda.

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

Passemu un array di dati à get_iq_articles per rinvià l'uggetti da InlineQueryResultArticle attraversu stu metudu.

def get_iq_articles (scambii): 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 = 'Convertite ' + exc ['base_ccy'] + ' -> ' + exc ['ccy'], thumb_height = 1 ) ) riturnà u risultatu

Avà, si scrive @ è un spaziu in a linea, i risultati di ricerca appariscenu nantu à u screnu - opzioni per cunvertisce in trè muniti dispunibuli.

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

L'utilizatori ponu filtrà i risultati inserendu a valuta desiderata.

Dopu à cliccà nantu à a valuta desiderata da a lista, u chat riceve u stessu missaghju chì l'utilizatori di bot ricevenu. Pudete puru aduprà u buttone Update. L'imaghjini sottu mostra u messagiu aghjurnatu mandatu via u bot:

Telegram bot in Python. Una guida cumpleta per scrive un bot cù i tassi di scambiu da zero

cunchiusioni

Avà sapete cumu creà un bot per Telegram. Pudete aghjunghje strumenti utili à u vostru prugramma: buttone per aghjurnà è mandà u risultatu à l'altri utilizatori di u messenger è un modu integratu chì permette di utilizà e funzioni di u bot fora di u chat cun ellu. Basatu nantu à sta struzzione, pudete creà qualsiasi bot simplice cù altre funzioni - micca solu quellu chì mostrarà i tassi di scambiu. Ùn àbbia paura di sperimentà biblioteche, API è codice per creà un assistente automatizatu chì chatterà cù i clienti in Telegram è rinfurzà a cunnessione di e persone interessate cù a cumpagnia.

1 Comment

  1. Publicazione fantastica

Lascia un Audiolibro