Hola comunidad, espero que estén teniendo un maravilloso día. Hoy vamos a estar hablando sobre Rocket.Chat. No sé si recuerdan que hace un tiempo estuvimos analizando aquí como instalarlo utilizando snaps. Para los que no están familiarizados, Rocket.Chat es una aplicación web para charlar. Es muy buena para la comunicación entre equipos de trabajo, sobre todo si eres progamador ya que tiene soporte para Markdown y marca bien el código como código. Permite hacer videoconferencias y tiene muchísimas integraciones y cada día son más, lo que quiere decir que podrás utilizarlo tranquilamente para conversar con ese miembro del equipo que se niega a dejar de utilizar IRC o que se siente más cómodo en Slack 🙂

A mi en particular me enamoró, y como tienen una API bien extensa para comunicarte con su servidor me di a la tarea de hacer un wrapper para #Python para poder utilizarla cómodamente desde mi lenguaje preferido. A los interesados en coolaborar en el desarrollo de la librería aquí pueden encontrar el código fuente: https://github.com/jadolg/rocketchat_API. Háganle fork y escriban su aporte, atenderé los Pull Requests en cuanto me sea posible. Si sólo te interesa por el momento utilizar la librería puedes obtenerla via pip haciendo

pip3 install rocketchat_API

Y si, si pueden darse cuenta hasta el momento sólo está disponible para Python 3. Está en nuestro roadmap hacerla compatible con Python 2 pero no es algo urgente por el momento así que ya sabes, a lo mejor este puede ser tu aporte 😉

Vamos manos a la obra y explicaré el mismo ejemplo que aparece en el demo en GitHub paso a paso. Para comenzar vamos a importar nuestra librería y además el módulo pprint para imprimir en nuestro terminal las respuestas de la API de forma clara.

from pprint import pprint
from rocketchat_API.rocketchat import RocketChat

Como buen cubano me paso la vida detrás de un proxy institucional lo cual muchas veces es un dolor de cabeza, por lo que cuando voy a diseñar mis proyectos, si tienen que utilizar de alguna forma la web casi siempre pienso en el soporte para proxy. La base de rocketchat_API es una librería maravillosa llamada requests con la que se hacen todas las llamadas y la misma por suerte permite especificarle una lista de proxies. Aquí por ejemplo declaro los proxies que voy a utilizar que no es más que CNTLM corriendo en  mi máquina (si estás probando con una instancia local no necesitas utilizar proxy):

proxyDict = {
              "http"  : "http://127.0.0.1:3128",
              "https" : "https://127.0.0.1:3128",
            }

