Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Los bots en Telegram son programas que ayudan a establecer contacto con la audiencia o simplificar acciones que antes debían realizarse de forma manual. Estos programas están escritos específicamente para la plataforma de mensajería. Los bots funcionan de esta manera: el usuario envía un comando a través de la línea de entrada y el sistema responde con un mensaje de texto o interactivo. A veces, el programa incluso imita las acciones de una persona real: un bot de este tipo inspira más confianza entre los clientes.

Existen varios tipos de sistemas de asistencia automática a los usuarios. Algunos bots solo se comunican con los clientes, otros brindan información regularmente. Es imposible dividir claramente los programas en tipos: los desarrolladores a menudo combinan varias funciones en un bot.

Puede escribir un bot simple para Telegram con elementos interactivos en forma de botones en pantalla en 9 pasos. Veamos cada uno de ellos en detalle y respondamos algunas preguntas:

  • cómo iniciar un bot;
  • cómo registrar un teclado incorporado desde uno o más botones;
  • cómo programar los botones para las funciones deseadas;
  • qué es el modo en línea y cómo configurarlo para un bot existente.

Paso 0: antecedentes teóricos sobre la API de bots de Telegram

La principal herramienta utilizada para crear bots de Telegram es la interfaz de programación de aplicaciones HTML o API HTML. Este elemento acepta solicitudes de visitantes y envía respuestas en forma de información. Los diseños listos para usar simplifican el trabajo en el programa. Para escribir un bot para Telegram, debe usar esta dirección de correo electrónico: https://api.telegram.org/bot/METHOD_NAME

Para el correcto funcionamiento del bot, también se necesita un token, una combinación de caracteres que protege el programa y abre el acceso a desarrolladores de confianza. Cada ficha es única. La cadena se asigna al bot en el momento de la creación. Los métodos pueden ser diferentes: getUpdates, getChat y otros. La elección del método depende del algoritmo que los desarrolladores esperan del bot. Ejemplo de token:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Los bots usan solicitudes GET y POST. Los parámetros del método a menudo deben complementarse, por ejemplo, cuando se supone que el método sendMessage debe enviar la identificación del chat y algún texto. Los parámetros para el refinamiento del método se pueden pasar como una cadena de consulta de URL mediante application/x-www-form-urlencoded o mediante application-json. Estos métodos no son adecuados para descargar archivos. También se requiere la codificación UTF-8. Al enviar una solicitud a la API, puede obtener el resultado en formato JSON. Eche un vistazo a la respuesta del programa para recuperar información a través del método getME:

OBTENGA https://api.telegram.org/bot/getMe{ ok: verdadero, resultado: { id: 231757398, first_name: "Exchange Rate Bot", nombre de usuario: "exchangetestbot" } }

El resultado se obtendrá si ok iguales verdadero. De lo contrario, el sistema indicará un error.

Hay dos formas de obtener mensajes personalizados en los bots. Ambos métodos son efectivos, pero son adecuados en diferentes casos. Para recibir mensajes, puede escribir manualmente una solicitud con el método getUpdates: el programa mostrará la matriz de datos de actualización en la pantalla. Las solicitudes deben enviarse periódicamente, después de analizar cada matriz, se repite el envío. Offset es un parámetro que determina el número de registros omitidos antes de cargar un nuevo resultado para evitar la reaparición de objetos marcados. Los beneficios del método getUpdates entrarán en juego si:

  • no hay forma de configurar HTTPS;
  • se utilizan lenguajes de scripting complejos;
  • el servidor bot cambia de vez en cuando;
  • el bot está cargado de usuarios.

El segundo método que se puede escribir para recibir mensajes de usuario es setWebhook. Se usa una vez, no es necesario enviar constantemente nuevas solicitudes. El webhook envía actualizaciones de datos a la URL especificada. Este método requiere un certificado SSL. Webhook será útil en estos casos:

  • se utilizan lenguajes de programación web;
  • el bot no está sobrecargado, no hay demasiados usuarios;
  • el servidor no cambia, el programa permanece en el mismo servidor durante mucho tiempo.

En instrucciones posteriores, utilizaremos getUpdates.

