En este artículo comparto mi experiencia con la generación de un programa Rust y un BOT Telegram con ChatGPT.

Terminé mi 2022 como debe ser: programando y aprendiendo.

En esta última semana decidí probar la tan cacareada AI de ChatGPT para aprender a programar algunos de los propósitos que me planteado para el 2023, por ejemplo: Rust y un BOT para Telegram.

¿Qué es ChatGPT?

«AI» es el acrónimo de Artificial Intelligence o Inteligencia Artificial en español.

ChatGPT es una Inteligencia Artificial desarrollada por OpenAI que ha causado mucho revuelo desde el 30 de noviembre de 2022 por la madurez de sus modelos de ML (Machine Learning): GPT-3, que realiza una variedad de tareas de lenguaje natural, Codex, que traduce el lenguaje natural a código de programación, y DALL·E, que crea y edita imágenes originales.

El objetivo de OpenAI es desarrollar y promover una IA segura y “amigable”.
El empresario estadounidense Sam Altman (ex presidente de la aceleradora de startups Y Combinator) cofundó OpenAI en 2015 con Elon Musk, quien abandonó el proyecto en 2020. Sam Altman se desempeña como CEO de la empresa con sede en San Francisco.

ChatGPT no es la primera, ni la única, ni la mas avanzada AI. Su mérito radica en ponerla en manos del público general de forma gratuita, aunque limitada, como un abrebocas de la revolución que se nos viene encima.

Generación de un programa en Lenguaje Rust con ChatGPT

Al intentar hacer un API en Rust para el manejo de una tabla de usuarios en una base de datos MongoDB, el resultado fue un poco frustrante.

Generé con ChatGPT prácticamente la totalidad de la API. El resultado fue bueno para animarme a aprender Rust, pero el programa generado a partir de la consulta a ChatGPT no funcionó.

Le pedí un programa completo que implementa operaciones CRUD (acrónimo de «Crear, Leer, Actualizar y Borrar», del original en inglés: Create, Read, Update and Delete) en una tabla de usuarios en MongoDB desde Rust, con cada operación en una función separada y la función main, todo en un único archivo .rs

Esto lo tuve que ir haciendo poco a poco para luego poder ir armando todas las partes.

Luego pedí implementar una API en Rust que maneje una tabla de usuarios en MongoDB con Endpoints para todas las operaciones CRUD y que siga el estilo REST, y que pueda ser llamada mediante Ajax en Javascript.

Lo hizo para una vieja versión de la dependencia de MongoDb para Rust, no me dio completamente la configuración del archivo Cargo.toml (en especial los `features` necesarios por ejemplo para el `serde`), no incluyó los `use` de todos los elementos necesarios (por ejemplo, para `tokio`), no incluyo los `struct` para los Form y Query en los `warp` que definen los Endpoints, entre otras muchas cosas.

Pase horas intentando arreglarlo para que fuera un PMV (producto mínimo viable) y al final me bloquee en la parte final del Endpoint para consultar un documento de la base de datos MongoDb.

Entendí algo importante: para un lenguaje de programación altamente tipado, que pudiera ser el sustituto de Lenguaje C, no es recomendable intentar aprender al estilo Learning-by-Example, en mi caso es necesario hacer algún curso, y luego meterle al Rust.

Generación de un Telegram BOT en Lenguaje Python con ChatGPT

Acá si obtuve un resultado muy satisfactorio por dos razones: ya sabía programar en Python y algunos años atrás intenté hacer este trabajo en PHP (más o menos en 2018, basado en este repo de Eleirbag89 y este artículo de Stackoverflow de how to get price from bitcoin to USD with PHP api) y de alguna manera ya sabía como iniciar el desarrollo del BOT, aunque en el tiempo cambiaron algunas cosas menores.

Según la Wikipedia, Un BOT es un programa informático que efectúa automáticamente tareas reiterativas mediante Internet a través de una cadena de comandos o funciones autónomas previas para asignar un rol establecido; y que posee capacidad de interacción, cambiando de estado para responder a un estímulo.

