Una de las preguntas más recurrentes que más me han hecho a lo largo del curso de Python desde Cero orientado a Web Scraping para crear un Bot de Telegram es esta precisamente.
Pues bien, a continuación paso a desvelaros la opción por la que me he decantado yo y el por qué.
Índice
Opciones disponibles
Básicamente, existen 2 posibles opciones:
Servicios en la nube
Hay muchos y muy diversos servicios en la nube que nos permiten ejecutar nuestros programas en Python (en este caso vamos a centrarnos en un bot de Telegram), pero el mayor problema que éstos tienen es que, si bien muchos disponen de una opción gratuita, ésta es extremadamente limitada, sobre todo en cuanto a tiempo de ejecución diaria, número de peticiones, etc. Pero lo peor de todo es que incluso si nos decidimos por alguna de las opciones de pago más asequibles, éstas siguen siendo bastante limitadas, siendo a menudo las opciones más caras las únicas que se adaptarían a nuestras necesidades.
Hasta hace muy poco, la opción más popular era Heroku, pues su opción gratuita era en algunos casos viable, pero Heroku ya ha cortado el grifo: a partir del 28 de noviembre de 2022, ha decidido cerrar todas las cuentas gratuitas que no hayan optado por una de las opciones de pago, presuntamente por el abuso que los usuarios han hecho de tal servicio gratuito.
En cualquier caso, tal y como ya os conté en el respectivo vídeo del curso, para mí Heroku nunca fue una opción viable, puesto que, todo bot que se precie debería estar ejecutándose 24/7.
Ejecutar el bot localmente
Esto no es más ni menos que correr el programa Python desde un equipo nuestro.
La primera opción que se nos pasa por la cabeza es correr el bot desde nuestro propio ordenador. Pero esto conlleva una serie de problemas: el primero y más importante es el consumo energético. Me explico:
Partimos de que necesitamos ejecutar el bot 24/7, es decir, todos los días del año a todas horas. Esto supone tener el ordenador encendido constantemente. El consumo diario de un ordenador varía dependiendo de si es un sobremesa o un portátil, de los componentes de éste (gráfica, fuente de alimentación, etc.), pero para los cálculos vamos a ser muy optimistas y tomaremos como referencia un consumo medio de 50W cada hora. Esto serían 0,05 kWh que, multiplicado por 24 horas del día y por 30 días del mes (0,05x24x30), nos da un total de 36 kWh al mes. Ahora, para traducir esto a dinero, tendríamos que multiplicarlo por el precio que pagamos por kWh, el cual va a depender de la tarifa eléctrica que tengamos contratada, entre otras cosas. Yo tomaré como referencia lo que vengo pagando actualmente: 0,178662€ por kWh. Esto nos dá un total de 6,43 € al mes. Todo esto, recordad que es siendo muy optimistas en cuanto al consumo del ordenador. Si utilizáis algún enchufe inteligente para medir el consumo de vuestro ordenador veréis que es incluso demasiado optimista.
El otro inconveniente sería que, si estamos corriendo el bot en nuestro ordenador de uso habitual, esto resulta un poco engorroso si solemos utilizar el ordenador para otras tareas diarias, ya sea navegar por internet, jugar a videojuegos, etc. pues, además de que puede molestarnos y distraernos la terminal que está ejecutando el bot, también hay que tener en cuenta que consume ciertos recursos que repercuten en el resto de tareas que queramos realizar, esto sin contar que si por lo que sea necesitamos reiniciar el ordenador (por la actualización de algunos drivers o la instalación de algún programa nuevo, por ejemplo), tendríamos que volver a ejecutar el bot. Y todo esto son solo algunos inconvenientes que se me ocurren durante la redacción de este artículo, que sin duda habrá muchos más.
Por todo lo anterior y otras cosas que ahora ya no recuerdo, la solución por la que opté y que a mi juicio es la más económica y eficiente es la siguiente:
Mi solución: Raspberry Pi 4
No os voy a soltar la típica parrafada explicando sus orígenes y demás, para eso ya tenéis un artículo muy completito en la Wikipedia.
Es muy probable que la mayoría de vosotros ya conozcáis este dispositivo y sus características, pero para los que no, permitidme que os ilustre: no es ni más ni menos que un ordenador, pero del tamaño de una cajetilla de tabaco y con unas prestaciones nada despreciables, entre las que destacaría:
- Procesador: Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC 1.5GHz
- RAM: 1GB, 2GB, 4GB o 8GB LPDDR4 (dependiendo del modelo)
- WiFi: 2.4 GHz y 5.0 GHz IEEE 802.11b/g/n/ac
- Bluetooth: 5.0
- Gigabit Ethernet
- 2 × USB 3.0
- 2 × USB 2.0
- 2 × micro HDMI (hasta 4K 60fps)
- Puerto MicroSD
Pero sin lugar a dudas, su punto más fuerte es su bajísimo consumo energético. Yo la tengo conectada desde el primer día de uso a un enchufe inteligente que permite medir el consumo, lo que me ha permitido conocer de primera mano el consumo real de este cacharrito.
Como podéis ver en la captura de la app de Meross, su consumo el mes pasado fue de 3,059 kWh que si traducimos a dinero como hemos hecho antes, nos da un total de 0,55 € al mes. Algo totalmente irrisorio y que desde luego no es comparable a ninguna de las tarifas que encontraremos en ninguna nube del cielo…
Es cierto que hay que tener en cuenta el desembolso inicial, pues el cacharrito no nos viene de regalo en los paquetes de cereales y más teniendo en cuenta que con la escasez de materias primas actuales se han disparado los precios porque hay muchísima más demanda que oferta. De hecho es muy complicado encontrar alguna tienda que disponga de stock.
En sus inicios era relativamente sencillo adquirirla por unos 50€ la versión de 4GB que yo considero que es la ideal para nuestros menesteres.
Sin embargo, en el momento de la redacción de este artículo (23/12/2022), en Amazon figura por 185€ y por lo menos aparentemente tienen stock porque como os decía antes, no es lo habitual.
En cualquier caso, aún así, para mi sigue siendo la mejor opción hoy día para ejecutar un bot de Telegram 24/7. Incluso si solo tenemos en cuenta el precio, pues la alternativa sería un servicio en la nube de pago mediante una suscripción mensual y, con la Raspberry simplemente sería un pago único para adquirir lo necesario y a partir de ahí nos olvidamos. Si hacemos los cálculos, la amortizamos en un tiempo razonable, comparándolo con los servicios de pago en la nube. Además, podemos utilizarla para muchas otras cosas…
Instalación y configuración de la Raspberry Pi 4
Para poder utilizar la Raspberry, como ordenador que es, necesitamos instalar un sistema operativo. En este sentido disponemos de un abanico muy amplio, aunque personalmente os recomiendo la versión oficial: RaspiOS, la cual es una distribución de Linux basada en Debian y especialmente optimizada para ser utilizada en la Raspberry.
Tanto la instalación del sistema operativo como su configuración son tareas relativamente sencillas, aunque de primeras, si no estamos muy familiarizados con Linux, nos tocará hacer más de una búsqueda en Google para aprender a hacer ciertas cosas.
Para que esta labor os sea lo más sencilla posible, os tengo preparados una serie de scripts tanto en Python como en Bash que os dejarán RaspiOS listo para que vuestros bots empiecen a funcionar.
Como la Raspberry no dispone de memoria interna, deberemos instalar el sistema operativo en una tarjeta MicroSD que hará las veces de disco duro.
Para seguir este tutorial necesitaremos:
- Raspberry Pi 4 (os recomiendo la versión de 4GB, aunque quizá la de 2GB os sea suficiente)
- Adaptador de corriente para Raspberry Pi 4 (os recomiendo el oficial. He tenido muy malas experiencias con otros presuntamente compatibles)
- Tarjeta MicroSD (recomendable más de 16GB. De 32 o 64GB es lo ideal)
- Teclado y ratón USB (personalmente utilizo uno inalámbrico con receptor USB) En teoría también se pueden utilizar por Bluetooth, pero esto es algo que yo no he probado nunca.
- Cable microHDMI -> HDMI (para conectar la salida de vídeo de la Raspberry a un monitor o TV) Esto solo será necesario durante la configuración de la Raspberry, luego podremos conectarnos a la misma a través de un escritorio remoto, pudiendo prescindir de dicho cable si lo deseamos.
- Lector de tarjetas microSD (o SD con el adaptador microSD>SD correspondiente que suele venir incluído al comprar las microSD)
- Pendrive USB en el que guardaremos nuestro bot de Python y los scripts para configurarlo todo.
Por último, aunque no es imprescindible, sí es muy recomendable adquirir también una carcasa que evite que la Raspberry se caliente. Yo he probado muchas y curiosamente, la que mejor resultado me ha dado fue la más barata de todas ellas y además no tiene ventilador, pues toda la carcasa es un disipador en sí, así que ¡¡¡RUIDO CERO!!!
Preparando el Pendrive con nuestro bot y los scripts de configuración
A continuación os dejo un archivo ZIP en el que están los 3 scripts que utilizaremos a lo largo de este tutorial.
Descargar Scripts RaspiOS by FRIKIdelTO
Tras descargar el ZIP, lo descomprimimos en la carpeta de nuestro bot que deberemos copiar en el pendrive.
Instalar RaspiOS en la microSD
El primer paso es muy sencillo y para ello solo necesitaremos 2 cosas: la imagen del sistema operativo y un programa para volcar dicha imagen en la microSD. A continuación tenéis los enlaces para descargar ambos desde las fuentes oficiales:
- RaspiOS 32bit con escritorio (la versión con la que están probados los scripts que utilizaremos más adelante es «Raspberry Pi OS with desktop» del 22 de septiembre de 2022. Es probable que los scripts funcionen igualmente con versiones futuras del sistema operativo, pero si queréis estar 100% seguros, os recomiendo descargar esta versión.
- BalenaEtcher (para volcar la imagen anterior en la microSD)
Una vez descargada la imagen de RaspiOS e instalado BalenaEtcher:
- Insertamos la microSD en el lector y éste en nuestro PC.
- Ejecutamos BalenaEtcher:
- Clic en
Flash from file
y seleccionamos la imagen de RaspiOS descargada. - Nos aseguramos de que está seleccionada la MicroSD.
- Clic en
Flash!
. Nos aparecerá una ventana de Windows solicitando permiso para realizar la operación. Aceptamos y comenzará el proceso de flasheo de la MicroSD con la versión de RaspiOS descargada.
- Clic en
Configuración y Personalización de RaspiOS
Ahora sacamos la microSD del lector y la introducimos en la Raspberry con cuidado de hacerlo en el sentido correcto, es decir, con los pines hacia arriba.
Conectamos también el pendrive en cualquiera de los puertos USB de la Raspberry.
Conectamos la Raspberry con el monitor/TV a través del cable microHDMI.
Hacemos lo propio con el teclado y el ratón y conectamos el adaptador de corriente a la Raspberry Pi.
Acto seguido, la Raspberry arrancará y nos presentará el primer menú de configuración en el que tendremos que seleccionar en los menús desplegables: nuestro país, idioma y zona horaria.
Luego, tendremos que crear un usuario cuyo nombre solo puede contener minúsculas, números y guiones, pero debe empezar por una letra. Introducimos también 2 veces la contraseña que deseemos para nuestro usuario.
Si la imagen en la pantalla se ve demasiado grande, marcamos la casilla «Reduce the size of the desktop in this monitor» para solucionarlo, en caso contrario lo dejamos como está.
A continuación seleccionamos nuestra red WiFi e introducimos la contraseña para conectarnos a ella.
Ahora nos sugiere actualizar el sistema, pero pulsaremos sobre «Skip» porque ya lo harán los scripts.
Pulsamos en «Restart» y la Raspberry se reiniciará mostrándonos el escritorio, en el cual veremos un icono de la papelera y otro de nuestro pendrive. Pulsamos en él para abrirlo.
Copiamos la carpeta de nuestro bot que también contiene los scripts que hemos descargado antes, y la pegamos en nuestra «carpeta personal».
Ahora entramos en la carpeta de nuestro bot y ejecutamos el primero de los scripts: «1.Setup_RaspiOS.sh» pinchando dos veces con el ratón sobre él. Seleccionamos «Ejecutar en el terminal» y el script empezará a actualizar y configurar el sistema operativo. Os recomiendo maximizar la ventana de la terminal para verlo todo más claro e incluso pulsar un par de veces CTRL
y +
para ver el texto más grande.
Tras unos 8 minutos aproximadamente, veréis en la terminal la configuración de TeamViewer que es el escritorio remoto que yo utilizo y el que os recomiendo.
Si no disponemos de una cuenta de Teamviewer (es gratis), deberemos crearla antes desde este enlace.
Contestamos n
ya que supongo que no vivimos en la República de Korea, luego y
para aceptar el acuerdo de licencia. Introducimos nuestro usuario de Teamviewer (el email) y nuestra contraseña de Teamviewer. Nos indicará que se añadirá el dispositivo a nuestra cuenta como «raspberrypi» porque es el nombre por defecto. Luego, en Teamviewer si lo deseamos podemos renombrarlo, así que confirmamos pulsando y
. Es posible que se nos envíe un email para confirmar el nuevo dispositivo agregado a nuestra cuenta de Teamviewer, en ese caso, accedemos a nuestro email y seguimos los pasos para hacerlo.
Tras lo anterior, se reiniciará el panel (lo que vemos en la parte superior de la pantalla, que es lo equivalente a la barra de tareas de Windows) y podremos ver que, además de cambiar de color (el rojo es mi color favorito jijiji) aparecerán unos widgets a la derecha que nos permitirán saber en tiempo real (de izquierda a derecha) el % de uso de la CPU, la cantidad de memoria RAM en uso (si hacemos clic en este se abrirá el administrador de tareas) y la temperatura de la CPU en Cº
Pulsamos R
y se reiniciará la Raspberry.
Configuración de nuestro bot Python
Ahora procederemos a configurar lo necesario para que nuestro programa en Python, en este caso nuestro bot, pueda ejecutarse en RaspiOS.
Abrimos una terminal. Podemos hacerlo en el icono de acceso directo del panel o con el atajo de teclado CTRL
+ALT
+T
.
Esto nos abrirá la terminal en nuestro directorio personal, por lo que lo siguiente es situarnos en el de nuestro bot, simplemente usando el comando cd <carpeta_del_bot>
, en mi caso cd FRIKIfotofix
.
Lo que haremos ahora es instalar los módulos que nuestro programa en Python necesita para funcionar. Para ello ejecutaremos el siguiente script que lo hará automáticamente. En este caso no es un script en bash, sino en Python.
Antes de continuar debo aclarar una cosilla: En RaspiOS, por defecto, vienen instaladas dos versiones de Python, la 2 y la 3. Como a nosotros la que nos interesa para nuestro bot es la versión 3, para correr cualquier programa en Python deberemos utilizar el comando python3
para asegurarnos de que estamos utilizando la versión 3.x ya que, dependiendo de la versión de RaspiOS, si usamos el comando python
, es posible que enlace a la versión 2.
Así que escribimos python3 2.Autoinstalar_modulos_Python.py
Aquí aprovecho para mostraros un truquillo que os vendrá de perlas para los más novatos en Linux (aunque también es aplicable en la consola de Windows). Si en cualquier momento pulsamos TAB
, se autocompletará la palabra que proceda en cada caso, dentro de las opciones disponibles.
Ejemplo: en el caso del comando anterior, si escribimos python3 2
y a continuación pulsamos TAB
, se autocompletará el nombre del script Python automáticamente, ahorrándonos tiempo.
Lo dicho, ejecutamos el script y veremos que lo único que hace es mostrarnos cómo se utiliza, puesto que el script necesita un parámetro más que es el que le indica lo que realmente queremos hacer. En nuestro caso, como lo que queremos es instalar los módulos, simplemente añadimos el parámetro -i
:
python3 2.Autoinstalar_modulos_Python.py -i
A continuación veremos cómo empiezan a instalarse/actualizarse los módulos necesarios para el funcionamiento de nuestro bot.
Accesos directos en el panel y Autoarranque con el sistema
Para que nos sea mucho más cómodo ejecutar nuestro bot e incluso para que se inicie automáticamente al arrancar la Raspberry y seamos todos más felices y los unicornios bailen entre arcoíris (perdón que se me va la pinza), ejecutaremos el tercero y último de los scripts que hemos descargado.
Antes de nada debo aclarar que si queremos que el acceso quede mucho más bonito y profesional, os recomiendo crear un icono en formato PNG con una resolución de 192×192 píxeles dentro de una carpeta llamada icon
como véis en la siguiente imagen.
Como ya estamos situados en el directorio correspondiente y el script está hecho en bash, simplemente escribimos:
bash 3.Accesos_y_Arranque.sh
(recordad el truquillo TAB
)
Se nos mostrará una lista con los archivos .py que se encuentran en el directorio raíz de nuestro bot, así que simplemente introducimos el número que corresponda y pulsamos Enter.
A continuación, si tenemos un archivo PNG del icono dentro de la carpeta correspondiente, se nos preguntará si queremos utilizarlo como icono de nuestro acceso directo o si preferimos que éste tenga un icono por defecto (por Dios no hagáis eso que queda todo muy feo y los unicornios se van a tomar por culo). Al igual que antes, introducimos el número correspondiente a nuestra opción deseada y pulsamos Enter.
Ahora toca decidir cómo queremos que se muestre la ventana de la terminal en la que se ejecutará nuestro bot. No tiene mucho misterio: en la mitad izquierda, en la mitad derecha o maximizada. Si vamos a ejecutar más de un bot simultáneamente en la Raspberry, supongo que ya sabréis qué es lo más lógico…
Ahora toca decidir si queremos que el bot se ejecute automáticamente al arrancar la Raspberry. Esto lo dejo a vuestra libre elección. En mi caso por supuesto que lo arranco al inicio. Pulsamos S
o N
según corresponda…
Hecho todo esto, ya solo nos resta indicar un nombre para el acceso directo y ya lo tendremos todo listo.
Veremos que hay un nuevo icono en el panel para poder ejecutar nuestro bot mucho más cómodamente.
Si no vamos a configurar ningún otro bot, pulsaremos R
para reiniciar la Raspberry o S
para salir y configurar el siguiente bot ejecutando los scripts 2 y 3 en la carpeta del mismo para instalar los módulos correspondientes y añadir el acceso directo, respectivamente.
Base vertical para 3 Raspberry Pi con disipador
Como habéis visto en el vídeotutorial del curso, actualmente tengo 3 Raspberry Pi 4 corriendo diversos bots, y para tenerlo todo mucho más organizado, las he puesto en una base que me permite posicionarlas verticalmente, ahorrando mucho más espacio y, por qué no decirlo, obteniendo un resultado mucho más estético.
Dicha base que yo sepa no está a la venta. Ni siquiera una parecida. En su día busqué mucho para obtener esto y no encontré nada. Tan solo un modelo STL para su impresión 3D que es el que véis en esta imagen:
Como podéis apreciar, está diseñada para colocarlas verticalmente y con el disipador que os recomendé, con lo cual a mi me vino como anillo al dedo.
Aquí os dejo el enlace al modelo 3D para que podáis descargarlo e imprimirlo si os interesa.
Conclusiones
Como os dije antes, para mí la mejor alternativa para ejecutar un bot 24/7 y sin limitaciones más allá de las que pueda suponer el propio hardware de la Raspberry, es el que os muestro en este tutorial.
Dicho esto, mi ansia por aprender no conoce límites y si conocéis algún otro método que consideráis que es mejor, por favor, os animo a que me lo indiquéis en los comentarios para beneficio de todos.
De igual forma, si tenéis algún problema con los scripts (que no son perfectos ni mucho menos), indicadlo también en los comentarios y lo resolveremos entre todos.
Un saludo y espero que todo esto os sirva de ayuda.
Videotutorial
Aquí podéis ver el tutorial que hice de todo el proceso, el cual complementa a este artículo.
Os recomiendo que lo veáis porque hay cosas que menciono en el vídeo que no hice en el artículo y viceversa.