Connectant el blog amb Twitter
Feia estona que volia connectar el blog amb Twitter, de manera que cada vegada que escrigui un post s'envii directament a Twitter sense tenir que fer-ho jo. No és gran cosa, però és la vagueria informàtica: si es pot automatitzar perquè fer-ho a mà? :)
De llibreries de connexió cap a Twitter des de Python n'hi ha un bon grapat, la majoria el que fan és crear un envolcall a l'API de Twitter per tal que sigui més manejable des de Python i evitar repeticions de codi.
La llibreria que jo he fet servir s'anomena twython i té el mèrit de ser la primera que he provat. Potser n'hi ha de millors o més completes, però pel que he de fer ja basta.
El que vull doncs és que cada vegada que escrigui un nou post, s'envii un nou Twitt. Per fer-ho hi havia dues opcions clares: sobrescriure el mètode save
del model o bé utilitzar senyals.
He triat fer-ho amb senyals ja que m'estim més no fer massa complexe el mètode save, i a més la senyal post_save
ja ens informa de si s'ha gravat un registre nou o un registre antic. El codi de fet és tan senzill com això:
# Signals
def twitt_post(sender, **kwargs):
is_new = kwargs.get('created')
if settings.SEND_TWITT_ON_POST and is_new:
instance = kwargs.get('instance')
import twython
try:
twitter = twython.core.setup(username=settings.TWITTER_USER, password=settings.TWITTER_PASSWORD)
twitter.updateStatus(
_(u"Nou post al Blog de Trespams: %s %s") % (instance.headline, instance.get_absolute_url(),))
except AuthError, e:
logging.error("Error in twitter account")
logging.error(e.message)
except Exception, e:
loggin.error('Error in twitter post %s' % e.message)
# Connect the signal with the callback
post_save.connect(twitt_post, sender=Entry))
twitt_post
és el callback és a dir, la funció que es cridarà quan es gestioni la senyal, com a arguments passa la classe, la instància i si el registre es nou o no.
Obtenim primer si el post es nou o no, no vull empipar a la gent cada vegada que faci una correcció ortogràfica o tipogràfica, així que sols enviaré els twitts quan el post sigui nou. També he fet que sols s'envii si la variable de configuració SEND_TWITT_ON_POST
així ho diu.
Després ja és cosa de utilitzar la llibreria (login i enviar, així de fàcil) i capturar les possibles excepcions.
Finalment el que feim és connectar l'event amb el model i la funció callback.
Si tot va bé aquest post ja s'hauria d'enviar automàticament.