Para crear este sencillo bot utilizaremos la API pública de Twitter y la librería de Python Tweepy. Para poder usar la API necesitaremos un token privado que podemos aplicar a el aquí. Una vez obtenido el access token tendremos que guardar todos los credenciales en un archivo para después poder emplearlos.
En mi caso utilizare el IDE PyCharm, la version community. Se encuentra disponible para Linux, MacOS y Windows. Si has usado antes otro IDE de Intellij como Idea para Java te lo recomiendo, ya que la interfaz es completamente igual.
Una vez creemos nuestro archivo o proyecto, importaremos las dependencias que necesitaremos.
import datetime
import logging
import time
import os.path
import tweepy
import schedule
Emplearemos datetime, logging y time para depurar nuestro código y crear un archivo log aparte del output de la consola.
os.path para crear o comprobar la existencia del archivo donde guardaremos el último tweet que nuestra cuenta ha publicado, consultando cuando este inicie y grabando el archivo cada vez que publique un tweet.
La librería tweetpy es la encargada en darnos los medios para comunicarnos con la API de twitter mediante Python, aquí dejo la documentación completa de esta.
Usaremos schedule para programar cada cuanto publicaremos un tweet.
Autenticación con token
Utilizaremos nuestra clave secreta que habremos obtenido anteriormente en el portal web de Twitter Developers. Introduciremos el Access Token y Secret Key.
auth = tweepy.OAuthHandler("", "")
auth.set_access_token("",
"")
api = tweepy.API(auth)
Depuración
Definiremos nuestro propio método para depurar la aplicación, imprimir tanto en la pantalla como en un archivo log.
def log(logtext):
logging.debug(str(datetime.datetime.now()) + " | " + logtext)
print(str(datetime.datetime.now()) + " | " + logtext)
Con este agregado a nuestro código podremos comprobar si hemos autenticado correctamente con la API, y muchas cosas en los próximos pasos.
if api:
log("Twitter session opened.")
else:
log("Twitter session failed.")
Funcionamiento del Bot
Al arrancar nuestra aplicación lo primero que hará es comprobar con una condición, si el archivo config.txt existe en el directorio, si este existe lo abrimos en modo lectura (r de read) y leemos la posición del último tweet en la lista que próximamente crearemos que contendrá los tweets a publicar. Si el archivo no existe se creara un fichero con un 0 por defecto, y la variable «lastTweet_ID» será 0.
if os.path.exists("config.txt"):
file = open("config.txt", "r")
lastTweet_ID = int(file.read())
file.close()
else:
file = open("config.txt", "w+")
file.writelines("0")
lastTweet_ID = 0
file.close()
Podemos eliminar la parte de la condición en la que creamos el archivo y hacerlo manualmente pero igualmente en el próximo paso vamos a tener que utilizar un fichero por lo que está bien para practicar.
Ahora definiremos la rutina que al ejecutarla publicara el tweet.
def job(): log("Updating status...") #Definiremos la variable como global global lastTweet_ID # Leer lineas del archivo file = open("tweets.txt", "r") tweets = file.readlines() log(str(tweets)) log("ID:" + str(lastTweet_ID) + " Texto: " + tweets[lastTweet_ID]) # Publicar estado api.update_status(tweets[lastTweet_ID]) # Actualizar variable ID con la del nuevo tweet lastTweet_ID = lastTweet_ID + 1; # Comprobar que no hemos sobrepasado el limite de publicaciones if lastTweet_ID >= len(tweets): lastTweet_ID = 0 log("Updated status.") # Abrir config y guardar ID de este tweet file = open("config.txt", "w+") file.writelines(str(lastTweet_ID)) file.close()
Definiremos cómo global nuestra variable que almacena el orden de tweets a publicar, posteriormente crearemos manualmente un fichero tweets.txt en nuestro directorio local. Como en el paso anterior, abriremos el fichero en modo lectura, pero en este caso leeremos las líneas y las almacenaremos en la variable tweets.
Después actualizaremos el estado utilizando la API, aumentaremos el valor la variable que almacena el orden y lo guardaremos en nuestro fichero config.txt
Automatización del Bot
En mi caso deseo que el Bot publique un nuevo tweet cada 35 segundos, por lo que utilizaré el siguiente código:
job() # Programar cada 35 segundos schedule.every(35).seconds.do(job) while True: schedule.run_pending() time.sleep(1)
Llamo a la función job() fuera del schedule para que cuando iniciemos la aplicación publique un estado sin tener que esperar 35 segundos.
Resultados
Podemos comprobar desde la línea de comandos o desde nuestro archivo log que este está publicando tweets.
También podemos verificarlo desde el perfil de Twitter.