Hace tiempo que intento tener centralizadas en el blog todas las aportaciones que hago en internet. Últimamente, una de las cosas que más uso es Twitter, tanto por la comodidad de poder compartir cualquier cosa escribiendo poco, como por la facilidad de uso que tiene con el móvil.
La integración de Twitter con el blog la hago con Twitter Tools un plugin de wordpress que simplifica mucho el proceso, y que tiene muchas opciones para automatizar la integración.
De todas las opciones de Twitter Tools, la que más uso es la que permite crear una entrada en el blog automáticamente a partir de un resumen de todos los tweets que he escrito en la última semana. Esta entrada la tengo programada para los Domingos por la noche, y hace tiempo que la mayoría del contenido del blog entra por esta vía.
El pasado Lunes me llamó la atención que Twitter Tools hubiese recopilado tan pocas entradas, y al echar un vistazo me di cuenta que faltaban la mayoría de las cosas que había escrito. Buscando por ahí llegué a la conclusión de que Twitter había cambiado algo en su API, y la implementación de Twitter Tools había roto por alguna parte.
Como no es la primera vez que Twitter cambia algo y me rompe el invento este de sincronizar con el blog, he decidido programar un script en Python que me sirviese para sacar los tweets que escribo directamente de la página de Twitter, sin tener que andar jugando con la API que ofrecen. El script lo único que hace es partir del html del timeline de un usuario (en este caso, mi timeline de Twitter), y simplificar el código para que se pueda insertar fácilmente en wordpress cortando y pegando.
De momento he aprovechado para descargar un backup de todos los tweets que he escrito desde que empecé a utilizar el servicio, y a partir de ahora espero usarlo para ir publicando los resúmenes semanales de mi actividad en Twitter aquí en el blog.
Por si a alguien le sirve de algo, ajunto el código del script:
#!/usr/bin/python # coding: utf-8 # # PythonTwitter.py - Parse a Twitter timeline with Python. # # Copyright (c) 2012, Pablo López Cienfuegos <xtrasgu@gmail.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. """ Parse a Twitter timeline with Python This program works as a pipe, it reads a Twitter timeline from the standard input and returns the timeline parsed to the standard output Examples: cat PythonTwitter.html | PythonTwitter.py > PythonTwitter_Parsed.html wget -O - https://twitter.com/xtrasgu | PythonTwitter.py > PythonTwitter_Parsed.html """ def readData(source=None): """ Returns data read from the standard input or from a file If it's called with no parameters, it reads data from the standard input If it's called with a parameter, it reads data from a file named as the parameter """ if source: file = open(source) data = file.read() file.close() else: import sys data = sys.stdin.read() sys.stdin.close() return data def processData(twitter): """ Parses Twitter HTML into more readable HTML """ twitter = re.compile(r'>\s*<').sub(r'><', twitter) twitter = re.compile(r'\n|\r').sub(r' ', twitter) twitter = re.compile(r'<s>(.?)</s>').sub(r'\1', twitter) pattern = re.compile(r""" <small\sclass="time">.*?<a\shref="(?P<timestamp>.*?)".*? title="(?P<time>.*?)".?><span.*? <strong\sclass="fullname.*?>(?P<name>.*?)</strong>.*? <span\sclass="username.*?<b>(?P<nick>.*?)</b></span>.*? <p\sclass="js-tweet-text">\s*(?P<text>.*?)\s*</p><div.*? """, re.X) wordpress = ['<ul>\n\n'] for tweet in re.split('<div class="tweet original-tweet', twitter)[1:]: data = pattern.search(tweet) wordpress.extend(['<li><a href="https://twitter.com/', data.group('nick'), '">']) wordpress.extend(['<b>', data.group('name'), '</b> ']) wordpress.extend(['@', data.group('nick'), '</a> ']) wordpress.extend(['(<a href="', data.group('timestamp'), '">']) wordpress.extend([data.group('time'), '</a>)<br />\n']) wordpress.extend([data.group('text'), '</li>\n\n']) wordpress.append('</ul>\n') return wordpress # Main program: if __name__ == '__main__': import sys, re test = True # Comment this line for normal use if test: twitter = readData('PythonTwitter.html') wordpress = processData(twitter) print ''.join(wordpress) else: if len(sys.argv) == 1: twitter = readData() wordpress = processData(twitter) print ''.join(wordpress) elif len(sys.argv) == 2: twitter = readData(sys.argv[1]) wordpress = processData(twitter) print ''.join(wordpress) else: print unicode(__doc__, 'utf-8').encode('iso-8859-1')
Un ejemplo de cómo quedan los tweets una vez procesados por el script, es el siguiente:
- Pablo L. Cienfuegos @xtrasgu (3:32 PM – 12 Jul 12)
Por cierto, el festival del humor de ayer… ni puta gracia. - Pablo L. Cienfuegos @xtrasgu (12:44 AM – 12 Jul 12)
La disimulada reforma electoral de Rajoy – http://www.malaprensa.com/2012/07/la-dis … - Pablo L. Cienfuegos @xtrasgu (12:39 AM – 12 Jul 12)
Ya ni se cuidan los detalles… pasándose las valoraciones por el forro de los cojones. Ta guapo. - Pablo L. Cienfuegos @xtrasgu (12:36 AM – 12 Jul 12)
102 – http://hiroshiges-inferno.blogspot.com.es/2012/07/102.ht … - Juan Gómez-Jurado @JuanGomezJurado (1:58 PM – 11 Jul 12)
Los libros llevan un IVA superreducido del 4%, que se mantendrá. Pero el de los ebooks subirá al 21%. Una medida estúpida por completo. - Pablo L. Cienfuegos @xtrasgu (11:56 PM – 11 Jul 12)
@aleasoft ¿Un pueblo extremeño? - Pacu Sierra @PacuSierra (3:34 PM – 11 Jul 12)
Subida del IVA: es una subida del 16.6%(de 18 a 21%) no del 3%, y el tipo reducido el 25%(de 8 a 10%) no del 2%. #lascuentasclaras - Alberto Llopis @Gafas_y_reloj (2:34 PM – 11 Jul 12)
A la derecha, ministra italiana anunciando recortes Monti. A la izquierda, diputados PP tras anuncio Rajoy. No comment pic.twitter.com/Taw67Tqy - Javier de la Cueva @jdelacueva (2:06 PM – 11 Jul 12)
Herencias y falacias http://politica.elpais.com/politica/2012/ … - José María Mateos @Rinze (12:47 PM – 11 Jul 12)
La herencia recibida de Zapatero es Rajoy. - Antonio Maestre @AntonioMaestre (11:08 AM – 11 Jul 12)
.@policia Si hubierais tenido los cojones necesarios para no reprimir a los que luchaban por vuestros derechos, tendríais paga de navidad. - Pablo L. Cienfuegos @xtrasgu (9:03 AM – 10 Jul 12)
Como viene el Jefón, hoy todos con su mejor traje y corbata… qué asco, por Dios… - Pablo L. Cienfuegos @xtrasgu (7:32 AM – 10 Jul 12)
¡Hoy toca Festival del Humor! Vivimos como queremos, la verdad… - Onda Cero Gijón @ondacerogijon (7:41 AM – 9 Jul 12)
#Asturias Desde las 7.09 está cortada la A-66 a la altura de Olloniego. El corte afecta en el mismo punto al acceso a la AS-242 @tuitrafico - Pablo L. Cienfuegos @xtrasgu (7:05 AM – 9 Jul 12)
Han roto Twitter por andar jugando con el API. Si no lo puedo integrar con el blog, no me vale. Llega la hora de identi.ca. - Pablo L. Cienfuegos @xtrasgu (7:03 AM – 9 Jul 12)
Sharing Professional Content on LinkedIn and Twitter – http://blog.linkedin.com/2012/06/29/sha … - Pablo L. Cienfuegos @xtrasgu (7:01 AM – 9 Jul 12)
Delivering a consistent Twitter experience – https://dev.twitter.com/blog/deliverin … - Pablo L. Cienfuegos @xtrasgu (6:58 AM – 9 Jul 12)
Twitter mimics Facebook, kills own ecosystem – http://www.zdnet.com/twitter-mimics … - Un Gato @Cataflais (11:30 PM – 27 Sep 11)
Mi mascota favorita son los hámsters; no tienes que alimentarlos ni darles agua y en tres días se mueren y puedes comprar otro, si quieres. - Pablo L. Cienfuegos @xtrasgu (11:38 PM – 8 Jul 12)
@Alberto_Altas@Sietes81 ¡Vamos Bertín! A ver si hay un poco de piqueteo para el Jefón… sería tan hermoso…