Tutorial para usar identi.ca con curl

Mientras existen magníficos clientes de microblog para GNU/Linux tanto gráficos (como choqok, gwibber), de línea de comandos (bashic, twidge) y alguno más incluso integrado a mi entorno favorito, Emacs! todos adolecen de una característica básica para poder utilizar identi.ca como una herramienta más de administración: ser programables de modo que disparen dents ante determinados eventos o momentos (que son eventos de reloj).

Para ir desarrollando estos hacks mi inspiración inicial provino de curl y un poco (hay algunos ejemplos malos) de twitter.

En http://commandlinefu.com/ incluso puedes votar por los comandos más útiles, y condenar a la ignominia los más horrorosos.

Nivel 0

Gracias a que la gente de status.net ha hecho compatible la api de identi.ca con la de twitter, podemos aprovechar algo de los ejemplos para trabajar con nuestro servicio de microblog libre. Además tal vez valga más la pena estudiar la salida xml que nos arroja la ejecución de curl y guardarla en un archivo para jugar después con lo que podamos apreciar.

Primer ejemplo:

Vámonos directo a jugar con la api de identi.ca porque no me interesa twitter, ¡de todos modos lo que publico en identi.ca se muestra allá!


curl -u usuario:password -d status='¡Hola Mundo! Hackear es divertido, no para hacer daño' -d source='tzk-hacking-curl' http://identi.ca/api/statuses/update.xml > dump.xml

Advierte que estamos guardando la salida estándar en dump.xml mediante la redirección básica > para jugar con las variables después

Nivel 1

Mejorando nuestro primer intento.

Lo mejor del script anterior es que pudimos especificar no sólo el status o texto del dent, sino también la fuente, de igual modo es posible especificar los parámetros geográficos, a quien respondemos y exactamente a que dent anterior nos referimos, de modo que identi.ca pueda formar ‘threads’ o hilos de conversación.

Pero en realidad el ejemplo anterior es malo, fíjate que estamos especificando en la línea de comando el usuario y password y si estamos en un entorno multiusuario, cualquiera podría leer con absoluta facilidad (ps aux | grep curl) nuestras credenciales. Si ese no es el caso, también alguien malicioso capturando el tráfico desencriptado de nuestra red, podría obtener los mismos datos y de ahí hacer lo que se le antoje con ello.

Para encriptar el tráfico, una solución elemental es buscar una opción para que curl envíe los datos por medio de una conexión segura y ello sólo requiere que agreguemos la opción -k y cambiemos la url de la api de http a https.

Y para evitar escribir nuestro id y pass en la línea de comando, podemos almacenar nuestro usuario y contraseña en ~/.netrc, el manual de curl dice que así debería formarse la entrada en nuestro archivo netrc:

machine host.domain.com login myself password secret

En nuestro caso:

machine identi.ca login yomerengues password 123456-XD

Segundo ejemplo:

Ahora nuestro nuevo comando queda así:


curl -k --netrc -d status='¡Hackear es divertido y educativo brodys n sistas!' -d source='tzk-hacking-curl' -d in_reply_to_status_id="21518927" https://identi.ca/api/statuses/update.xml > dump2.xml

Advierte que agregamos un nuevo parámetro, a que número de status estamos respondiendo, a mí mi ventana de chat de jabber en Emacs me lo indica, en tu caso puede ser igual > y volvemos a vaciar la respuesta de la api, ahora en dump2.xml

¡Nivel 2!

Ahora una función personal para toda nuestra sesión que vamos a guardar en .bashrc:

Tercer ejemplo:


function dent() {
curl -k --netrc -d status="$*" -d source='tzk-hacking-curl' -v -o logcurl.xml --stderr logcurl.err https://identi.ca/api/statuses/update.xml
}

Advierte que hemos agregado flags (opciones) a curl

  • -v El clásico “verbosity” por si tienes curiosidad de que otros eventos están ocurriendo además de la respuesta de la api de status.net
  • -o logcurl.xml Ahora en lugar de redirigir la salida estándar, especificamos a curl donde almacenar el archivo. En algunos shells no funciona la redirección de bash, así que esta es una opción útil para programar entradas por medio de
    at
  • –stderr logcurl.err También interesante por si queremos revisar si hubo errores y no llenar de basura la salida normal en pantalla.

