Creando un bot para Telegram

Hace unos días en un grupo de Telegram salió la idea de crear un bot a raíz de un pequeño fallo que tiene la aplicación. La administración de grupos de Telegram no es del todo buena ya que solo puede haber un admnistrador pero este admin no puede, al menos por ahora, nombrar a otra persona mas como administrador como para que haya 2 y si es un grupo grande haya un poco de moderación para que no se desbande todo. Esto en Whatsapp es totalmente funcional y común cosa que en Telegram no pasa y por esto tuvimos que mudar un grupo completo a otro porque cuando admin que estaba se fue, el que quedó asignado (por decisión de Telegram al azar, según tengo entendido) no era para nada activo, por ende, alrededor de 45 personas tuvimos que mudarnos.

NOTA DE ACTUALIZACION #1: Esto ya no pasa ya que Telegram se ha actualizado y ya se puede tener mas de un administrador seleccionado en el grupo. Como esto lo escribi hace tiempo tengo que hacer esta aclaracion.

Por esto empezó el tema de la creación de bot, para ver si podíamos de alguna manera u otra darle permisos de administrador a alguien mas por medio de este bot. Como estaba con un poco de tiempo me puse a investigar y al cabo de un rato concluímos que ese bot no puede crearse ya que la API de Telegram no permite hacer eso.

A todo esto yo ya había armado el bot y lo estaba preparando para tirarle código y empezar. De esta manera me encontré con un bot que no hacía nada y sobretodo que no hacía lo que habíamos pensado que haría, asi que aproveché y empecé a investigar un poco mas la API de bots de Telegram y decidí darle un uso al bot por lo menos para hacer algunas bromas en el grupo como crear el comando /windowsero y que salga una imagen de Linus Torvalds haciendo el famoso “fuck you nvidia”.

fuckyounvidia

NOTA DE ACTUALIZACION #2: Me habia olvidado un paso super importante, instalar la API de Telegram en nuestro VPS o PC o donde vamos a ejecutar el bot. Tenemos 2 formas de hacerlo (Las comillas dobles omitirlas al igual que el signo $, solo esta para indicar que se tiene que hacer desde la terminal):

  1. A traves del repositorio de Github:
    " $ git clone https://github.com/eternnoir/pyTelegramBotAPI.git "
    " $ cd pyTelegramBotAPI "
    " $ python setup.py install "
  2. O utilizando la herramienta de instalacion de Python:
    " $ pip install pyTelegramBotAPI "

Buscando por la web encontré un ejemplo de bot que me vino de maravilla pero eso lo dejo para mas adelante. Primero les explico los pasos que hay que seguir:

  1. Crear el bot desde Telegram: En nuestro Telegram vamos a crear el bot con su nombre, su nick, una descripcion del mismo y algunas configuraciones opcionales. Para esto tenemos que entablar una conversacion con @BotFather, un bot el cual con una serie de comandos vamos a lograr esto. Para ver todos los comandos disponibles escribimos /help. BotFather nos respondera con el siguiente mensaje: They call me the Botfather, I can help you create and set up Telegram bots. Please read this manual before we begin: https://core.telegram.org/botsYou can control me by sending these commands:/newbot - create a new bot /token - generate authorization token /revoke - revoke bot access token /setname - change a bot's name /setdescription - change bot description /setabouttext - change bot about info /setuserpic - change bot profile photo /setcommands - change bot commands list /setjoingroups - can your bot be added to groups? /setprivacy - what messages does your bot see in groups? /deletebot - delete a bot /cancel - cancel the current operation Entonces con el comando /newbot empezaremos a crearlo. La creacion es totalmente interactiva, en ingles, pero no es problema porque las cosas que pide el BotFather para la creacion son totalmente entendibles.
  2. Una vez que tengamos nuestro bot creado (creado en el sentido de creacion por parte de Telegram, es decir, en ese momento es un bot que no hace absolutamente nada), BotFather nos dara un Token el cual es el que usaremos para poder vincular nuestro codigo fuente de programacion con el bot en cuestion creado. Este token puede tanto revocarse como crear uno nuevo en el caso que lo hayamos perdido o nos hayan querido controlar el bot porque accedieron a nuestro token de alguna forma.
  3. Ahora solo resta programar el bot. El lenguaje a utilizar es Python pero tengo entendido que en PHP tambien se puede hacer (es lo que escuche, no tengo la certeza). Claro, pero ustedes querran saber que puede hacer o no el bot, o como se tiene que programar, bueno, en la pagina de Telegram, mas precisamente en el apartado de su API, nos muestran todas las funciones que puede hacer el bot.

Les dejo un pequeño ejemplo de codigo en Python con algunas funciones que puede hacer el bot (para ver el codigo completo podes ir a mi GitHub):