Inicialmente el proyecto tenía el objetivo de dar las cotizaciones del Bitcoin para luego llegar a tener un mecanismo de avisar cuando la criptomoneda llegara a un valor mínimo específico, enviando una alerta por medio del mismo Telegram.

Lo que me gusto de este ejercicio fue que un proyecto dormido por 4 años, al que le había invertido muchas horas de trabajo para finalmente dejarlo a un lado (y hasta perdí el código fuente por varias mudanzas de un país a otro, cambio de computadoras y no ponerlo en un repositorio Github) a poder desarrollarlo desde cero en 21 horas (2 días de trabajo prácticamente).

El resultado final se resume en estos elementos:

Repositorio en Github:

https://github.com/tomkat-cr/market_alert_bot

URL del Telegram BOT:

https://t.me/ocr_marketalert_bot

Y el Telegram BOT se ve algo así como:

Tips de la conversación con ChatGPT

Poco a poco me he ido haciendo amigo de esta AI…

La conversación fue en español completamente y ChatGPT lo habla muy bien.

Inicialmente le pedí una información general del desarrollo.

Como la versión gratuita de ChatGPT tiene limitaciones en el tamaño de las respuestas, poco a poco le voy pidiendo el resto de las cosas que se cortan.

Cuando se le pide el código en un lenguaje de programación específico, al final o en algún momento se le debe pedir también los archivos de configuración, los procedimientos de instalación, entre otras cosas, para evitar -por ejemplo- conflictos de versiones de dependencias.

Lo otro es que inicialmente le pedí que me diera el procedimiento para poner a trabajar el BOT en el servicio gratuito de Vercel, y hasta el momento no logré ponerlo a funcionar. Me di por vencido y me tocó poner una pregunta en StackOverflow a ver si alguien me ayuda a solucionar un problema con el forwarding de puertos entre el BOT en Phyton y la instancia Serverless de Vercel.

Al final fue una buena experiencia (no hay mal que por bien no venga), porque aprendí los dos modos de trabajo de los Telegram BOTs, el Polling y el WebHook, aprendí a desplegar aplicaciones en Fly.io, y lo más importante: al sentirme bloqueado, minimizado, derrotado por no poder hacer el despliegue en Vercel, en cuestión de horas busqué una solución viable con algo nuevo, aunque eso implique invertir tiempo en aprender y aprender y aprender más! Eso mismo me paso cuando Heroku finalizó su capa gratuita y me tocó mudar el backend de FynApp a Vercel y frontend a Github Pages.

CONCLUSION

fue una experiencia muy interesante y enriquecedora. Definitivamente el proceso creativo inicial de desarrollo se agiliza y me retó a terminarlo en tiempo record.

Sin embargo aun no voy a perder mi empleo al ser sustituido por una AI.

A esto le falta bastante. Mientras tanto, aprendamos a desarrollar Inteligencia Artificial y Machine Learning.

Acá les dejo dos artículos interesantes:

La cereza del pastel fue las correcciones que hizo mi mamá faltando media hora para terminar el 2022 cuando le mostré este Post. Fue algo hermoso e inesperado, además de quedar contratada para hacer la revisión de todos los Post para mi proyecto de Marca Personal.

Extracto de la Interacción con la AI

La conversación con ChatGPT para generar el Telegram BOT fue así:

Carlos:

dame la programacion necesaria para un bot de telegram en python

Para crear un bot de Telegram en Python, necesitarás hacer lo siguiente:

