martes, 26 de julio de 2016

Como he publicado 247 fotos en twitter durante el último maratón de los cuentos

Advertencia: Este post no va sólo de fotografía, sino que requiere algunos conocimientos de programación.

Los que leais habitualmente mi blog ya conocéis el Maratón de los Cuentos de Guadalajara. Si queréis ver algunos posts antiguos sobre el tema, están accesibles en este enlace, y si queréis saber qué es el Maratón contado por sus organizadores más directos, tenéis una pagina web estupenda que os descubrirá lo que es, y os hará apuntar en la agenda el tercer fin de semana de junio del año que viene, para no faltar a la cita.

Este año se celebraba el 25 aniversario del Maratón, y con ese motivo, se ha querido actuar de manera especial en las redes sociales. Además de tratar de ser trending topic en twitter en algún momento del fin de semana (lo que se consiguió), queríamos ir mostrando a todos nuestros seguidores como había sido el Maratón de los ultimo años. Por este motivo, tuiteamos todas las fotos que hemos mostrado en la exposición que hacemos desde la Agrupación Fotográfica de Guadalajara en Noviembre desde 2008 hasta el año pasado. Eso suponía tuitear unas 250 fotos, una cada 11 minutos mas o menos para poder cubrir toda la exposición en las 46 horas que dura el maratón así:

Aunque hay aplicaciones que te permiten programar posts en twitter, mi querencia como ingeniero me llevó a preparar un sencillo programa en Python (para los legos, esto es un lenguaje de programación relativamente sencillo, pero suficientemente potente como para hacer cosas como ésta), y lanzarlo al inicio del maratón para que se encargara de tuitear por nosotros.

Para poder hacer esto, lo primero que debes hacer es pedir unas claves a twitter desde apps.twitter.com. Para tenerte mas controlado y que si haces algo raro te puedan localizar (aunque como medida es un poco inútil ante los malos de verdad), debes haberte autenticado con tu movil antes de que te den las claves. Si no lo has hecho aun, te pedirá que lo hagas en ese momento. En total tendrás 4 claves, llenas de números y letras, que tendrás que copiar y pegar en tu programa. Se supone que sólo tu has podido conseguirlas, por lo que nadie debería suplantarte. No es buena idea que se las des a nadie, ni que pases una copia de tu programa en python (que es legible por cualquiera), sin borrar o cambiar tus claves. Por supuesto, en el ejemplo que vais a ver, las claves que aparecen no son las mías ni las de la Agrupación Fotográfica de Guadalajara, desde cuya cuenta se tuitearon las fotos.

Para que el programa de Python os funcione, debéis haber instalado la librería "Tweepy", que es la que permitirá enviar mensajes de twitter. No voy a entrar aquí en cómo se instala la librería ni en cómo se utiliza Python, aunque os aseguro que es mucho más potente que el uso que le vamos a dar aquí, que consiste en tuitear mensajes con una foto y mandar mensajes directos. Para este post, voy a dar por supuesto que sabéis instalar librerías en vuestro ordenador. El código que os pongo a continuación funciona correctamente en Mac OS, y es cierto que lee los datos de un fichero de texto y que no tiene ningún control de errores, pero si tenéis cuidado y los ficheros que usáis están bien construidos, no habrá problemas. En este momento estoy preparando una versión que toma los datos de un fichero Excel y que tendrá protección contra posibles errores, pero en esta ocasión, entre la decisión de publicar las fotos y la fecha en que había que hacerlo sólo pasaron dos días, y estas cosas hay que hacerlas en el (poco) tiempo libre, no en horas de trabajo...

El programa en cuestión es el siguiente. Tened en cuenta que lo fundamental es lo que está en negrita. Lo que está en cursiva son comentarios. Ojo, porque hay un comentario en cursiva y en negrita, que hay que poner sí o sí... Los comentarios os permitirán saber a qué se dedica cada parte:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tweepy, time, sys

#Para leer el nombre del fichero de texto con los tuits argfile = str(sys.argv[1])

#Poned aqui las claves que has conseguido en apps.twitter.com.
#Con esto os identificáis vosotros y vuestro programa
#Mantened las comillas y poner aqui vuestra consumer key
CONSUMER_KEY = 'KsdALDHGvjashdgasjshsa'
#Mantened las comillas y poner aqui vuestra consumer secret key
CONSUMER_SECRET = '10IsdkjHd4iueñdiugf45hbalyrlfjwsfhb56sjlsjdafgHGSJH'
#Mantened las comillas y poner aqui vuestro access token
ACCESS_KEY = '7776318418-4F8jdshflhdslHJFDKSkkKDGKFG'
#Mantened las comillas y poner aqui vuestro access token secret
ACCESS_SECRET = 'H5jfkKGSHgk787SKDHJ6GhgdskgYD9Dh'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)

numlineas = 0

#Abrimos el fichero de texto con los tuits y las direcciones de las fotos
# y lo copiamos en lines[]
with open(argfile, "rb") as fp:
     lines = []
     for line in fp:
         numlineas = numlineas +1
         lines.append(line[:-1]) if line[-1] == "\n" else lines.append(line)
fp.close()

#Esto es solo para controlar que todo va bien.
# Nos dice cuantas lineas tiene el fichero
# y nos manda un mensaje directo a nuestra cuenta de Twitter
print(numlineas)
api.send_direct_message(user = '@tuiddetwitter', text = str(numlineas/2))

#El comando que usamos para envíar un tuit con imagenes.
# El primer campo es la imagen y el segundo el tweet
#api.update_with_media(f[1],f[0])

#Aqui recorrenos lines[] de dos en dos, para ir twiteando con imagenes
#El fichero que pasamos como argumento al programa
# tiene que tener en las lineas impares los tweets,
# y en las pares, el path completo hasta las imagenes
#Para comprobar que funciona, se puede comentar la linea de api.update...
# para que solo imprima las lineas.
# Si las imprime bien, es que luego, funcionara.
#Si todo va bien, cada 25 tuits nos manda un DM.
#El comando time.sleep(XXX) es para que espere XXX segundos entre un tuit y otro.
# En este caso, se mandaban cada 643 segundos (algo menos de 11 minutos).

linea = 0
while linea < numlineas:
     print(lines[linea])
     print(lines[linea + 1])
     api.update_with_media(lines[linea + 1],lines[linea])
     time.sleep(643)
     linea = linea + 2
     if linea % 50 == 0:
     api.send_direct_message(user = '@tuiddetwitter', text = str(linea/2))

#Esta ultima linea es para que sepamos que el programa ha acabado bien.
api.send_direct_message(user = '@tuiddetwitter', text = 'Prueba superada')

Además os hará falta un fichero de texto con los tweets y la ubicación de las fotos. Tiene que ser algo así como esto:

Este es el texto del tweet
/carpeta1/carpeta2/carpeta3/fichero1.jpg
Este es el texto del segundo tweet
/carpeta1/carpeta2/carpeta3/fichero2.jpg
Este es el texto del tercer tweet
/carpeta1/carpeta2/carpeta3/fichero3.jpg
...
Yo lo generé de manera más o menos automática con una hoja de excel que luego convertí a un fichero de texto, pero lo podéis hacer como más os guste. Si habéis llamado a vuestro programa "tuitea.py" y a vuestro fichero con los tuits y las direcciones de las fotos "datosparatuits.txt", lo que tenéis que hacer por último es:

prompt> python tuitea.py datosparatuits.txt
Tan sencillo como eso. No se si os servirá de mucho, pero os aseguro que para mí sí ha sido útil. Si a alguno de vosotros también os sirve, estupendo!.