Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Els bots de Telegram són programes que ajuden a establir contacte amb l'audiència o a simplificar accions que abans s'havien de realitzar manualment. Aquests programes estan escrits específicament per a la plataforma de missatgeria. Els bots funcionen d'aquesta manera: l'usuari envia una ordre a través de la línia d'entrada i el sistema respon amb un missatge de text o interactiu. De vegades, el programa fins i tot imita les accions d'una persona real: aquest bot inspira més confiança entre els clients.

Hi ha diversos tipus de sistemes d'assistència automàtica als usuaris. Alguns robots només es comuniquen amb els clients, d'altres proporcionen informació regularment. És impossible dividir clarament els programes en tipus: els desenvolupadors sovint combinen diverses funcions en un bot.

Podeu escriure un bot senzill per a Telegram amb elements interactius en forma de botons a la pantalla en 9 passos. Vegem cadascun d'ells amb detall i responem algunes preguntes:

  • com iniciar un bot;
  • com registrar un teclat integrat des d'un o més botons;
  • com programar els botons per a les funcions desitjades;
  • què és el mode en línia i com configurar-lo per a un bot existent.

Pas 0: antecedents teòrics sobre l'API de robots de Telegram

L'eina principal utilitzada per crear robots de Telegram és la interfície de programació d'aplicacions HTML o API HTML. Aquest element accepta les peticions dels visitants i envia respostes en forma d'informació. Els dissenys ja fets simplifiquen el treball del programa. Per escriure un bot per a Telegram, heu d'utilitzar aquesta adreça de correu electrònic: https://api.telegram.org/bot/METHOD_NAME

Per al correcte funcionament del bot, també es necessita un testimoni: una combinació de caràcters que protegeix el programa i n'obri l'accés als desenvolupadors de confiança. Cada testimoni és únic. La cadena s'assigna al bot quan es crea. Els mètodes poden ser diferents: getUpdates, getChat i altres. L'elecció del mètode depèn de quin algorisme esperen els desenvolupadors del bot. Exemple de testimoni:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Els robots utilitzen sol·licituds GET i POST. Sovint s'han de complementar els paràmetres del mètode, per exemple, quan se suposa que el mètode sendMessage ha d'enviar l'identificador del xat i una mica de text. Els paràmetres per al refinament del mètode es poden passar com a cadena de consulta d'URL mitjançant application/x-www-form-urlencoded o mitjançant application-json. Aquests mètodes no són adequats per descarregar fitxers. També cal la codificació UTF-8. En enviar una sol·licitud a l'API, podeu obtenir el resultat en format JSON. Fes una ullada a la resposta del programa a la recuperació d'informació mitjançant el mètode getME:

OBTENIR https://api.telegram.org/bot/getMe{ ok: true, resultat: { id: 231757398, first_name: "Bot de tipus de canvi", nom d'usuari: "exchangetestbot" } }

El resultat s'obtindrà si ok és igual veritable. En cas contrari, el sistema indicarà un error.

Hi ha dues maneres d'obtenir missatges personalitzats als robots. Tots dos mètodes són efectius, però són adequats en diferents casos. Per rebre missatges, podeu escriure manualment una sol·licitud amb el mètode getUpdates: el programa mostrarà la matriu de dades d'actualització a la pantalla. Les sol·licituds s'han d'enviar regularment, després d'analitzar cada matriu, l'enviament es repeteix. El desplaçament és un paràmetre que determina el nombre de registres saltats abans de carregar un nou resultat per evitar la reaparició d'objectes marcats. Els avantatges del mètode getUpdates entraran en joc si:

  • no hi ha manera de configurar HTTPS;
  • s'utilitzen llenguatges de script complexos;
  • el servidor del bot canvia de tant en tant;
  • el bot està carregat amb usuaris.

El segon mètode que es pot escriure per rebre missatges d'usuari és setWebhook. S'utilitza una vegada, no cal enviar noves sol·licituds constantment. El webhook envia actualitzacions de dades a l'URL especificat. Aquest mètode requereix un certificat SSL. Webhook serà útil en aquests casos:

  • s'utilitzen llenguatges de programació web;
  • el bot no està sobrecarregat, no hi ha massa usuaris;
  • el servidor no canvia, el programa roman al mateix servidor durant molt de temps.

En instruccions addicionals, utilitzarem getUpdates.

