Este es uno de los capítulos del tutorial Exprimiendo Telegram. Crea tu propio bot para Telegram.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En el artículo anterior de Exprimiendo Telegram vimos los pasos mínimos indispensables para crear un bot. Allí vimos como utilizando BotFather dábamos de alta nuestro bot. En este proceso, obteníamos un token, que será el que hoy utilizaremos para que nuestro bot funcione. Las primeras funcionalidades que le vamos a dar a nuestro bot van a ser muy sencillas. Inicialmente este bot de telegram solo mandará mensajes de texto plano.
Sin embargo, como veremos en próximos artículos, veremos como ampliar nuestro bot inicial, añadiendo nuevas funcionalidades para enviar ubicaciones, documentos, contactos, audios, imágenes, vídeos y mucho mas.
Un bot de telegram para enviar mensajes
La API para construir un bot de telegram
Como ya comentamos en el artículo anterior, vamos a utilizar una API que nos permite integrar de forma muy sencilla Telegram con Python. Se trata de python-telegram-bot , y es una librería liberada bajo licencia LGPLv3. Como verás de aquí en adelante, es muy sencilla de utilizar, y nos va a permitir crear nuestro bot de Telegram de forma muy sencilla.
Requisitos
Como he comentado en el punto anterior, es requisito indispensable tener la librería de Python, python-telegram-bot. aunque para facilidad, y como hago en otras ocasiones, he creado un repositorio del bot de Telegram senderbot en GitHub. Para instalarlo todo lo necesario solo tienes que ejecutar la siguiente orden en un terminal,
git clone --recursive https://github.com/atareao/senderbot.git
Es posible que necesites alguna dependencia adicional, como puede ser python3-future
, python3-certifi
, python3-requests
. En ese caso ejecuta la orden,
sudo apt install python3-requests
sudo apt install python3-future
sudo apt install python3-certifi
Una vez clonado el repositorio en tu equipo, dentro del directorio src
encontrarás el bot de Telegram en cuestión, senderbot. Como verás es un sencillo ejecutable que funciona desde la línea de comandos. Pero, vamos paso por paso.
La parte importante, y básicamente lo único que nos interesa de este archivo es lo siguiente,
class SenderBot(Bot): def __init__(self, token=None, channel_id=None): if token is None or channel_id is None: configuration = Configuration() token = configuration.get('token') channel_id = configuration.get('channel_id') Bot.__init__(self, token) self.channel_id = channel_id def send_message(self, text): super(SenderBot, self).send_message(chat_id=self.channel_id, text=text, parse_mode=ParseMode.HTML)
Como ves es muy sencillo, tan solo heredamos de la clase Bot
de la librería y para enviar un mensaje, en formato HTML, utilizando el modo ParseMode.HTML. También hay posibilidad de utilizar otro modo que sería ParseMode.MARKDOWN, para enviar el mensaje en Markdown.
Ahora bien, ¿De donde sacamos el parámetro channel_id
y a que se refiere?. channel_id
es la identificación de donde lo vamos a enviar. Por ejemplo, en mi caso, yo suelo enviar mensajes desde la Raspberry Pi a mi cuenta de Telegram. Esto lo hago por ejemplo para informa cuando termina un proceso o cuando se produce un evento en particular.
Para obtener el channel_id
de nuestra cuenta, tan solo tenemos que llamar al bot de Telegram @get_id_bot. Al iniciar el bot /start
nos mandará un mensaje en el que nos indica Your Chat ID = 1234567
. Este es el que debemos utilizar.
Instalación del bot de Telegram desde repositorio
Como ya comenté en el artículo anterior, he creado un repositorio en Launchpad, desde donde podrás instalar el bot, sin necesidad de aprender a programar en Python, ni nada de nada. Para la instalación, debemos ejecutar las siguientes órdenes,
sudo add-apt-repository ppa:atareao/telegram
sudo apt update
sudo apt install senderbot
Uso y funcionamiento de senderbot
En el caso de que no instales senderbot
es decir, que simplemente clones el repositorio, entra en el directorio src
y ejecuta senderbot -h
para ver las instrucciones de uso. En el caso de que lo hayas instalado desde repositorio, ejecuta directamente la siguiente orden,
senderbot -h
Al ejecutar esta orden senderbot
nos muestra la siguiente ayuda,
Usage: senderbot [options] arg Options: -h, --help show this help message and exit -c CHANNEL_ID, --set-channel-id=CHANNEL_ID set channel id where bot will send messages -m MESSAGE, --message=MESSAGE send a message to the channel -p, --print-config Print configuration -t TOKEN, --set-token=TOKEN set the TOKEN of the bot
Las opciones son las siguientes,
-h
nos muestra la anterior ayuda-c
nos permite definir elID
del canal, tal como hemos visto anteriormente.-t
nos permite definir elTOKEN
del bot como vimos en el artículo anterior.-p
nos muestra la configuración, básicamente elID
del canal y elTOKEN
del bot.-m
nos permite enviar un mensaje con formato HTML
Así para configurar nuestro bot, ejecutaríamos la orden,
senderbot -c 1234567 -t XXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXX
Ahora podríamos mandar un texto en negrita ejecutando la siguiente orden,
senderbot -m "Hola"
Si piensas enviar varios mensajes seguidos, conviene que los agrupes en un solo, puesto que cada vez que envía un mensaje lee los parámetros del archivo de configuración, lo que es poco eficiente.
Conseguir que el bot de Telegram te avise cuando se inicia tu equipo o se apaga
Esto es relativamente sencillo. En el caso de que lo hayas instalado desde el paquete del repositorio, no debes preocuparte, porque ya añadí yo los archivos en cuestión. Solo te tienes que preocupar de habilitar o inhabilitar los servicios.
Servicios de inicio y fin
Tan solo debes añadir dos archivos al directorio /etc/systemd/system
. En mi caso los he llamado message_start.service
y message_stop.service
. Cada uno de los dos sirve para avisarte cuando se inicia tu equipo, o cuando se apaga respectivamente.
Antes de nada, debes configurar senderbot
para que lo utilice el administrador, para lo que ejecutarás la siguiente orden,
sudo senderbot -c 1234567 -t XXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXX
El contenido de los archivos será el siguiente,
message_start.service
[Unit]
Description=Message for start
[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/usr/bin/python3 /usr/bin/senderbot -m "Iniciando"
[Install]
WantedBy=multi-user.target
message_stop.service
[Unit]
Description=Message for stop
[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/usr/bin/python3 /usr/bin/senderbot -m "Parando"
[Install]
WantedBy=multi-user.target
Para habilitar los servicios tienes que ejecutar las siguientes órdenes,
sudo systemctl enable message_start
sudo systemctl enable message_stop
Si te has cansado de utilizarlos puedes ejecutar las siguientes órdenes para inhabilitarlos,
sudo systemctl disable message_start
sudo systemctl disable message_stop
Por último, para conocer si están habilitados o inhabilitados, ejecutarás las siguientes órdenes,
sudo systemctl is-enabled message_start
sudo systemctl is-enabled message_stop
Por supuesto que puedes cambiar los mensajes que he puesto de “Inciando” y “Parando”, por tus propios mensajes y personalizarlos según tus necesidades.
Conclusiones
Ya tienes tu primer bot de Telegram. Se trata de un punto de partida, para que veas sobre todo como funciona la API de Telegram y la librería para Python que he mencionado al inicio. Además he completado el bot de Telegram con dos servicios para que nos avise cuando se inicie y se detenga nuestra máquina, aunque recuerda que debes configurar el bot para el administrador del equipo.
En el próximo artículo veremos como ampliar nuestro bot con nuevas funcionalidades, para además de enviar mensajes, dar la posibilidad de que envíe imágenes, archivos de audio y archivos en general.
Más información,
Buen artículo, bueno todo don buenos simple y claros, yo hice un bot para telegram en nodejs y estuvo interesante, use cloud9 para funcionara online
Muchas gracias Alejandro.
Yo lo estoy utilizando en una Raspberry Pi, que siempre está en funcionamiento y es muy útil.
Gracias y un saludo.
buen día, me podrían ayudar con la instalación de «python3-future» y «python3-certifi»? me aparece el siguiente error:
«E: No se ha podido localizar el paquete python3-future»
«E: No se ha podido localizar el paquete python3-certifi»
En mi laptop funciona todo bien, pero en la raspberry no puedo instalar esas dos dependencias. Agradezco mucho la ayuda.
Hola,
Entiendo que en la Raspberry tienes la versión Jessie. En ese caso, tienes dos opciones, o bien actualizas a Stretch, o bien, haces los siguientes pasos,
añades la línea «deb http://ftp.debian.org/debian jessie-backports main» al final de «/etc/apt/sources.list»
actualizas
$ sudo apt update
e instalas los dos paquetes de la siguiente forma,
$ sudo apt -t stretch-backports install python3-future
$ sudo apt -t stretch-backports install python3-certifi
Un saludo.
muchas gracias, he tomado la opción 2 y ya funciona el bot.
Quisiera hacer una pequeña corrección, en la línea
$ sudo apt -t stretch-backports install …
saldrá error. Lo corregí cambiando «stretch-backports» por «jessie-backports» ya que así fue como quedó guardado en el archivo sources.list.
Muchas gracias Juank, corregido. Lo he incluido en el próximo o en el siguiente capítulo de esta serie.
Un saludo y gracias.
Tengo problemas a la hora de instalar el senderbot, intentandolo tando desde el repositorio como de git.
Una vez clonado el repositorio intento ejecutar el senderbot y me da el siguinete resultado:
Traceback (most recent call last):
File «./senderbot», line 38, in
import lxml.html as lh
ImportError: No module named ‘lxml’
y si intento añadir el repositorio e instalar directamente el senderbot me da estos problemas:
– sudo add-apt-repository ppa:atareao/telegram:
Traceback (most recent call last):
File «/usr/bin/add-apt-repository», line 95, in
sp = SoftwareProperties(options=options)
File «/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py», line 109, in __init__
self.reload_sourceslist()
File «/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py», line 599, in reload_sourceslist
self.distro.get_sources(self.sourceslist)
File «/usr/lib/python3/dist-packages/aptsources/distro.py», line 89, in get_sources
(self.id, self.codename))
aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Raspbian/stretch
– sudo apt install senderbot: (Obviamente me dice que no encuentra el paquete, pero pego el resultado)
Reading package lists… Done
Building dependency tree
Reading state information… Done
E: Unable to locate package senderbot
Trabajo desde una raspberry pi zero con version 9.3
Hola,
Instala python3-lxml
Saludos
Muchisimas Gracias!! Todo perfecto ya!
Perfecto. Pablo. A disfrutarlo.
Un saludo.
Hola, necesito que me manden un mensaje a telegram cada vez que arranco y apago mi PC con debian pero con lenguaje bash. ¿Cómo podría ser?
Hola Naiara,
Siguiendo los pasos que te indico en este capítulo puedes hacerlo fácilmente. Pero, no se a que te refieres con lenguaje bash…
http://www.ubuntuleon.com/2016/10/cargar-un-script-al-inicio-del-sistema.html
Tipo como lo que comentan en esta página pero utilizándolo para enviar avisos a telegram cada vez que se inicie o se apague el sistema de debian. Un saludo.
Hola Naiara,
Puedes utilizar telegram-cli para el script en bash, pero no se exactamente porque quieres hacerlo en bash, y no utilizando Python….
Yo lo tengo implementado siguiendo los pasos que indico aquí en una Raspberry Pi. Para cada vez que se apaga (de forma programada) o se reinicia me avisa….
Te recomiendo que sigas los pasos indicados aquí, y si tienes cualquier problema, me dices y te ayudo. Si utilizas Telegram, ponte en contacto conmigo por allí (si quieres) y lo resolvemos fácil.
Un saludo y gracias
Hola necesito tu ayuda. Como puedo enviar la fecha y hora actuales en el mensaje a telegram?
Buen post y muchas gracias de antemano
Hola!
Gracias por el artículo, es justo lo que estaba buscando para poder mandarme telegram desde mi servidor de Ubuntu 18.04.
Al ejecutar senderbot -h (instalado mediante GIT), me da el siguiente error:
Traceback (most recent call last):
File «./senderbot», line 26, in
from PIL import Image
ModuleNotFoundError: No module named ‘PIL’
¿Sabrías decirme como puedo solucionarlo?
Gracias de antemano,
Fede
Hola Federico,
Me alegro que te sirva. Tienes que instalar la librearía python3-pil.
Un saludo
Hola Lorenzo!!!
Hice la instalación del paquete desde el repositorio y al ejecutarlo me indica que no encuentra el modulo picamera:
«no module named picamera». Estoy en ubuntu 1810. Saludos.
¿Como lo instalaste?¿No está disponible para 18.10?¿Que versión instalaste?
Gracias
Lo instale desde Launchpad, sólo eso. Lo intente tambien en ubuntu 18.04 y me muestra lo mismo, aunque el mensaje si se envía.
Prueba con la actualización.
Saludos
Hola,
Antes que nada excelente post. No tengo una Rasperry, puedo importar el proyecto por ejemplo a una máquina virtual?, eso me daría problemas con picamera? Estoy en Ubuntu 16.04
En principio no. Sólo te saldrá un mensaje de error, pero no para nada. Si tienes problemas me dices.
He instalado el bot en Ubuntu pero tengo dos problemas, no encuenta el modulo picamera y aparte me da el siguiente error:
[Errno 2] No such file or directory: ‘/home/itorres/.config/senderbot/senderbot.conf’
Espero aluien me pueda orientar. Gracias
Hola,
¿Cual es el el módulo picamera? Lo he repasado y no lo encuentro
Tienes que crear el archivo /home/itorres/.config/senderbot/senderbot.conf con le chat_id y el token del bot.
Saludos.