Compartir

Compartir en GNU Social Compartir en Diaspora*

Un "buffer" de andar por casa

Buffer es un servicio web que sirve para programar publicaciones en algunas redes sociales (twitter, facebook, ...).

La verdad es que es un servicio bastante cómodo si buscas que algunas de tus publicaciones se publiquen a unas horas determinadas. Tanto desde la web como desde la aplicación móvil es un proceso bastante sencillo sin embargo para mí, que quienes me conocen ya saben que soy un poco raro, tiene un problemilla que me venía quemando desde hace tiempo: no es software libre.

Ya se que existe una alternativa libre que se llama Circular.io y que funciona bastante bien, pero tiene algunas limitaciones que hacen que no le haya dado un uso extensivo. En Circular.io tu defines unas horas de publicación y cuando envías un mensaje te lo encaja en la primera hora que tenga disponible, es decir la aplicación hace automáticamente la asignación de las horas.
Además, tanto Circular.io como Buffer no tienen entre sus redes soportadas GNU Social (que es una red como Twitter pero libre y distribuida) por lo que si quería planificar mis envíos en esta red no me iba a servir ninguna de las dos aplicaciones.

Cuando uno mira las necesidades de una aplicación así ve que lo único que necesita es algo que se ejecute cada cierto tiempo y verifique si tiene algo pendiente de enviar, y ese "algo" debe saber también como enviar a las redes que me puedan interesar (que en principio son GNU Social y también Twitter).

Para la segunda parte existen unas utilidades que permiten hacer el envío (y muchas más cosas que en principio no uso) sin más que invocar el comando apropiado.

Así para Twitter tenemos ttytter (un script hecho en perl con el que podemos ver desde un terminal nuestro timeline, enviar post, responder, ...) y para GNU Social vi hace poco una pequeña maravilla hecha en python que se llama anonquit.

De esta manera y una vez configurados ambos scripts, enviar un tuit es algo tan simple como ejecutar:

  TTytter -status="El texto del tuit que quiero enviar"

mientras que enviar un queet (GNU Social) se reduce a:

  anonquit -u misuario@nododegnusocial.loquesea "El texto del queet que quiero enviar"

En el caso de GNU Social además el api de envío es tan sencillo que si en el sistema donde queremos montar esto no disponemos de python3 y sqlite3 (requisitos de anonquit) podemos usar curl (que está disponible en cualquier sistema GNU/Linux) para ello.

Con esto tendriamos solucionada la parte de los envíos, para la planificación está clara, usamos cron para que se ejecute, digamos que cada 5 minutos, un sencillo script que compruebe si hay mensajes pendientes de envío y si los hay que los envíe y los elimine de la "cola".

Con esto lo que me quedaba era tener una forma sencilla de pasarle a este "script" los mensajes, las horas en los que quiero enviarlos y las redes sociales a las que pretende enviarlo.

Lo primero que pensé fue en aprovechar el drupal de este blog para crear un nuevo tipo de contenido que sea precisamente el envío. Con esto tendría una sencilla interfaz web, gracias a drupal, y el script solo tendría que leer las tablas adecuadas de la base de datos de drupal para conseguir la información.

Esta idea no la he descartado y supongo que en algún momento la probaré pero pensé en que algo aún más sencillo me podía servir.

Lo único que tenía que hacer era que mi script chequeara la existencia de ficheros en un determinado directorio. Esos ficheros serían los mensajes (su contenido) y el nombre indicaría la hora y la red social donde se debía enviar, así el nombre de los ficheros solo tenía que ser del estilo a X_HHMM siendo X una g (para enviar a GNU Social), una t (para enviar a Twitter) o una a (para enviar a ambas) mientras que HHMM sería la hora a la que habría que publicarlo.

Como en el lugar donde está alojado esto, además de tener acceso remoto por ssh (para montar mis script) también puedo crearme una cuenta ftp, es justamente lo que he hecho siendo además el directorio del ftp de la cuenta que me he creado el lugar que chequea el script para ver si hay mensajes.

Esto además me permite de una forma muy simple hacer envíos planificados incluso desde el móvil (desde el explorador de archivos me configuro la cuenta de ftp y lo único que hago es crear un ficherito de texto con el nombre adecuado y enviarlo por ftp, que el resto ya se encarga cron y el script).

Línea en el cron

*/5 * * * * /ruta/de/mis/scripts/nombre_del_script_envio

Script que chequee el directorio de envíos y los ejecuta (mybufferapp o como queramos llamarlo)

#!/bin/bash

dia=$(date +%Y%m%d)
cd directorio/del/ftp

for fichero in $(find . -type f -name '?_*') ; do
   nbfichero=$(basename "${fichero}")
   tipo=$(echo ${nbfichero} | cut -d"_" -f1)
   if [ ${tipo} = "a" -o ${tipo} = "g" -o ${tipo} = "t" ]; then
        cuando=$(echo ${nbfichero} | cut -d"_" -f2)
        hora=$(date +%H%M)
        if [ ${cuando} -le ${hora} ]; then
                contenido=$(cat ${fichero})
                if [ ${tipo} = "g" -o ${tipo} = "a" ]; then
                        #echo "Enviamos [${contenido}] a gnusocial"
                        /ruta/de/mis/scripts/mygnusocial "${contenido}"
                fi
                if [ ${tipo} = "t" -o ${tipo} = "a" ]; then
                        #echo "Enviamos [${contenido}] a twitter"
                        /ruta/deTTytter/TTytter -status="${contenido}"
                fi

                mv ${fichero} /directorio/para/guardar/los/mensajes/enviados/${nbfichero}_${dia}
        fi
   fi
done

Este es el script mygnusocial (sustituir en el script anterior por anonquit si se dispone de python3 y sqlite3)

#!/bin/bash

if [ $# -lt 1 ]; then
   echo "Formato: $0 \"mensaje a enviar\""
   exit
fi
mensaje_usuario=$1

apipath="/api/statuses/update.xml"
nombre_usuario=[el usuario que tengamos]
password=[su password]
nodo=[el nodo de gnu social que usemos, por ejemplo gnusocial.net]
url_status="http://"${nodo}${apipath}
curl -u ${nombre_usuario}:${password} ${url_status} -d status="${mensaje_usuario}"

Actualización 26/02/2015 19:51
Al mover el archivo al directorio enviados añado al nombre el día (en formato yyyymmdd) para evitar que se machaquen ficheros con nombres iguales pero de días distintos.

Comentarios

Cierro comentarios en este artículo.

Como llevo bastantes días que este post solo recibe comentarios de spam, voy a dejarlo sin posibilidad de comentar para ver si se cansan los jodíos spammer.