Gestión de followers de Twitter con Python


Seguimiento de Followers

Existen varias herramientas para gestionar cuentas de twitter que te permiten controlar el movimiento de seguidores: quien te sigue, te deja de seguir, etc…
Para practicar un poco construyendo apps me he puesto a codificar un sencillo programa que te gestione los followers de tu cuenta sin necesidad de instalar las herramientas mencionadas. Este código puede ser el embrión sobre el que añadir más funcionalidades. Ahí queda trabajo pendiente.

Antes de empezar con este código es necesario disponer de una clave de «developer» en twitter. No es muy complicado conseguirlo, tan sólo hay que describir que aplicación quieres construir, compromisos de uso de los datos que bajemos y poco más…en unos minutos dispones de las cuatro claves: consumer_key, consumer_secret, access_token y access secret. En el código de abajo recupero mis claves de un fichero que obviamente mantengo oculto. Estas cuatro claves permitirían acceso directo a la cuenta de twitter!.

En este programa he añadido una función que me envíe un correo con el resumen de los cambios. Vd puede adecuarlo a sus necesidades o caprichos!, y de igual manera disponer de password, cuenta de correo desde la que envía el mensaje junto con su dirección del servidor smtp, y dirección del correo que recibe el mensaje.

La lógica de este programa es muy sencilla :

  1. Carga desde twitter la lista de seguidores de la cuenta
  2. carga del disco local el fichero con los seguidores de la cuenta de la última vez que se ejecutó el programa
  3. En el caso de que sea la primera vez que se ejecuta obviamente no existe ese fichero, con lo cual graba por primera vez ese fichero, envía un mail informando de este hecho y termina
  4. En el caso de que exista–> Con las dos listas disponibles : seguidores actuales y pasados (los correspondientes a la última vez que se ejecutó), realiza una comparación y obtiene la lista de nuevos seguidores y seguidores que lo han dejado de hacer (unfollowers)
  5. Prepara un mail con el resumen, lo envía, actualiza el fichero en disco para la siguiente ejecución y termina.

En mi caso particular dispongo de una máquina virtual en Google, en la que he programado un crontab que ejecuta este programa diariamente, de tal manera que, sin intervención manual, recibo diariamente una actualización de mi cuenta Twitter (a propósito, mi usuario de twitter es @walyt ;-))..

Vamos con el código:

# variable de sistema para que pueda importa mi fichero pass_followers desde aquí..
import sys
sys.path.append("/Users/waly/Documents/proyectos/mylibs") # directorio de acceso a librerías auxiliares
# importo las variables con las claves, nombres de cuentas de correo, password etc..
from pass_followers import consumer_key,consumer_secret,access_token,access_secret
from pass_followers import sender_mypassword,sender_email,sender_smtp,receipt_email
from pass_followers import path_followers_file_mac

Utilizo la libreria python-twitter para la interacción con Twitter, no he encontrado ningún problema para ponerla en marcha y dispone de una documentación muy extensa, guiando incluso el proceso para solicitar las claves en Twitter.

import twitter
import smtplib
def descarga_followers_actuales(consumer_key_,consumer_secret_,access_token_key_,access_token_secret_):
# función que devuelve un diccionario con los seguidores de la cuenta, la cuenta está ya definida con las 
#cuatro claves
    api=twitter.Api(consumer_key_,
               consumer_secret_,
               access_token_key_,
               access_token_secret_,
               sleep_on_rate_limit=True)
    followers=api.GetFollowers()
    followers_dict={}
    for i in followers:
        followers_dict[i.id_str]=i.screen_name
    return followers_dict


def guarda_followers(path,diccionario):
#función que graba en almacenamiento local el diccionario con los seguidores actuales, para poder trabajar
#la próxima vez que se ejecute el programa    
    f = open(path,'w')
    f.write(str(diccionario))
    f.close()