# -*- coding: utf-8 -*-
import telebot # Librería de la API del bot.
from telebot import types # Tipos para la API del bot.
import time # Librería para hacer que el programa que controla el bot no se acabe.
import random
import datetime

TOKEN = ACA VA EL TOKEN # Nuestro token del bot (el que @BotFather nos dió).

bot = telebot.TeleBot(TOKEN) # Creamos el objeto de nuestro bot.
#############################################
#Listener
def listener(messages): # Con esto, estamos definiendo una función llamada 'listener', que recibe como parámetro un dato llamado 'messages'.
for m in messages: # Por cada dato 'm' en el dato 'messages'
cid = m.chat.id # Almacenaremos el ID de la conversación.
if m.content_type == 'text':
print "[" + str(cid) + "]: " + m.text # Y haremos que imprima algo parecido a esto -> [52033876]: /start

bot.set_update_listener(listener) # Así, le decimos al bot que utilice como función escuchadora nuestra función 'listener' declarada arriba.
#############################################
#Funciones
@bot.message_handler(commands=['kick']) # Indicamos que lo siguiente va a controlar el comando.
def command_kick(m): # Definimos una función que resuelva lo que necesitemos.
cid = m.chat.id # Guardamos el ID de la conversación para poder responder.
bot.send_photo( cid, open( 'kick.jpg', 'rb')) # Con la función 'send_photo()' del bot, enviamos al ID de la conversación que hemos almacenado previamente la foto

@bot.message_handler(commands=['help'])
def command_ayuda(m):
cid = m.chat.id # Guardamos el ID de la conversación para poder responder.
bot.send_message( cid, "Comandos Disponibles: /hola /hello /kick /uppercut /hadouken /windowsero /nsa /attack /gentoo /flame /vicman /deletethat /roll /time /blogroll /tuxamigos /acerca /help")

@bot.message_handler(commands=['roll'])
def command_roll(m):
cid = m.chat.id
bot.send_message( cid, random.randint(1,6) )

#############################################
#Peticiones
bot.polling(none_stop=True) # Con esto, le decimos al bot que siga funcionando incluso si encuentra algun fallo.

El ejemplo que estoy mostrando basicamente hace 3 cosas, el primer ejemplo (comando /kick) manda una imagen (en este caso de alguien pateando), el segundo ejemplo es la respuesta al comando /help en el que nos indicara los comandos disponibles que tiene el bot (estos se van agregando a mano) y el tercer ejemplo es haciendo uso de la instruccion random.randint de Python la cual (previamente configurada) con el comando /roll nos dara el resultado de la tirada de un dado de 6 caras (en este caso pero pueden ser mas).

Si queres que tu bot mande cualquier otro mensaje u otra imagen, solo es cuestion de copiar y pegar el comando, modificarle el nombre de la funcion, el nombre del comando (obviamente no puede haber dos iguales) y el nombre de la imagen, en el caso del ejemplo, a enviar. Acordate que en el apartado oficial de la API de Telegram que te deje mas arriba, tenes todas las funciones que podes hacer con el bot creado. Desde un juego hasta un servicio social.

kick

Seguramente te preguntaras donde esta alojado el bot para que funcione. Bueno, yo te puedo dar 2 ejemplos para poder utilizar el bot:

  1. Podes tenerlo alojado en tu propia PC, ordenado en una carpeta con el codigo, las imagenes que mandas dependiendo el comando del bot, etc. Teniendo en cuenta que deberias tener una terminal abierta constantemente ejecutando el archivo.py que contiene el comando del bot.
  2. O podes, como es mi caso, tenerlo alojado en un VPS ejecutandose constantemente sin que se caiga nunca ya que podes usar el comando "screen" para tenerlo corriendo en background.

La segunda opcion es sugerida si y solo si, ya tenes un VPS desde hace tiempo, porque no creo que quieras pagar un VPS solo para tener un Bot de Telegram que manda imagenes, estamos de acuerdo que eso es una locura no? Lo que podes hacer para probarlo fuera de tu PC es usar el sitio https://c9.io el cual te da un VPS de manera gratuita para que puedas deployar cualquier proyecto que quieras (eso si, si el VPS no tiene actividad se apaga automaticamente, es la contra que tiene por ser gratuito, pero funciona perfecto).

Ejemplos de comandos: comandos

Si queres probar mi Bot para ver como es el tema de la interaccion podes agregarlo a un chat de Telegram por su nombre de usuario @RootAdminBot (el nombre fue pensado por lo que comentaba al principio del post, asi que quedo ese nombre, me da fiaca cambiarlo).

Espero que te haya gustado y si te animas a crear tu propio bot esperamos tus comentarios. Si hay algo que no entendiste o necesitas que te lo explique mas detalladamente podes escribirme a neoranger@disroot.org

Escrito el December 2, 2015