El servicio @BotFather Telegram está diseñado para crear bots de chat. La configuración básica también se establece a través de este sistema: BotFather lo ayudará a hacer una descripción, poner una foto de perfil, agregar herramientas de soporte. Las bibliotecas (conjuntos de solicitudes HTML para bots de Telegram) están disponibles en Internet, hay bastantes. Al crear el programa de ejemplo, se utilizó pyTelegramBotApi.

Paso 1: Implementación de solicitudes de tipo de cambio

Primero debe escribir el código que realiza las consultas. Lo usaremos al escribir la API de PrivatBank, a continuación hay un enlace: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Necesita usar estos métodos en su código:

  • load_exchange: encuentra tipos de cambio y muestra información codificada;
  • get_exchange: muestra datos sobre una moneda específica;
  • get_exchanges – muestra el listado de divisas según la muestra.

Como resultado, el código en el archivo pb.py se ve así:

importar volver a importar solicitudes importar 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): resultado = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): si re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) no es Ninguno: result.append(exc) devuelve el resultado

El programa puede emitir la siguiente respuesta a las solicitudes especificadas:

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

Paso 2: crea un bot de Telegram con @BotFather

Puede crear un programa para recibir mensajes y responderlos utilizando el servicio @BotFather. Vaya a su página de Telegram e ingrese el comando /newbot. Aparecerán instrucciones en el chat, según las cuales primero debe escribir el nombre del bot y luego su dirección. Cuando se crea la cuenta del bot, aparecerá en la pantalla un mensaje de bienvenida que contiene un token. Para una mayor configuración, use estos comandos:

  • /setdescription – descripción;
  • /setabouttext: información sobre el nuevo bot;
  • /setuserpic – foto de perfil;
  • /setinline – modo en línea;
  • /setcommands – descripción de los comandos.

En el último paso de configuración, describimos /help y /exchange. Cuando se han completado todos los pasos, es hora de pasar a la codificación.

Paso 3: Configuración y ejecución del bot

Vamos a crear un archivo config.py. En él, debe especificar el código de bot único y la zona horaria en la que el programa encontrará información.

FICHA = '' # reemplazar con el token de su botTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

A continuación, creamos otro archivo con la importación de pb.py, bibliotecas y otros componentes necesarios previamente escritos. Las bibliotecas que faltan se instalan desde el sistema de gestión de paquetes (pip).

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

Usemos el contenido de pyTelegramBotApi para crear un bot. Enviamos el token recibido usando el siguiente código:

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

El parámetro none_stop garantiza que las solicitudes se envíen constantemente. El funcionamiento del parámetro no se verá afectado por errores de método.

Paso 4: escribir el controlador de comandos /start

Si todos los pasos anteriores se realizan correctamente, el bot ha comenzado a funcionar. El programa genera solicitudes regularmente porque utiliza el método getUpdates. Antes de la línea con el elemento none_stop, necesitamos un código que procese el comando /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, '¡Saludos! Puedo mostrarle tipos de cambio.n' + 'Para obtener los tipos de cambio, presione / exchange.n' + 'Para obtener ayuda, presione /help.' )

RџСўРё comandos=['inicio'] igual a Verdadero se llama start_command. El contenido del mensaje va allí. A continuación, debe implementar la función de envío_mensaje en relación con un mensaje en particular.

Paso 5: Cree un controlador de comandos /help

El comando /help se puede implementar como un botón. Al hacer clic en él, el usuario será llevado a la cuenta de Telegram del desarrollador. Asigne un nombre al botón, como "Preguntar al desarrollador". Configure el parámetro answer_markup, que redirige al usuario a un enlace, para el método send_message. Escribamos en el código el parámetro que crea el teclado (InlineKeyboardMarkup). Solo necesita un botón (InlineKeyboardButton).

El código del controlador de comandos final se ve así:

@bot.message_handler(commands=['help']) def help_command(mensaje): teclado = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Pregúntale al desarrollador', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Para recibir una lista de monedas disponibles presione /exchange.n' + '2) Haga clic en la moneda que le interesa.n' + '3) Usted recibirá un mensaje que contiene información sobre la fuente y las monedas de destino, ' + 'tasas de compra y tasas de venta.n' + '4) Haga clic en "Actualizar" para recibir la información actual sobre la solicitud. ' + 'El bot también mostrará la diferencia entre el tipo de cambio anterior y el actual.n' + '5) El bot admite en línea. Escribe @ en cualquier chat y las primeras letras de una moneda.', answer_markup=keyboard )

Código de acción en el chat de Telegram:

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Paso 6: agregar el controlador de comandos /exchange

Este paso es necesario para mostrar botones con símbolos de monedas disponibles en el chat. Un teclado en pantalla con opciones te ayudará a evitar errores. PrivatBank proporciona información sobre el rublo, el dólar y el euro. La opción InlineKeyboardButton funciona así:

  1. El usuario hace clic en el botón con la designación deseada.
  2. getUpdates recibe una devolución de llamada (CallbackQuery).
  3. Se sabe cómo manejar la presión del teclado: se transmite información sobre el botón presionado.

/código del controlador de intercambio:

@bot.message_handler(commands=['intercambio']) def exchange_command(mensaje): teclado = telebot.types.InlineKeyboardMarkup() teclado.fila( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) teclado.fila( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR') ) bot.send_message(mensaje.chat .id, 'Haga clic en la moneda de su elección:', answer_markup=keyboard )

El resultado del código en Telegram:

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Paso 7: escribir un controlador para los botones del teclado integrado

El paquete pyTelegramBot Api contiene la función decoradora @bot.callback_query_handler. Este componente está diseñado para traducir la devolución de llamada en una función: la API desenvuelve y vuelve a crear la llamada. Se escribe así:

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

Escribamos también el método get_ex_callback:

def get_ex_callback(consulta): bot.answer_callback_query(consulta.id) send_exchange_result(consulta.mensaje, consulta.datos[4:])

Hay otro método útil: answer_callback_query. Ayuda a eliminar la carga entre presionar el botón y mostrar el resultado en la pantalla. Puede enviar un mensaje a send_exchange_query pasando algún código de moneda y Mensaje. Escribamos send_exchange_result:

def send_exchange_result(mensaje, ex_code): bot.send_chat_action(mensaje.chat.id, 'escribiendo') ex = pb.get_exchange(ex_code) bot.send_message(mensaje.chat.id, serialize_ex(ex), answer_markup=get_update_keyboard(ex ), parse_mode='HTML' )

Mientras el chatbot recibe el resultado de la solicitud del banco API, el visitante ve la inscripción "escribiendo un mensaje". Parece que una persona real está respondiendo. Para mostrar dicho indicador en la pantalla, deberá agregar líneas de estado de entrada. A continuación, usaremos get_exchange; con su ayuda, el programa recibirá la designación de moneda (rublos, euros o dólares). send_message usa métodos adicionales: serialize_ex convierte la moneda a otro formato y get_update_keyboard configura teclas programables que actualizan la información y envían datos del mercado de divisas a otros chats.

Escribamos el código para get_update_keyboard. Se deben mencionar dos botones: t y e representan tipo e intercambio. El elemento switch_inline_query para el botón Compartir es necesario para que el usuario pueda elegir entre varios chats. El visitante podrá elegir a quién enviar el tipo de cambio vigente del dólar, rublo o euro.

def get_update_keyboard(ex): teclado = telebot.types.InlineKeyboardMarkup() teclado.row( telebot.types.InlineKeyboardButton( 'Actualizar', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['comprar'], 's': ex['venta'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Compartir', switch_inline_query=ex['ccy']) ) regresar teclado

A veces es necesario ver cuánto ha cambiado el tipo de cambio en poco tiempo. Escribamos dos métodos para el botón Actualizar para que los usuarios puedan ver los cursos en comparación.

La diferencia entre los tipos de cambio se pasa al serializador a través del parámetro diff.

Los métodos prescritos funcionan solo después de que se actualicen los datos, no afectarán la primera visualización del curso.

def serialize_ex(ex_json, diff=Ninguno): resultado = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Comprar: ' + ex_json['comprar'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sell: ' + 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: resultado = '(' + 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: resultado = '(' + str( diferencia)[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">)' resultado devuelto

Imagina que el visitante quisiera saber el tipo de cambio del dólar. Esto es lo que sucede si selecciona USD en el mensaje:

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Paso 8: Implementación del controlador del botón Actualizar

Escribamos el código para manejar acciones con el botón Actualizar y agreguemos la parte iq_callback_method. Cuando los elementos del programa comienzan con el parámetro get, debe escribir get_ex_callback. En otras situaciones, analizamos JSON e intentamos obtener la clave 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) excepto ValueError: pass

Si t es igual a u, deberá escribir un programa para el método edit_message_callback. Analicemos este proceso paso a paso:

  1. Descarga de información actualizada sobre el estado del mercado de divisas (exchange_now = pb.get_exchange(data['c']).
  1. Escribir un nuevo mensaje a través de un serializador con diff.
  2. Agregar una firma (get_edited_signature).

Si el mensaje inicial no cambia, llame al método 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(data), exchange_now ) ) + 'n' + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, answer_markup=get_update_keyboard(exchange_now), parse_mode='HTML' ) elif query.inline_message_id : bot.edit_message_text( texto, inline_message_id=query.inline_message_id, answer_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Escribamos el método get_ex_from_iq_data para analizar JSON:

def get_ex_from_iq_data(exc_json): return { 'comprar': exc_json['b'], 'venta': exc_json['s'] }

Necesitará algunos métodos más: por ejemplo, get_exchange_diff, que lee la información antigua y nueva sobre el costo de las monedas y muestra la diferencia.

def get_exchange_diff(último, ahora): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(ahora['comprar']) - float(último['comprar']))) }