def recupera_followers_antiguos(path_file):
#función que recupera de local el diccionario con los seguidores correspondientes a la última vez que se
#ejecutó el programa    
    f = open(path_file,'r')
    data=f.read()
    f.close()
    return eval(data)


def chequeo_new_followers(lista_antigua,lista_actual):
#comparando la lista antugua(recuperada del disco local) y la lista_actual(desde twitter)
# devuelve una lista de seguidores nuevos
    nuevas=[]
    for indice in lista_actual.keys():
        if indice not in lista_antigua:
            nuevas.append([indice,lista_actual[indice]])
    return nuevas


def chequeo_un_followers(lista_antigua,lista_actual):
#comparando la lista antigua(recuperada del disco local) y la lista_actual(desde twitter)
# devuelve una lista de unfollowers
    borrados=[]
    for indice in lista_antigua.keys():
        if indice not in lista_actual:
            borrados.append([indice,lista_antigua[indice]])
    return borrados


def server_connect(account, password, server, port=587):
#genera un objeto email que se utilizará en la función siguiente para enviar el mensaje
    if int(port) == 465:    # gmail server
        email_server = smtplib.SMTP_SSL(server, str(port))
    else:
        email_server = smtplib.SMTP(server, port)
        email_server.ehlo()
        email_server.starttls()
    email_server.login(account, password)
    return email_server


def envia_mail(cabecera='',nuevos=[],borrados=[],n=0):
#envía un mensaje con la información que se pasa como parámetros:
#cabecera : mensaje en el asunto del correo
#nuevos : nuevos seguidores
#borrados: unfollowers
#n: número total seguidores actuales    
    texto='From: Twitter waly'+'\n'
    texto+='To: Waly'+'\n'
    texto+=cabecera+'\n'
    #texto+='Subject: Actualización seguidores'+'\n'
    texto+='\n'*2+'Actualización de seguidores de hoy: '+'\n'
    texto+='Nuevos followers:'
    for i in nuevos:
        texto+='\n'
        texto+='----------------------------------------------------------------------------------'
        texto+='\n'+'\n'
        texto+='{},{}'.format(i[0],i[1])
        texto+='\n'

    texto+='\n'+'Unfollowers:'
    for i in borrados:
        texto+='\n'
        texto+='----------------------------------------------------------------------------------'
        texto+='\n'+'\n'
        texto+='{},{}'.format(i[0],i[1])
        texto+='\n'
    texto+='\n'+'{} seguidores actualmente'.format(n)
    server=server_connect(sender_email,sender_mypassword,sender_smtp)
    server.sendmail('Novedades',receipt_email,texto.encode('utf-8'))
    server.close
    return texto

Este cuerpo principal ejecuta la lógica que comenté en la introducción de este post.

if __name__ == "__main__":
    dict_actual=descarga_followers_actuales(consumer_key,consumer_secret,access_token,access_secret)
    n=len(dict_actual)
    try: 
        with open(path_followers_file_mac,"r") as f: #ya existe un fichero con seguidores
            dict_antigua=eval(f.read())
            novedades=chequeo_new_followers(dict_antigua,dict_actual)
            borrados=chequeo_un_followers(dict_antigua,dict_actual)
            texto=envia_mail('Subject: Actualización seguidores',novedades,borrados,n)
            guarda_followers(path_followers_file_mac,dict_actual)
    except IOError: #es la primera vez que se utiliza, luego no existe fichero con seguidores
        #print ('error')
        guarda_followers(path_followers_file_mac,dict_actual)
        texto=envia_mail('Subject: Primer uso, actualización',[],[],n)

Hemos visto una sencilla manera de gestionar seguidores en Twitter, sin necesidad de instalar herramientas externas. Este trabajo invita a implementar muchas más funcionalidades: análisis de seguidores, comportamiento, perfiles, impacto o involucración en trending topics…ya hay tarea!

Este notebook y su código se encuentra en: https://github.com/mharias/Twitter_followers

Saludos!

Deja una respuesta

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.