Asegúrate de tener Python instalado en tu computadora. Si aún no lo tienes, puedes descargarlo desde el sitio oficial de Python (https://www.python.org/downloads/).

Instala la biblioteca de Python para el API de Telegram llamada python-telegram-bot. Puedes hacer esto ejecutando el siguiente comando en tu consola:

Copy code

pip install python-telegram-bot

Crea una cuenta de desarrollador y un bot en el BotFather de Telegram.

El BotFather es un bot en Telegram que te permite crear y gestionar bots. Para crear un bot, debes hablar con el BotFather en Telegram y seguir las instrucciones que te da. Al final de este proceso, el BotFather te dará un token de acceso para tu bot. Guarda este token, ya que lo necesitarás más adelante.

Crea un nuevo archivo de Python y coloca el siguiente código en él:

Copy code

import logging

from telegram.ext import Updater, CommandHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

def start(update, context):
    update.message.reply_text('Hola! Soy un bot de Telegram')

def main():
    # Creamos el Updater y le pasamos el token de acceso
    updater = Updater('TOKEN', use_context=True)
    # Añadimos un manejador para el comando /start
    updater.dispatcher.add_handler(CommandHandler('start', start))
    # Iniciamos el bot
    updater.start_polling()
    updater.idle()

if name == 'main':
    main()

Reemplaza la cadena 'TOKEN' en la línea updater = Updater('TOKEN', use_context=True) por el token de acceso que obtuviste del BotFather.

Ahora, puedes ejecutar el archivo de Python para iniciar tu bot. Si todo ha ido bien, tu bot debería estar en línea y responder a los comandos que envíes a través de Telegram.

Espero que esto te ayude a empezar a crear tu bot de Telegram en Python. Si tienes alguna pregunta o necesitas más ayuda, no dudes en preguntar.

…

Carlos:

agrega un handler para leer una api rest y devolver el resultado al usuario

Para agregar un manejador que lea una API REST y devuelva el resultado al usuario, puedes hacer lo siguiente:

Importa la biblioteca requests al principio de tu archivo de Python:

Copy code

import requests

Define una función que haga la llamada a la API REST y procese el resultado. En este ejemplo, asumimos que la API devuelve un objeto JSON y que queremos mostrar al usuario el valor del campo 'mensaje' del objeto:

Copy code

def leer_api(update, context):
    # Hacemos la llamada a la API
    response = requests.get('https://mi-api.com/recurso')
    # Procesamos el resultado
    if response.status_code == 200:
        # Si la llamada fue exitosa, obtenemos el objeto JSON
        resultado = response.json()
        mensaje = resultado['mensaje']
        update.message.reply_text(mensaje)
    else:
        # Si la llamada no fue exitosa, informamos al usuario
        update.message.reply_text('Ha ocurrido un error al leer la API')

Añade un manejador para el comando /leer_api que llame a la función leer_api cuando se ejecute el comando:

Copy code

updater.dispatcher.add_handler(CommandHandler('leer_api', leer_api))

Ahora, cuando el usuario envíe el comando /leer_api a través de Telegram, el bot hará una llamada a la API REST y enviará al usuario el valor del campo 'mensaje' del objeto JSON que recibió.

Espero que esto te ayude a añadir la funcionalidad que necesitas. Si tienes alguna pregunta o necesitas más ayuda, no dudes en preguntar.

…

Carlos:

agrega un handler para leer una api rest del weather ppara una ciudad y devolver el resultado al usuario

Para agregar un manejador que lea una API REST del tiempo para una ciudad y devuelva el resultado al usuario, puedes hacer lo siguiente:

Importa la biblioteca requests al principio de tu archivo de Python:

Copy code

import requests

Define una función que haga la llamada a la API REST y procese el resultado. En este ejemplo, asumimos que la API del tiempo que estamos usando es OpenWeatherMap y que queremos mostrar al usuario la temperatura actual en grados Celsius de la ciudad que se le indique:

Copy code

def obtener_tiempo(update, context):
    # Obtenemos el nombre de la ciudad del usuario
    ciudad = " ".join(context.args)
    # Validamos que se haya especificado una ciudad
    if ciudad:
        # Hacemos la llamada a la API del tiempo
        API_KEY = 'TU_API_KEY'  # Reemplaza por tu API key de OpenWeatherMap
        url = f'https://api.openweathermap.org/data/2.5/weather?q={ciudad}&units=metric&appid={API_KEY}'
        response = requests.get(url)
        # Procesamos el resultado
        if response.status_code == 200:
            # Si la llamada fue exitosa, obtenemos el objeto JSON
            resultado = response.json()
            temperatura = resultado['main']['temp']
            update.message.reply_text(f'La temperatura actual en {ciudad} es de {temperatura:.1f}°C')
        else:
            # Si la llamada no fue exitosa, informamos al usuario
            update.message.reply_text('Ha ocurrido un error al leer la API del tiempo')
    else:
        # Si no se especificó una ciudad, informamos al usuario
        update.message.reply_text('Por favor, especifica una ciudad')

Añade un manejador para el comando /tiempo que llame a la función obtener_tiempo cuando se ejecute el comando:

Copy code

updater.dispatcher.add_handler(CommandHandler('tiempo', obtener_tiempo))

Ahora, cuando el usuario envíe el comando /tiempo seguido del nombre de una ciudad a través de Telegram, el bot hará una llamada a la API del tiempo de OpenWeatherMap y enviará al usuario la temperatura actual en grados Celsius de la ciudad especificada.

Espero que esto te ayude a añadir la funcional

…

Carlos:
agrega un handler para leer tomar varios parametros del usuario y luego llamar a una api rest y devolver el resultado al usuario

Para agregar un manejador que lea varios parámetros del usuario, haga una llamada a una API REST y devuelva el resultado al usuario, puedes hacer lo siguiente:

Importa la biblioteca requests al principio de tu archivo de Python:

Copy code

import requests

Define una función que procese los parámetros del usuario y haga la llamada a la API REST. En este ejemplo, asumimos que queremos que el usuario nos proporcione dos parámetros: valor_1 y valor_2, y que queremos hacer una llamada a una API que multiplica estos dos valores y devuelve el resultado:

Copy code

def multiplicar(update, context):
    # Obtenemos los parámetros del usuario
    try:
        valor_1 = int(context.args[0])
        valor_2 = int(context.args[1])
    except (ValueError, IndexError):
        update.message.reply_text('Por favor, proporciona dos valores numéricos')
        return

    # Hacemos la llamada a la API
    url = 'https://mi-api.com/multiplicar'
    data = {'valor_1': valor_1, 'valor_2': valor_2}
    response = requests.post(url, json=data)

    # Procesamos el resultado
    if response.status_code == 200:
        # Si la llamada fue exitosa, obtenemos el resultado
        resultado = response.json()['resultado']
        update.message.reply_text(f'El resultado de multiplicar {valor_1} y {valor_2} es {resultado}')
    else:
        # Si la llamada no fue exitosa, informamos al usuario
        update.message.reply_text('Ha ocurrido un error al llamar a la API')

Añade un manejador para el comando /multiplicar que llame a la función multiplicar cuando se ejecute el comando:

Copy code

updater.dispatcher.add_handler(CommandHandler('multiplicar', multiplicar))

Ahora, cuando el usuario envíe el comando /multiplicar seguido de dos valores numéricos a través de Telegram, el bot hará una llamada a la API que multiplica estos valores y enviará al usuario el resultado de la multiplicación.

Espero que esto te ayude a añadir la funcionalidad que necesitas. Si tienes alguna pregunta o necesitas más ayuda, no dudes en preguntar.

…

Carlos:

como hago para hacer deploy de este programa en vercel y que responda al BotFather de Telegram

Para hacer deploy de tu programa de Python en Vercel y que responda al BotFather de Telegram, debes seguir estos pasos:

Asegúrate de tener una cuenta en Vercel y de haber instalado la CLI de Vercel en tu computadora. Si aún no tienes una cuenta en Vercel, puedes crearla en https://vercel.com/. Si aún no has instalado la CLI de Vercel, puedes hacerlo ejecutando el siguiente comando en tu consola:

Copy code

npm install -g vercel

Inicia sesión en Vercel desde la consola usando el comando:

$ vercel login.

Crea un archivo vercel.json en el directorio raíz de tu proyecto con el siguiente contenido:

Copy code

{
  "version": 2,
  "builds": [
    { "src": "*.py", "use": "@vercel/python" }
  ]
}

Este archivo indica a Vercel qué archivos deben ser procesados y con qué runtime. En este caso, estamos indicando que todos los archivos con extensión .py deben ser procesados con el runtime de Python de Vercel.

Crea un archivo .env en el directorio raíz de tu proyecto con el siguiente contenido:

Copy code

TOKEN=TU_TOKEN

Reemplaza TU_TOKEN por el token de acceso que obtuviste del BotFather cuando creaste tu bot. Este archivo contiene las variables de entorno de tu proyecto. En este caso, estamos definiendo la variable de entorno TOKEN que luego podremos usar en nuestro código para acceder al token de acceso del bot.

Ejecuta el comando vercel en la consola para hacer deploy de tu proyecto. Vercel te pedirá que selecciones un nombre para tu proyecto y que confirmes la configuración de deploy.

$ vercel

Una vez que el deploy haya finalizado, Vercel te proporcionará una URL.

Copia esta URL y pégala en la sección "Webhook URL" del menú de configuración del BotFather.

Luego, envía el comando /setwebhook al BotFather para que comience a enviar actualizaciones a tu bot.

$ curl -X POST https://api.telegram.org/bot/setWebhook -H "Content-type: application/json" -d '{"url": "https://project-name.username.vercel.app/api/webhook"}'

Con estos pasos, tu bot debería estar configurado y listo para recibir actualizaciones a través de Vercel. Si tienes alguna pregunta o necesitas más ayuda, no dudes en preguntar.

…

Carlos:

cuales comandos necesito para poder instalar telegram.ext y el programa anterior

Para instalar la biblioteca telegram.ext y ejecutar el programa de Python que te proporcioné anteriormente, necesitarás hacer lo siguiente:

Asegúrate de tener Python instalado en tu computadora. Si aún no lo tienes, puedes descargarlo desde el sitio oficial de Python (https://www.python.org/downloads/).

Instala la biblioteca de Python para el API de Telegram llamada python-telegram-bot. Puedes hacer esto ejecutando el siguiente comando en tu consola:

Copy code

pip install python-telegram-bot

Crea un archivo de Python y coloca el siguiente código en él:

Copy code

import logging

from telegram.ext import Updater, CommandHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

def start(update, context):
    update.message.reply_text('Hola! Soy un bot de Telegram')

def main():
    # Creamos el Updater y le pasamos el token de acceso
    updater = Updater('TOKEN', use_context=True)
    # Añadimos un manejador para el comando /start
    updater.dispatcher.add_handler(Command

…

Carlos:

como hago para crear un pipenv con todo esto

Para crear un pipenv con la biblioteca python-telegram-bot y el código que te proporcioné anteriormente, debes seguir estos pasos:

Asegúrate de tener pipenv instalado en tu computadora. Si aún no lo tienes, puedes instalarlo ejecutando el siguiente comando en tu consola:

Copy code

pip install pipenv

Crea un directorio para tu proyecto y accede a él a través de la consola.

Ejecuta el siguiente comando para crear un pipenv y especificar que quieres usar Python 3.8:

Copy code

pipenv --python 3.8

Una vez que el pipenv haya sido creado, instala la biblioteca python-telegram-bot ejecutando el siguiente comando:

Copy code

pipenv install python-telegram-bot

Crea un archivo de Python y coloca el siguiente código en él:

Copy code

import logging

from telegram.ext import Updater, CommandHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

def start(update, context):
    update.message.reply_text('Hola! Soy un bot de Telegram')

def main():
    # Creamos el Updater y le pasamos el token de acceso
    updater = Updater('TOKEN', use_context=True)
    # Añadimos un manejador para el comando /start
    updater.dispatcher.add_handler(CommandHandler('start', start))
    # Iniciamos el bot
    updater.start_polling()
    updater.idle()

if name == 'main':
    main()

Reemplaza TOKEN por el token de acceso que obtuviste del BotFather cuando creaste tu bot.

Crea un archivo Pipfile en el directorio raíz de tu proyecto con el siguiente contenido:

Copy code

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
python-telegram-bot = "*"

[requires]
python_version = "3.8"

…