El servei @BotFather Telegram està dissenyat per crear bots de xat. La configuració bàsica també s'estableix mitjançant aquest sistema: BotFather us ajudarà a fer una descripció, posar una foto de perfil, afegir eines de suport. Les biblioteques, conjunts de sol·licituds HTML per a robots de Telegram, estan disponibles a Internet, n'hi ha bastants. En crear el programa d'exemple, es va utilitzar pyTelegramBotApi.

Pas 1: implementació de sol·licituds de tipus de canvi

Primer cal escriure el codi que realitza les consultes. Utilitzarem quan escrivim l'API de PrivatBank, a continuació hi ha un enllaç: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Heu d'utilitzar aquests mètodes al vostre codi:

  • load_exchange: troba els tipus de canvi i mostra informació codificada;
  • get_exchange: mostra dades sobre una moneda específica;
  • get_exchanges: mostra la llista de monedes segons la mostra.

Com a resultat, el codi del fitxer pb.py té aquest aspecte:

importació de sol·licituds d'importació importació URL json = '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 ): per a exc a load_exchange(): if ccy_key == exc['ccy']: retorna exc return Fals def get_exchanges(ccy_pattern): resultat = [] ccy_pattern = re.escape (ccy_pattern) + '.*' per a exc a load_exchange(): si re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) no és Cap: resultat.append(exc) retorna el resultat

El programa pot emetre la resposta següent a les sol·licituds especificades:

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

Pas 2: creeu un bot de Telegram amb @BotFather

Podeu crear un programa per rebre missatges i respondre'ls mitjançant el servei @BotFather. Aneu a la seva pàgina de Telegram i introduïu l'ordre /newbot. Al xat apareixeran instruccions, segons les quals primer heu d'escriure el nom del bot i després la seva adreça. Quan es creï el compte del bot, apareixerà a la pantalla un missatge de benvinguda que conté un testimoni. Per a més configuració, utilitzeu aquestes ordres:

  • /setdescription – descripció;
  • /setbouttext: informació sobre el nou bot;
  • /setuserpic – foto de perfil;
  • /setinline – mode en línia;
  • /setcommands: descripció de les ordres.

En l'últim pas de configuració, descrivim /help i /exchange. Quan s'han completat tots els passos, és hora de passar a la codificació.

Pas 3: Configuració i llançament del bot

Creem un fitxer config.py. En ell, heu d'especificar el codi de bot únic i la zona horària en què el programa trobarà informació.

TOKEN = '' # substituïu amb el testimoni del vostre botTIMEZONE = 'Europa/Kíev' TIMEZONE_COMMON_NAME = 'Kíev'

A continuació, creem un altre fitxer amb la importació del pb.py escrit anteriorment, biblioteques i altres components necessaris. Les biblioteques que falten s'instal·len des del sistema de gestió de paquets (pip).

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

Utilitzem el contingut de pyTelegramBotApi per crear un bot. Enviem el testimoni rebut mitjançant el codi següent:

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

El paràmetre none_stop garanteix que les sol·licituds s'enviïn constantment. El funcionament del paràmetre no es veurà afectat per errors de mètode.

Pas 4: escriviu el controlador d'ordres /start

Si tots els passos anteriors es fan correctament, el bot ha començat a funcionar. El programa genera sol·licituds amb regularitat perquè utilitza el mètode getUpdates. Abans de la línia amb l'element none_stop, necessitem un fragment de codi que processi l'ordre /start:

@bot.message_handler(commands=['inici']) def start_command(missatge): bot.send_message( message.chat.id, "Salutacions! Puc mostrar-vos els tipus de canvi.n" + "Per obtenir els tipus de canvi premeu / exchange.n' + 'Per obtenir ajuda, premeu /help.' )

RџSЂRё ordres=['inici'] igual a True s'anomena start_command. El contingut del missatge va allà. A continuació, heu d'implementar la funció d'enviament_missatge en relació a un missatge concret.

Pas 5: creeu un gestor d'ordres /help

L'ordre /help es pot implementar com a botó. En fer-hi clic, l'usuari serà dirigit al compte de Telegram del desenvolupador. Doneu un nom al botó, com ara "Pregunta al desenvolupador". Establiu el paràmetre reply_markup, que redirigeix ​​l'usuari a un enllaç, per al mètode send_message. Escrivim al codi el paràmetre que crea el teclat (InlineKeyboardMarkup). Només necessiteu un botó (InlineKeyboardButton).

El codi final del controlador d'ordres té aquest aspecte:

@bot.message_handler(commands=['ajuda']) def help_command(missatge): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton('Pregunta al desenvolupador', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Per rebre una llista de les monedes disponibles, premeu /exchange.n' + '2) Feu clic a la moneda que us interessa.n' + '3) Vostè rebrà un missatge amb informació sobre l'origen i les monedes de destinació, ' + 'taxes de compra i de venda.n' + '4) Feu clic a "Actualitza" per rebre la informació actual sobre la sol·licitud. ' + 'El bot també mostrarà la diferència entre els tipus de canvi anteriors i actuals.n' + '5) El bot admet en línia. Escriviu @ en qualsevol xat i les primeres lletres d'una moneda.', reply_markup=keyboard )

