Slack desde la línea de comandos

Cómo copiar los mensajes de slack e interaccionar desde la línea de comandos

Créditos: Slacker, https://pypi.org/project/slacker/

Desde hace algún tiempo algunas entidades utilizan slack para diversas tareas. A mí me parece una especie de servidor de irc gráfico, capado, comercial y poco útil, pero como en tantas otras situaciones donde una tecnología parece más fea, difícil de usar y antigua, surgen aplicaciones vendehumo que con las mismas o parecidas funcionalidades –normalmente más capadas que las originales–, conectadas con otras tantas aplicaciones vendehumo –por lo cual parece que son capaces de interconectarse con cualquiera– tienen un logo y una estética –lo que algunxs asociarán también al UX– atractiva y además puedes poner emoticonos y subir emoticonos… En resumen, un caramelo en la puerta de un colegio de esos que mi madre y mi padre me decían que no aceptara.

Sea como fuere llegamos a Slack y una de las cosas que tiene es el constante aviso de que tienes un límite de mensajes que puedes ver en el plan gratuito y que te actualices si quieres ver los demás.

Lejos de querer hacerme abonado de Slack he buscado una forma de guardarme los mensajes, una copia de lo que envío. Esto no es fácil en la mayoría de las soluciones vendehumo y tampoco en esta. Si eres administrador de la misma puedes hacer una copia pero resulta que no lo soy de varias en las que participo por lo que preguntamos aquí y allá y buscamos un poco.

Hay unos cuantos proyectos, que listo a continuación.

  • slacker, librería de Python
  • slack-history-export, librería de nodejs
  • slackchannel2pdf, librería de Python.
  • slack-cli, librería de Python.

Slack: retrieve all messages

Encuentro en stackoverflow esta solución y adelanto que es la que uso. Se trata de un script en Python que usa slacker para bajarse los mensajes que llamaremos igualmente slack-history.py. Los guarda en json.

This Python script exports everything to JSON by a simple run: https://gist.github.com/Chandler/fb7a070f52883849de35

Crea directorios y tienes la opción de excluir mensajes directos o canales.

Para correrlo:

1
2
3
4
5
python slack_history.py --token='123token'
python slack_history.py --token='123token' --dryRun=True
python slack_history.py --token='123token' --skipDirectMessages
python slack_history.py --token='123token' --skipDirectMessages --skipPrivateChannels
python slack_history.py --token='123token' slack.channel
  • De la primera forma te bajas todo.
  • En la segunda no te bajas los canales.
  • En la tercera no te bajas los mensajes directos.
  • Y en la cuarta ni los mensajes directos ni los canales privados.
  • En la quinta te bajas solo el canal especificado.

Además, enlaza directamente la URL donde pedir el legacy token que siempre es un engorro encontrar.

slacker

Como hemos dicho, una librería de Python para trabajar con la API de Slack.

La forma más fácil de instalarlo es a través de pip:

1
pip install slacker

Ejemplos de uso que no he usado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from slacker import Slacker

slack = Slacker('<your-slack-api-token-goes-here>')

# Send a message to #general channel
slack.chat.post_message('#general', 'Hello fellow slackers!')

# Get users list
response = slack.users.list()
users = response.body['members']

# Upload a file
slack.files.upload('hello.txt')

# If you need to proxy the requests
proxy_endpoint = 'http://myproxy:3128'
slack = Slacker('<your-slack-api-token-goes-here>',
		http_proxy=proxy_endpoint,
		https_proxy=proxy_endpoint)

# Advanced: Use `request.Session` for connection pooling (reuse)
from requests.sessions import Session
with Session() as session:
    slack = Slacker(token, session=session)
    slack.chat.post_message('#general', 'All these requests')
    slack.chat.post_message('#general', 'go through')
    slack.chat.post_message('#general', 'a single https connection')

slack-history-export

Este paquete de node.js promete descargar histórico de la conversación con unx usuarix o un canal pero no lo he conseguido por más que he puesto el nombre, el nombre entre comilla, el id de slack…

Si alguien ha experimentado/usado este comando y me dice algo se lo agradezco.

Para instalarlo:

1
npm install slack-history-export -g

La opción -g es por si quieres hacerlo de uso global, si no no es necesaria.

Luego, una vez que obtengas el token, dicen de usarse así:

1
slack-history-export -t "slack-token-123456abcde" -u abimbola -f 'amimbola.json'

La opción -u responde a usuario, -g a canal.

slackchannel2pdf

¿Perdona? Me pareció un tanto extraño al principio pero, claro, un json no es lo más fácil de leer por una persona humana así que probemos esto de slackchannel2pdf:

Instalamos desde pip:

1
pip install slackchannel2pdf

Pues sí, mola muuuucho. Lo único que no soporta mensajes directos :-/

Puedes poner un pdf por canal o ponerlos todos en la misma consulta:

1
slackchannel2pdf --token MY_TOKEN general random test

También puedes seleccionar fechas con --oldest o --latest:

1
slackchannel2pdf --token MY_TOKEN --oldest "2019-JUL-05 11:00" general

Entre otras opciones, si echas de menos el json también lo puedes pedir con la opción --write-raw-data.

Sus opciones de impresión son lo más:

-d DESTINATION, --destination DESTINATION
			Specify a destination path to store the PDF file.
			(TBD) (default: .)
  --page-orientation {portrait,landscape}
			Orientation of PDF pages (default: portrait)
  --page-format {a3,a4,a5,letter,legal}
			Format of PDF pages (default: a4)
  --timezone TIMEZONE   Manually set the timezone to be used e.g.
			'Europe/Berlin' Use a timezone name as defined here: h
			ttps://en.wikipedia.org/wiki/List_of_tz_database_time_
			zones (default: None)
  --locale LOCALE       Manually set the locale to be used with a IETF
			language tag, e.g. ' de-DE' for Germany. See this page
			for a list of valid tags:
			https://en.wikipedia.org/wiki/IETF_language_tag
			(default: None)

slack-cli

Y como extra slack-cli, otra librería de Python. Tiene buena pinta para el día a día ya que permite usarlo como un comando en la API de bash, es decir, no solo puedes enviar mensajes o archivos a un canal o una persona sino que puedes enviar salidas de comandos o de archivos.

También se pueden descargar mensajes (dump) pero no parece que pueda hacerse de todos a la vez sino de uno en uno.

Adolfo Antón Bravo
Adolfo Antón Bravo
Coordinador del Máster de Periodismo y Visualización de Datos de la Universidad de Alcalá

Periodismo y visualización de datos, web semántica, bash, emacs, orgmode

Relacionado