El último, get_edited_signature, muestra la hora en que se actualizó el curso por última vez.

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

Como resultado, el mensaje actualizado del bot con un tipo de cambio estable se ve así:

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Cuando el curso cambia, las diferencias entre los valores se muestran en el mensaje debido a los parámetros prescritos.

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Paso 9: Implementación del modo integrado

El modo incorporado es necesario para enviar rápidamente información desde el programa a cualquier chat; ahora no necesita agregar un bot a la conversación como participante. Cuando un usuario de Telegram ingresa un nombre de bot con un signo @ delante, las opciones de conversión deberían aparecer sobre la línea de entrada. Si hace clic en uno de los elementos, el bot enviará un mensaje a la conversación con los resultados y los botones para actualizar y enviar datos. El nombre del remitente contendrá la leyenda "a través de ".

InlineQuery se pasa a query_text a través de la biblioteca. El código usa la función answer_line para recuperar los resultados de la búsqueda como una matriz de datos y el elemento inline_query_id. Usamos get_exchanges para que el bot encuentre varias monedas a pedido.

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

Pasamos una matriz de datos a get_iq_articles para devolver objetos de InlineQueryResultArticle a través de este método.

def get_iq_articles(intercambios): resultado = [] for exc en intercambios: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML' ), answer_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) resultado devuelto

Ahora, si escribes @ y un espacio en la línea, los resultados de la búsqueda aparecerán en la pantalla: opciones para convertir en tres monedas disponibles.

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Los usuarios pueden filtrar los resultados ingresando la moneda deseada.

Después de hacer clic en la moneda deseada de la lista, el chat recibe el mismo mensaje que reciben los usuarios del bot. También puede utilizar el botón Actualizar. La siguiente imagen muestra el mensaje actualizado enviado a través del bot:

Bot de Telegram en Python. Una guía completa para escribir un bot con tipos de cambio desde cero

Conclusión

Ahora ya sabes cómo crear un bot para Telegram. Puede agregar herramientas útiles a su programa: botones para actualizar y enviar el resultado a otros usuarios del messenger y un modo incorporado que le permite usar las funciones del bot fuera del chat con él. Según esta instrucción, puede crear cualquier bot simple con otras funciones, no solo la que mostrará los tipos de cambio. No tenga miedo de experimentar con bibliotecas, API y código para crear un asistente automatizado que converse con los clientes en Telegram y fortalezca la conexión de las personas interesadas con la empresa.

1 Comentario

  1. Fantástica publicación

Deje un comentario