Acció del codi al xat de Telegram:

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Pas 6: Afegeix el gestor d'ordres /exchange

Aquest pas és necessari per mostrar botons amb símbols de monedes disponibles al xat. Un teclat en pantalla amb opcions us ajudarà a evitar errors. PrivatBank ofereix informació sobre el ruble, el dòlar i l'euro. L'opció InlineKeyboardButton funciona així:

  1. L'usuari fa clic al botó amb la designació desitjada.
  2. getUpdates rep una devolució de trucada (CallbackQuery).
  3. Es coneix com manejar la pressió del teclat: es transmet informació sobre el botó premut.

/Codi del gestor d'intercanvi:

@bot.message_handler(commands=['intercanvi']) def exchange_command(missatge): 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, 'Feu clic a la moneda que trieu:', reply_markup=keyboard )

El resultat del codi a Telegram:

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Pas 7: escriviu un controlador per als botons integrats del teclat

El paquet pyTelegramBot Api conté la funció decoradora @bot.callback_query_handler. Aquest component està dissenyat per traduir la devolució de trucada en una funció: l'API desembolica i torna a crear la trucada. S'escriu així:

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

Escrivim també el mètode get_ex_callback:

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

Hi ha un altre mètode útil: answer_callback_query. Ajuda a eliminar la càrrega entre prémer el botó i mostrar el resultat a la pantalla. Podeu enviar un missatge a send_exchange_query passant un codi de moneda i un missatge. Escrivim send_exchange_result:

def send_exchange_result(missatge, ex_code): bot.send_chat_action(message.chat.id, 'escrivint') 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 el chatbot rep el resultat de la sol·licitud del banc API, el visitant veu la inscripció “escrivint un missatge”. Sembla que una persona real està responent. Per mostrar aquest indicador a la pantalla, haureu d'afegir línies d'estat d'entrada. A continuació, utilitzarem get_exchange: amb la seva ajuda, el programa rebrà la designació de la moneda (rubles, euros o dòlars). send_message utilitza mètodes addicionals: serialize_ex converteix la moneda a un altre format i get_update_keyboard configura tecles programades que actualitzen la informació i envien dades del mercat de divises a altres xats.

Escrivim el codi per a get_update_keyboard. Cal esmentar dos botons: t i e signifiquen tipus i intercanvi. L'element switch_inline_query per al botó Compartir és necessari perquè l'usuari pugui triar entre diversos xats. El visitant podrà escollir a qui enviar el tipus de canvi actual del dòlar, el ruble o l'euro.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('Actualització', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['compra'], 's': ex['venda'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Comparteix', switch_inline_query=ex['ccy']) ) retorna el teclat

De vegades cal veure quant ha canviat el tipus de canvi en poc temps. Escrivim dos mètodes per al botó Actualitzar perquè els usuaris puguin veure els cursos en comparació.

La diferència entre els tipus de canvi es passa al serialitzador mitjançant el paràmetre diff.

Els mètodes prescrits només funcionen després de l'actualització de les dades, no afectaran la primera visualització del curs.

