Entradas de Julio del 2012

Twitter Semanal – 2012-07-29

Domingo 29 de Julio del 2012

@xtrasgu on Twitter

Twitter Semanal – 2012-07-22

Domingo 22 de Julio del 2012

@xtrasgu on Twitter

Twitter Semanal – 2012-07-15

Domingo 15 de Julio del 2012

@xtrasgu on Twitter

WordPress Photo Carousel

Sábado 14 de Julio del 2012

[xtrasgu.org]Por fin, tras 8 meses esperando, Automattic (la compañía que desarrolla WordPress) ha liberado el Photo Carousel que ofrecía a los blogs alojados en wordpress.com al resto de blogs que se alojan por su cuenta (como este).

La intención de liberar esta característica como parte de Jetpack había sido anunciada por Matt Thomas en su blog, pero parecía que no iba a llegar nunca… ¡ya era hora!

Con esta nueva funcionalidad, lo más probable es que prescinda tanto de la Galería de Fotos como del Fotoblog que tenía alojados en mi página, y que lo centralice todo en WordPress. A ver cómo lo hago para no perder las imágenes de las entradas que he ido escribiendo estos últimos años.

Parseando Entradas de Twitter con Python

Viernes 13 de Julio del 2012

[xtrasgu.org]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:

Twitter Semanal – 2012-07-08

Domingo 08 de Julio del 2012

@xtrasgu on Twitter

Twitter Semanal – 2012-07-01

Domingo 01 de Julio del 2012

@xtrasgu on Twitter