Publicar feed en Tumblr

· 4 min · @Programación · #Python #unRAID

Este artículo, podría decirse que es una continuación de este artículo pero en este caso, es para Tumblr.

La idea es la misma, pero para otra red social. Eso sí, más pequeña y desconocida o al menos para mí. Nunca había oído hablar de ella, pero nunca se sabe y así ya estoy en ella, aunque sea solamente para publicar los artículos que voy añadiendo a mi web / blog.

Partimos de la base que antes de empezar tenemos que tener instalado:

usuari@debian:~$ pip install --user pytumblr

También tenemos que tener feedparser que se usa para el tratamiento de los XML que si tienes este mismo script pero para Mastodon, seguramente ya lo tienes. Sino te tocará instalarlo.

El siguiente paso, es dar de alta tu aplicación en el API de Tumblr. Esto es un poco confuso, porque es difícil de encontrar, pero son los siguientes:

Tener en cuenta una cosa, primero os aconsejo que os creéis la cuenta en Tumblr y que luego accedáis a estos links, sino os pedirá usuario y password.

En el momento de dar de alta la aplicación se obtiene:

  • Consumer_key
  • Consumer_secret

Luego, cuando se autentifica la aplicación se obtiene:

  • Oauth_token
  • Oauth_token_secret

Para poder publicar en esta red. Después solamente tienes que tener el script en Python para publicar.

En este caso, pondré el que yo estoy utilizando ahora mismo, aunque estoy estudiando hacerle unos cambios para añadir más información. Pero con esto ya tenéis un principio.

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

  # Script que lee el feed rss de un blog y publica un artículo de forma aleatoria en twitter y mastodon

  # Tienes que tener instaladas las librerías feedparser, Twython, Mastodon

  # Autor: Victor Santos y un poco de ChatGPT
  # https://vctrsnts.codeberg.page/

  # Llama a los módulos Python
  import feedparser
  import pytumblr
  import random
  import xml.etree.ElementTree as ET

  consumer_key = 'xxxxxxxxxxxxxxx'
  consumer_secret = 'xxxxxxxxxxxxxxx'
  oauth_token = 'xxxxxxxxxxxxxxx'
  oauth_secret = 'xxxxxxxxxxxxxxx'

  # Authenticate and create a client
  client = pytumblr.TumblrRestClient(
      consumer_key,
      consumer_secret,
      oauth_token,
      oauth_secret
  )
  # Per extreure les categories del Feed
  def extract_categories_from_specific_entry(feed_url, entry_index=0):
      # Parse the feed using feedparser
      feed = feedparser.parse(feed_url)

      # If feed.entries is empty, we attempt to return categories from the first entry (index 0)
      if not feed.entries:
          return get_categories_from_entry(feed, 0)  # Return categories from index 0, if possible

      # If the feed has entries, extract from the specified index
      if len(feed.entries) > entry_index:
          entry = feed.entries[entry_index]
          # Extract categories (tags) from the entry and add '"' around each category
          categories = [category.term for category in entry.get('tags', [])]
          return ",".join(categories)
      else:
          print(f"Error: Feed has less than {entry_index+1} entries, returning categories from index 0.")
          return get_categories_from_entry(feed, 0)  # Return categories from index 0
          
  # Helper function to get categories from the first entry (index 0)
  def get_categories_from_entry(feed, index):
      if len(feed.entries) > index:
          entry = feed.entries[index]
          # Extract categories (tags) from the entry and add '"' around each category
          categories = [category.term for category in entry.get('tags', [])]
          return ",".join(categories)
      return ""  # Return empty string if no tags found

  # Seleccionamos el Feed
  feed = 'tu dirección web hacia el feed.xml'

  # Parseamos el Feed
  d = feedparser.parse(feed)

  # Extrae la longitud del Feed y aleatoriamente selecciona un artículo
  feedlen = len(d['entries'])
  num = random.randint(0, feedlen)

  # Inicializa la API de Twitter, escribe el nuevo estado y salimos d['entries'][0] es el último artículo publicado
  link = d['entries'][num]['link']
  title = d['entries'][num]['title']
  status_text = d['entries'][num]['summary_detail']['value']
  description = ("<strong>Recordando artículos publicados:</strong>" + "<br>" + status_text)
  tags = extract_categories_from_specific_entry(feed, num)

  # Replace 'your-blog-name' with your actual Tumblr blog name
  blogName = "tuNombreDeBlog"

  # Create the post
  client.create_link(
    blogName,
    title=title,
    url=link,
    description=description,
    tags=[tag for tag in tags.split(",")]
  )

En este script hay que tener en cuenta unas cosas:

  • blogName: Cuando te diste de alta en esta red social, el nombre de usuario, es el nombre de tu blog y es el que tienes que poner aquí.
  • feed: Es el fichero xml que quieres usar
  • consumer_key: La primera clave que necesitas
  • consumer_secret: La segunda clave que necesitas
  • oauth_token: La tercera clave que necesitas
  • oauth_token_secret: La última de las 4 claves que necesitas

Una vez, tengas el fichero creado, si quieres hacer pruebas, tienes que hacerlo de la siguiente manera:

   usuari@debian:~$ python3 nombreDelArchivo.py

Entonces, si no has tenido ningún problema, a tu cuenta de Tumblr te llegará un artículo aleatorio de tu web.

Como he dicho, aún lo tengo que mejorar, porque quiero añadir la imagen de la web, etc… Pero esto está en estudio.

Después de hacer las pruebas que creas oportunas, solo te quedará configurar el cron, para que se ejecute cuando tú quieras.

También, tengo otro script que publica el último artículo publicado. Se puede utilizar este mismo script, pero tienes que hacer algunas modificaciones:

# Això ja no fa falta
import random

# Això tampoc fa falta
feedlen = len(d['entries'])
num = random.randint(0, feedlen)

# Aqui en comptes de 'num' ha de ser '0' quedant així
status_text = d['entries'][0]['title'] + '<br>' + d['entries'][0]['link']
articulo = ("<strong>Último artículo publicado:</strong>" + '<br>' + status_text)

El resto de código para publicar es el mismo.

◇ Referencia