Cliente Twitter Python usando Tweepy

Quiero vender un bajo eléctrico y unos patines que no ocupo y la mejor forma para hacerlo es desde twitter !

El tema es que no quiero estar escribiendo cada hora un tweet repitiendo lo mismo…

Existen aplicaciones online (http://laterbro.com/ )que te dejan programar tweets, pero tienes que darte el trabajo de programarlas😯

Entonces, pensé: “por qué no mejor programar algo una sola vez ? ” (pensamientos profundos que tengo de vez en cuando😛 ) y ps, eso vamos a hacer.

Python porque es ultra simple de programar, y porque tiene librerías de virtualmente TODO. En nuestro caso necesitamos tweepy, que tiene toda la API de twitter. Lo instalamos con un sudo pip install tweepy.

Podemos probarlo de esta manera:

import tweepy
def main():
	api = tweepy.API()
	busqueda = api.search("luk0s")
	for tweet in busqueda:
		print tweet.created_at, " ", tweet.text
	return 0
if __name__ == '__main__':
	main()

Y debería darles un listado de mis últimas menciones y tweets con la fecha😀

Si queremos cosas más grandes, tenemos que autenticarnos. Lo primero es “crear” la aplicación en twitter, cosa que hacemos desde aquí https://dev.twitter.com/ .

Una cuando nos registramos, nos entrega 2 variables: Consumer key y Consumer secret. Estas variables las agregamos en nuestro código para darle al posible usuario la opción de entrar con su cuenta y twitter por él desde la aplicación.

Nuestro código (ahora más en serio) cambia a esto:

import tweepy

def main():

	CONSUMER_KEY = "TU VARIABLE"
	CONSUMER_SECRET = "TU VARIABLE"

	auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
	auth_url = auth.get_authorization_url()
	print 'Autorizar ! : ' + auth_url
	verifier = raw_input('PIN: ').strip()
	auth.get_access_token(verifier)
	print "ACCESS_KEY = '%s'" % auth.access_token.key
	print "ACCESS_SECRET = '%s'" % auth.access_token.secret
	return 0

if __name__ == '__main__':
	main()

Obviamente tienen que reemplazar según sus valores.
El sistema les entrega una URL que tienen que abrir en el navegador (o modificar el código y hacerlo internamente) y se autoriza el asunto. 

Ahora, tomamos el número que nos da y lo escribimos en la consola. Le damos enter al PIN y nos entrega otros valores. Estos los volvemos a guardar para identificar la aplicación automágicamente con el usuario. Las llaves deberían guardarlas en una BD o encriptarlas. pero por ahora, la vamos a dejar en un archivo, así como variables globales que guardamos en otro archivo .py

Ahora volvemos a cambiar el código y tenemos esto para escribir un tweet

import tweepy
from keys import *

def main():

	auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
	auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
	api = tweepy.API(auth)
	api.update_status("Test desde Twittuk0s, mi #Twitter app en #python!!")
	return 0

if __name__ == '__main__':
	main()

Y lo ejecutamos y debería aparecer en twitter.

Ahora vamos a programarlo. En realidad es cosa de meter el script en cron y la magia queda lista.

Primero escribimos en un fichero los tweets que queremos mandar. Algo tan simple como esto:
Tweet Programado Nº 1
Tweet Programado Nº 2

Un tweet por línea. Modificamos el código y ahora tenemos lo siguiente:

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

import tweepy, time
from keys import *

def main():
	auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
	auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
	api = tweepy.API(auth)
	programados = open("programados")
	for tweet in programados:
		api.update_status(tweet)
		time.sleep(2)
	return 0

if __name__ == '__main__':
	main()

Y listo. El programa automágicamente lee cada línea y lo mandamos al update del timeline. Además le damos una pausa de 2 segundos.

Primero le damos permiso de ejecución: chmod +x twittuk0s.py (depende del nombre del archivo obvio).

Ahora lo agregamos a CRON, digamos todas el punto de hora todos los días:

0 * * * * /home/luk0s/Documentos/Twittuk0s/twittuk0s.py 

Donde

  1. 0 corresponde al minuto (minuto 0)
  2. * corresponde a la hora (todas)
  3. * corresponde al día del mes (todos)
  4. * corresponde al mes (todos)
  5. * corresponde al día de la semana (todos)
  6. corresponde al script (ruta absoluta)

Y eso es todo😀

ACTUALIZACIÓN

Luego de buscar en varias partes, logré mandar notificaciones desde el script. Cada vez que me mande los pios, nos manda una notificación diciendo: “Enviados” o algo así😀

Agregamos el import dbus y luego agregamos lo siguiente antes del loop (en caso que quieran cargar un try:catch

knotify = dbus.SessionBus().get_object("org.kde.knotify", "/Notify") 

Con esa línea creamos el enlace a knotify, quién se encarga de mandar las notificaciones. Ahora, después del loop:

knotify.event("warning", "kde", [], "Twittukos", "Twitts Enviados Correctamente", [], [], 1000, 0, dbus_interface="org.kde.KNotify")

El detalle es:

knotify.event(event, fromApp, contexts, title, text, pixmap, actions, timeout, winId)

Si lo corremos normalmente (desde consola) va a funcionar todo ok😀 PERO si lo corre CRON, se va a caer diciendo:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Esto porque no sabe a quién pedirle la X11😯. Lo arreglamos con 3 pasos:

  1. Correr el comando: xhost +local:
  2. Luego: xhost
  3. Y por último, actualizar crontab y agregar env DISPLAY=:0.0 antes del comando a ejecutar. Algo así:  0 * * * * env DISPLAY=:0.0 /home/luk0s/Documents/Twittukos/Twittukos.py

Eso es todo. Ahora crontab se ejecutará (en mi caso) cada hora, y levantará la notificación😀

Obviamente, esto funciona en KDE. En otro gestor debería ser lo mismo, salvo el cambio de knotify al que usen.
Referencias:

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Aplicación, Python, Tutoriales. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s