12 septiembre, 2015 Alberto

Programando un bot para Telegram en Python

The Botfather

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.

@Botfaher /newbot

@Botfaher /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.

@Botfather Comandos

@Botfather comandos

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:

Mi Bot

Mi Bot

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies