cuntenutu
- Passu 0: sfondate teorica nantu à l'API di i bots di Telegram
- Passu 1: Implementazione di e dumande di tassi di scambiu
- Passu 2: Crea un Telegram Bot cù @BotFather
- Passu 3: Stallà è Lanciari u Bot
- Passu 4: Scrivite u /start Command Handler
- Passu 5: Crea un /help Command Handler
- Passu 6: Adding the /exchange Command Handler
- Passu 7: Scrivite un gestore per i buttoni di u teclatu integratu
- Passu 8: Implementazione di u Handler Button Update
- Passu 9: Implementazione Mode Embedded
- cunchiusioni
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
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:
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ì:
- L'utilizatore cliccà nantu à u buttone cù a designazione desiderata.
- getUpdates riceve una callback (CallbackQuery).
- 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:
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:
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:
- Scaricà infurmazione aghjurnata nantu à u statu di u mercatu di valuta (exchange_now = pb.get_exchange(data['c']).
- Scrivite un novu missaghju attraversu un serializzatore cù diff.
- 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ì:
Quandu u corsu cambia, e differenze trà i valori sò affissate in u missaghju per via di i parametri prescritti.
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 @
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:
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.
Publicazione fantastica