Script para compartir artículos de WordPress en Twitter

Script para compartir artículos de WordPress en Twitter



Cualquiera que corra un sitio con WordPress con un cierto volumen de artículos notará tediosa la tarea de tener que compartirlos manualmente en distintas redes sociales. Python resulta una herramienta ideal para automatizar este tipo de tareas.

El siguiente código permite compartir automáticamente artículos de un sitio de WordPress en Twitter. Utiliza el módulo pymysql para conectarse a la base de datos y tweepy para enviar los tweets. Los artículos se seleccionan de forma aleatoria. Sin embargo, el programa se asegura que no se repitan cada una cierta cantidad determinada de artículos compartidos (por defecto 30).

Siguiendo la misma lógica puede fácilmente adaptarse para compartir en otras redes sociales como Facebook, Google+ e Instagram.

La idea es que corra como una tarea programada, tantas veces como artículos quieras que se compartan en un día. Si ocurre un error el script envía un correo electrónico vía smtplib con los detalles de la excepción.

Para poder correrlo necesitarás conocer la información de tu base de datos y tener un par de claves de acceso de Twitter (clic aquí para ver cómo generarlas). Si quieres hacer uso de la función de mandar un correo cuando ocurre un error, también deberás proveer los datos de un servidor SMTP y un destinatario.

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

from email.mime.text import MIMEText
from smtplib import SMTP_SSL
from traceback import format_exc

import pymysql
import tweepy


# URL principal del sitio.
SITE_URL = "http://recursospython.com"
# Los artículos compartidos no se repiten hasta que hayan alcanzado
# la siguiente cantidad. Luego el contador regresa a cero, y así
# sucesivamente.
REPEAT_LIMIT = 30

# Datos SMTP para enviar un email cuando ocurre un error.
EMAIL_TO = ""  # Destinatario.
EMAIL_FROM = ""
EMAIL_PASSWORD = ""
SMTP_HOST = ""
SMTP_PORT = 465

# Claves de la API de Twitter.
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

# Datos de la base de datos MySQL de WordPress.
DB_HOST = ""
DB_PORT = 3306
DB_USER = ""
DB_PASSWORD = ""
DB_NAME = ""


def send_error_email():
    message = format_exc()
    
    mime_message = MIMEText(message, "plain")
    mime_message["From"] = EMAIL_FROM
    mime_message["To"] = EMAIL_TO
    mime_message["Subject"] = "Error al compartir"
    
    smtp = SMTP_SSL(SMTP_HOST, port=SMTP_PORT)
    smtp.login(EMAIL_FROM, EMAIL_PASSWORD)
    
    smtp.sendmail(EMAIL_FROM, EMAIL_TO, mime_message.as_string())
    smtp.quit()


def main():
    conn = pymysql.connect(
        host=DB_HOST, port=DB_PORT, user=DB_USER,
        passwd=DB_PASSWORD, db=DB_NAME
    )
    cursor = conn.cursor()
    
    # Crear la tabla "autoshare" si no existe.
    cursor.execute(
        "CREATE TABLE IF NOT EXISTS autoshare_lastshared ("
        "   post_id bigint(20)"
        ")"
    )
    conn.commit()
    
    # Seleccionar un artículo que no se haya compartido
    # en las últimas (REPEAT_LIMIT) veces.
    cursor.execute(
        "SELECT ID, post_name, post_title FROM wp_posts posts "
        'WHERE post_status = "publish" AND '
        'post_type = "post" AND '
        "NOT EXISTS (SELECT 1 FROM autoshare_lastshared shared "
        "            WHERE posts.ID = shared.post_id) "
        "ORDER BY RAND() "
        "LIMIT 1"
    )
    post = cursor.fetchone()
    
    # Asegurarse que el resultado no esté vacío.
    if post is not None:
        post_id, post_name, post_title = post
        
        # Añadir el artículo a los últimos compartidos.
        cursor.execute(
            "INSERT INTO autoshare_lastshared VALUES (%s)",
            post_id
        )
        cursor.execute("SELECT COUNT(*) FROM autoshare_lastshared")
        count = cursor.fetchone()[0]
        
        if count >= REPEAT_LIMIT:
            # Comenzar a repetir artículos una vez alcanzado
            # el número crítico.
            cursor.execute("TRUNCATE TABLE autoshare_lastshared")
        
        # Crear el mensaje.
        url = "{}/{}/".format(SITE_URL, post_name)
        tweet = "{} {}".format(post_title, url)
        
        # Conectar a la API de Twitter.
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
        api = tweepy.API(auth)
        
        # Enviar el nuevo tweet.
        api.update_status(status=tweet)
        
        conn.commit()
    else:
        print("No hay nada para compartir.")
    
    conn.close()


if __name__ == "__main__":
    try:
        main()
    except Exception:
        send_error_email()



Deja un comentario