Hace unos días tuve la necesidad de utilizar una especie de Command and Control (C&C) para dar órdenes a un script de un pequeño proyecto que explicaré pronto. Después de echar una mirada a la siempre ávida industria del malware, entre las diferentes soluciones de IRC, mail, Tor, P2P, finalmente decidí que lo más sencillo era crear un bot de Telegram.
La utilidad de los bots de Telegram depende de la imaginación de cada uno. Se pueden crear para jugar como @TriviaBot, para crear encuestas como @PollBot, o en mi caso como control remoto para otros dispositivos. Desde este punto de vista se abren muchas posibilidades en el mundo de la domótica casera.
Al contrario de Whatasapp, Telegram promueve el uso de Bots entre sus usuarios y existen numerosas APIs para su desarrollo. Las podemos encontrar de todos los sabores: Java, C++, Python, Go, etc. En mi caso por comodidad me decanté por Python, últimamente desarrollo mucho en este lenguaje de programación.
Para crear un bot de Telegram primero necesitamos obtener un Token de autenticación. Con este Token podremos comunicarnos con los servidores de Telegram a través del protocolo HTTP enviar paquetes en formato JSON. El token de autenticación nos lo dará el padre de todos los bots: @BotFather. Iniciamos una conversación con él desde cualquier cliente de Telegram y le enviamos el comando /newbot.
@Botfather nos preguntará por el nombre del bot y su nombre de usuario que siempre tiene que terminar con el sufijo «bot». A continuación nos dará el token de acceso. De momento no necesitamos nada más aunque tiene muchas otras opciones que podéis explorar.
Ahora vamos a programar nuestro bot descargando la API para python Telebot
pip install pyTelegramBotAPI
Para iniciar el bot en el script de python necesitamos hacer:
import telebot TOKEN = 'xxxxxxxxxxxxx' #Ponemos nuestro TOKEN generado con el @BotFather bot = telebot.TeleBot(TOKEN) #Creamos nuestra instancia "mi_bot" a partir de ese TOKEN
Definimos una función para recibir los comandos del bot:
# Handle '/start' and '/help' @bot.message_handler(commands=['help', 'start']) def send_welcome(message): cid = message.chat.id # Guardamos el ID de la conversacion para poder responder.
Y si queremos que el bot nos envie mensajes:
bot.send_message(cid, text) # Ejemplo tb.send_message('123456789', 'Hola mundo!')
La API permite enviar fotos, videos, PDF, audio, etc. como si se tratase de un usuario normal. Podéis profundizar mirando la documentación de la API y practicando con los diferentes ejemplos.
Una cosa que debéis de tener en cuenta es que los bots son públicos y cualquiera podría utilizar vuestro bot. En mi caso como control de autenticación he puesto una contraseña junto con el comando /start en un pobre intento de dar un poco más de seguridad.
El bot que he creado tiene como misión escribir en un fichero la palabra «ON» u «OFF» según yo le indique. De este modo podré desde mi teléfono móvil indicar que se ejecute un script que está leyendo periódicamente este fichero.
Telegram nos permite modificar el teclado. Para este bot he creado un teclado personalizado con dos botones («ON» y «OFF»).
markup = types.ReplyKeyboardMarkup(row_width=2) markup.add('ON', 'OFF') msg = bot.send_message(cid, "Selecciona una accion:", reply_markup=markup)
El resultado de mi bot es el siguiente, una vez lo inicio con el comando /start ‘contraseña’ me pide que pulse el botón ON u OFF y lo escribe sobre un fichero:
Aquí dejo el código fuente completo del bot y en la próxima entrada desvelaré para qué he creado este bot.
import telebot from telebot import types TOKEN = '123456789:ABCDEFG...' #Ponemos nuestro TOKEN generado con el @BotFather bot = telebot.TeleBot(TOKEN) #Creamos nuestra instancia "mi_bot" a partir de ese TOKEN def listener(messages): # Con esto, estamos definiendo una funcion llamada 'listener', que recibe como parametro un dato llamado 'messages'. for message in messages: # Por cada dato 'm' en el dato 'messages' cid = message.chat.id # Almacenaremos el ID de la conversacion. print "[" + str(cid) + "]: " + message.text # Y haremos que imprima algo parecido a esto -> [52033876]: /start bot.set_update_listener(listener) # Asi, le decimos al bot que utilice como funcion escuchadora nuestra funcion 'listener' declarada arriba. def extract_unique_code(text): # Extracts the unique_code from the sent /start command. return text.split()[1] if len(text.split()) > 1 else None # Handle '/start' and '/help' @bot.message_handler(commands=['help', 'start']) def send_welcome(message): unique_code = extract_unique_code(message.text) cid = message.chat.id # Guardamos el ID de la conversacion para poder responder. if unique_code == "ABC": print "[Hola]" bot.reply_to(message, "Hola!, soy el bot.") markup = types.ReplyKeyboardMarkup(row_width=2) markup.add('ON', 'OFF') msg = bot.send_message(cid, "Selecciona una accion:", reply_markup=markup) bot.register_next_step_handler(msg, process_next_step) else: bot.reply_to(message, "[-] Password incorrecto") def process_next_step(message): print "[+] Mensaje: " + message.text fh = open("/Users/Documents/EstadoAlarma.txt","w") fh.write(str(message.text)) fh.close() bot.polling()