Además, hemos cambiado las comillas sencillas que encerraban nuestro status escrito ‘a manita’ en cada comando, por las comillas dobles encerrando

$*

, esto es, todo lo que esté a continuación de

dent

, será lo que intentará publicar curl (se truncará si pasa de los 140 caracteres).
Sería interesante reescribir la función de modo que podamos especificar más opciones como antes, como el dent y usuario al que estamos respondiendo pero eso rebasa la Idea original de la función de bash

Y para terminar este tutorial ¡Nivel 3!

Idea Original (sin explicaciones)

Ahora un script personal va a examinar cada hora el uso de disco, si en alguna partición el espacio libre llega a menos del 10%, nos enviará un dent.

Tercer ejemplo:


#!/bin/sh
/bin/df -h | /bin/grep -o "[0-9].%" | /bin/sed 's/%//g' | while read freespace;
do
## aquí ajustas el mínimo que dispara la alerta:
if [ $freespace -le 10 ]; then
curl -k -u usuario:password -v -d status="¡ $(hostname) ya sólo tiene $freespace \% de espacio libre! $(date)" -d source='spacedisk-watcher' https://identi.ca/api/statuses/update.xml
done

Para que sea funcional hay que acomodar todo en cierto lugar:
  1. Hay que mover el script a /etc/cron.hourly
  2. sudo mv -v spacedisk.sh /etc/cron.hourly
  3. Debe tener permiso de ejecución, mediante:
  4. sudo chmod -v 700 /etc/cron.hourly/spacedisk.sh

¿Observaste que volvimos a especificar el usuario y contraseña en la línea de comando? La razón es que este es un script que se debería ejecutar como root, pero además nadie debe poder leer su contenido, de ahí los permisos

700

:

  1. 7 son permisos de lectura, escritura y ejecución al propietario del archivo (root)
  2. 0 pues es cero, permisos a los grupos que pudiese pertenecer el archivo
  3. 0 y este último cero, también desactiva todos los permisos al mundo entero

Lo hermoso de bash y otros lenguajes de script, es que es posible unir las funciones de varias herramientas básicas de *nix, de modo que realicen prácticamente cualquier tarea de procesamiento de información de modo automático y sin necesidad de que estemos supervisando manualmente el entorno para descubrir fallos.

Y también, puede ahorrarnos el trabajo de tener que entrar al cliente de microblog, sólo para enviar alguna noticia importante en un preciso momento.

Pero basta por el momento, todavía tenemos que cumplir esta semana la meta mínima de posts de herramientas de GNU: nos falta watch (vigilando procesos) y la segunda parte del tutorial de wget.

  1. Gabriel Saldana

    Me gusto mucho tu post, muy buen tutorial.

    Me has dado una idea para hacer Emacs identica-mode mas accesible desde elisp para poder hacer llamadas desde cualquier otro modo o incluso una macro.

    Saludos

    • tzkmx

      ¡¡¡Eso sería fantástico!!!

      Desde hace un bueeeen rato vengo elucubrando la manera de integrar en remember.el una función para que suba los trocitos de texto para recordar, a un microblog personal de status.net, con referencia de contexto como tags y URLs, pero la verdad no he tenido tiempo ni de leer siquiera el manual de Emacs Lisp.

      Tu idea suena super interesante porque va mucho más lejos y sería muy interesante estudiar por donde piensas entrarle, sería algo más cool que el montón de aplicaciones web en torno al twitter, ¡todo un “ecosistema” de modos vinculándose por medio de status.net?

      Intrigante y fascinante.
      Saludos, gracias por visitar el blog.

  2. Edgard Decena

    Hola, puedes explicarnos para que sirve el parametro “source” en el comando curl por favor… Danos un ejemplo para ver como utilizas este parametro… Gracias anticipadas!…🙂

    • tezcatl

      Oops, perdón por la tardanza en responder😀

      El source es específico a la API de status.net, donde se autoidentifica
      la aplicación en hacer la solicitud, por ejemplo “identica-mode” o “Choqok”;

      La documentación es bastante comprensible, pero tampoco he tenido más tiempo de jugar con ella😉

      http://status.net/docs/api/statusesupdate.html

      Saludos y gracias por visitar el blog.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s