Vamos a la parte interesante. Vamos a crear un objeto de tipo RocketChat que utilice estos proxies y que se conecte a la instancia demo de Rocket.Chat en internet (https://demo.rocket.chat):

rocket = RocketChat('user', 'pass', server_url='https://demo.rocket.chat', proxies=proxyDict)

Si estás usando tu instancia local (http://localhost:3000) bastaría con:

rocket = RocketChat('user', 'pass')

Como pueden ver es bastante sencillo. A continuación vamos a encuestar a la API sobre nuestro usuario:

pprint(rocket.me().json())

a lo que debemos obtener una respuesta como esta (en dependencia de la versión de Rocket.Chat las respuestas pueden variar. Estas fueron obtenidas sobre una instancia de Rocket.Chat 0.45.1 instalada vía snap):

{'_id': 'BbRrEpxxpyg5qqh9Q',
 'active': True,
 'emails': [{'address': 'diazorozcoj@gmail.com', 'verified': True}],
 'name': 'Akiel',
 'status': 'online',
 'statusConnection': 'online',
 'success': True,
 'username': 'akiel',
 'utcOffset': -4}

A continuación vamos a obtener la lista de canales públicos de nuestro servidor. Rocket.Chat separa sus canales en públicos (Channels) y privados (Groups) y para cada uno hay llamadas distintas con casi los mismos métodos.

pprint(rocket.channels_list().json())

En mi caso devuelve los datos de los únicos 2 canales públicos de mi servidor privado

{'channels': [{'_id': 'GENERAL',
               '_updatedAt': '2017-04-05T18:15:37.128Z',
               'default': True,
               'lm': '2017-04-05T18:15:37.105Z',
               'msgs': 1232,
               'muted': ['charlie'],
               'name': 'general',
               't': 'c',
               'topic': 'De todo un poco. No información privada aquí!',
               'ts': '2017-02-14T16:22:14.079Z',
               'username': 'akiel',
               'usernames': ['akiel',
                             'parrot-1',
                             'rocket.cat',
                             'alex',
                             'Rocket',
                             'Chiki',
                             'charlie']},
              {'_id': 'ex3tkjzeYNqZp2AGh',
               '_updatedAt': '2017-03-23T17:04:44.628Z',
               'customFields': {},
               'lm': '2017-03-23T17:04:44.620Z',
               'msgs': 76,
               'name': 'guamulera',
               'ro': False,
               'sysMes': True,
               't': 'c',
               'ts': '2017-03-22T19:47:13.086Z',
               'u': {'_id': 'BbRrEpxxpyg5qqh9Q', 'username': 'akiel'},
               'username': 'akiel',
               'usernames': ['akiel', 'parrot']}],
 'count': 2,
 'offset': 0,
 'success': True,
 'total': 2}

Pero bueno, hasta este punto no hemos escrito nada!!! Vamos a eso. Para escribir mensajes debemos tener en cuenta el id de donde vamos a escribir. Por suerte el id del canal general es convenientemente GENERAL pero si quisiera escribir en guamulera tendría que utilizar este id: ex3tkjzeYNqZp2AGh.

pprint(rocket.chat_post_message('GENERAL', 'good news everyone!', alias='Farnsworth').json())

Y esta llamada nos responderá un objeto con datos de nuestro mensaje:

{'channel': 'GENERAL',
 'message': {'_id': '427qEMqfw8TAave5W',
             '_updatedAt': '2017-04-05T19:20:47.621Z',
             'alias': 'Farnsworth',
             'groupable': False,
             'msg': 'good news everyone!',
             'parseUrls': True,
             'rid': 'GENERAL',
             'ts': '2017-04-05T19:20:47.620Z',
             'u': {'_id': 'BbRrEpxxpyg5qqh9Q', 'username': 'akiel'}},
 'success': True,
 'ts': 1491420047626}

Además de escribir también queremos ser capaces de leer lo que se escribe en los canales y en este caso lo que vamos a hacer es leer los últimos 3 mensajes que se escribieron en el canal general.

pprint(rocket.channels_history('GENERAL', count=3).json())

Y aquí tenemos información sobre los últimos mensajes registrados en el canal empezando por los más recientes.

{'messages': [{'_id': 'KFHTuMWRAT44Fykb7',
               '_updatedAt': '2017-04-05T19:24:37.406Z',
               'msg': 'new rocketchat_API version soon :)',
               'rid': 'GENERAL',
               'ts': '2017-04-05T19:24:37.404Z',
               'u': {'_id': 'BbRrEpxxpyg5qqh9Q', 'username': 'akiel'}},
              {'_id': 'vxgo8vf7YsfR3oLNW',
               '_updatedAt': '2017-04-05T19:24:18.605Z',
               'msg': 'yes, sure!',
               'rid': 'GENERAL',
               'ts': '2017-04-05T19:24:18.602Z',
               'u': {'_id': 'BbRrEpxxpyg5qqh9Q', 'username': 'akiel'}},
              {'_id': '427qEMqfw8TAave5W',
               '_updatedAt': '2017-04-05T19:20:47.621Z',
               'alias': 'Farnsworth',
               'attachments': None,
               'bot': None,
               'groupable': False,
               'msg': 'good news everyone!',
               'parseUrls': True,
               'rid': 'GENERAL',
               'ts': '2017-04-05T19:20:47.620Z',
               'u': {'_id': 'BbRrEpxxpyg5qqh9Q', 'username': 'akiel'}}],
 'success': True}

La API tiene muchísimas otras funcionalidades. Pueden manejar los usuarios desde aquí, trabajar con grupos o conversaciones privadas entre otras opciones. Si estás interesado en explorar pasa por https://rocket.chat/docs/developer-guides/rest-api donde está toda la documentación. La mayoría de los metodos está ya implementado pero si encuentras alguno que no esté puedes hacerlo y hacer Pull Request en Github o abrir un Issue.

Y esto fue todo por hoy. Espero que les halla gustado y que vallan directo a probarlo y jugar con Rocket.Chat. Espero tus sugerencias en los comentarios y si quieres hablar sobre el desarrollo de la librería puedes encontrarnos en https://demo.rocket.chat/channel/python_rocketchat_api. Un saludo tengan todos y Happy Hacking!!