def serialize_ex (ex_json, diff=Cap): resultat = ''+ ex_json['base_ccy'] + '-> '+ex_json['ccy'] + ':nn' + 'Compra: ' + ex_json['compra'] si diff: resultat += ' ' + serialize_exchange_diff(diff['compra_diff']) + 'n' + 'Ven: '+ ex_json['venda'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: resultat += 'nSell: '+ ex_json['sale'] + 'n' retorna el resultat def serialize_exchange_diff (diff): resultat = '' si diff > 0: resultat = '(' + 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: resultat = '(' + 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">)' retorna el resultat

Imagineu que el visitant volgués saber el tipus de canvi del dòlar. Això és el que passa si seleccioneu USD al missatge:

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Pas 8: implementació del gestor de botons d'actualització

Escrivim el codi per gestionar les accions amb el botó Actualitza i afegim la part iq_callback_method. Quan els elements del programa comencen amb el paràmetre get, heu d'escriure get_ex_callback. En altres situacions, analitzem JSON i intentem obtenir la clau 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 (consulta) excepte ValueError: passa

Si t és igual a u, haureu d'escriure un programa per al mètode edit_message_callback. Anem a desglossar aquest procés pas a pas:

  1. Descàrrega d'informació actualitzada sobre l'estat del mercat de divises (exchange_now = pb.get_exchange(data['c']).
  1. Escriure un missatge nou mitjançant un serialitzador amb diff.
  2. Afegir una signatura (get_edited_signature).

Si el missatge inicial no canvia, truqueu al mètode edit_message_text.

def edit_message_callback(consulta): 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 (dades), 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' )

Escrivim el mètode get_ex_from_iq_data per analitzar JSON:

def get_ex_from_iq_data(exc_json): retorn { 'compra': exc_json['b'], 'venda': exc_json['s'] }

Necessitareu uns quants mètodes més: per exemple, get_exchange_diff, que llegeix la informació antiga i nova sobre el cost de les monedes i mostra la diferència.

def get_exchange_diff(últim, ara): return { 'sale_diff': float("%.6f" % (float(ara['venda']) - float(última['venda']))), 'buy_diff': float ("%.6f" % (float(ara['comprar']) - flotant(últim['comprar']))) }

L'últim, get_edited_signature, mostra l'hora de l'última actualització del curs.

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

Com a resultat, el missatge actualitzat del bot amb un tipus de canvi estable té aquest aspecte:

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Quan el curs canvia, les diferències entre els valors es mostren al missatge a causa dels paràmetres prescrits.

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Pas 9: Implementació del mode incrustat

El mode integrat és necessari per enviar ràpidament informació del programa a qualsevol xat; ara no cal afegir un bot a la conversa com a participant. Quan un usuari de Telegram introdueix un nom de bot amb un signe @ al davant, les opcions de conversió haurien d'aparèixer a sobre de la línia d'entrada. Si feu clic a un dels elements, el bot enviarà un missatge a la conversa amb els resultats i botons per actualitzar i enviar dades. El nom del remitent contindrà la llegenda “via ".

InlineQuery es passa a query_text mitjançant la biblioteca. El codi utilitza la funció answer_line per recuperar els resultats de la cerca com a matriu de dades i l'element inline_query_id. Utilitzem get_exchanges perquè el bot trobi diverses monedes a petició.

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

Passem una matriu de dades a get_iq_articles per tal de retornar objectes d'InlineQueryResultArticle mitjançant aquest mètode.

def get_iq_articles(intercanvis): resultat = [] per a exc en intercanvis: 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='Convert '+exc['base_ccy'] + '-> '+exc['ccy'], thumb_height=1) ) retornar el resultat

Ara, si escriviu @ i un espai a la línia, els resultats de la cerca apareixeran a la pantalla: opcions per convertir en tres monedes disponibles.

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Els usuaris poden filtrar els resultats introduint la moneda desitjada.

Després de fer clic a la moneda desitjada de la llista, el xat rep el mateix missatge que reben els usuaris del bot. També podeu utilitzar el botó Actualitzar. La imatge següent mostra el missatge actualitzat enviat mitjançant el bot:

Bot de Telegram en Python. Una guia completa per escriure un bot amb tipus de canvi des de zero

Conclusió

Ara ja saps com crear un bot per a Telegram. Podeu afegir eines útils al vostre programa: botons per actualitzar i enviar el resultat a altres usuaris del messenger i un mode integrat que us permet utilitzar les funcions del bot fora del xat amb ell. A partir d'aquesta instrucció, podeu crear qualsevol bot senzill amb altres funcions, no només la que mostrarà els tipus de canvi. No tingueu por d'experimentar amb biblioteques, API i codi per crear un assistent automatitzat que xatejarà amb els clients a Telegram i enfortirà la connexió de les persones interessades amb l'empresa.

Com 1

  1. Publicació fantàstica

Deixa un comentari