Skip to main content

Hi, I'm Mariano Guerra, below is my blog, if you want to learn more about me and what I do check a summary here: marianoguerra.github.io or find me on twitter @warianoguerra or Mastodon @marianoguerra@hachyderm.io

de blogger a nikola sin escalas

lo prometido es deuda, acá va una breve descripción de como hice para portar 6 anios de blog en blogger a nikola.

lo primero que hay que hacer es traer el listado de posts de tu blog de blogger, para eso vamos a usar una herramienta de linea de comandos que google provee para interactuar con varios de sus servicios llamada googlecl

después de instalarla corremos:

google blogger list --blog "titulo de tu blog aca" > posts

ahí tenemos un listado de los posts del blog que vamos a usar después.

creamos un directorio donde van a ir los posts y los metadatos:

mkdir htmls

después usamos un script como el siguiente (muy hackoso)

esta escrito en python3 (si, python 3) y usa muchas librerías que facilitan la vida, entre ellas isodate requests y pyquery.

acá esta el código que yo use, no lo usen para evaluar mis habilidades de programador :P

import sys
import csv
import time

from pyquery import PyQuery as pq
import requests

import isodate

POSTS_PATH = sys.argv[1]
print("processing posts from", POSTS_PATH)

with open(POSTS_PATH) as handle:
    reader = csv.reader(handle)

    print("reader", reader)
    for post in reader:
        title, url = post

        if url.startswith("http"):
            print()
            print("processing", title)
            print("fetching", url)

            response = requests.get(url)

            if response.status_code == 200:
                print("got OK response")
                qobj = pq(response.text)

                filename = url.split("/")[-1]
                slug = filename[:-5]

                try:
                    html = qobj(".post-body.entry-content").html()
                    date = qobj("abbr.published").attr("title")
                    dtime = isodate.parse_datetime(date)

                    with open("htmls/" + filename, "w") as html_out:
                        html_out.write(html)

                    with open("htmls/" + slug + ".meta", "w") as meta_out:
                        meta_out.write(title + "\n")
                        meta_out.write(slug + "\n")

                        formatted_date = dtime.strftime("%Y/%m/%d %H:%M")
                        meta_out.write(formatted_date + "\n")

                except Exception as error:
                    print(error)

                time.sleep(2)
            else:
                print("didn't get OK response", response.status_code)

        else:
            print("skipping post", title, "invalid url", url)

lo ponemos en el mismo directorio donde esta el archivo posts y el directorio htmls y corremos:

python3 blogger2nikola.py posts

ahora corremos esto (porque no quiero tocar el código de arriba y no probarlo):

cd htmls
for i in *.html; do mv $i $(basename $i .html).blogger; done

en el conf.py de python, las lineas importantes:

# ...

post_pages = (
    ("posts/*.txt", "posts", "post.tmpl", True),
    ("posts/*.blogger", "posts", "post.tmpl", True),
    ("stories/*.txt", "stories", "story.tmpl", False),
)

# ...

post_compilers = {
    "rest": ('.txt', '.rst'),
    "html": ('.blogger',),
    "markdown": ('.md', '.mdown', '.markdown')
    }

# ...

movemos lo que tenemos en htmls al directorio posts de nuestro blog nikola y le damos arranque:

doit

como final con suspenso, vamos a http://disqus.com/admin/tools/import/platform/blogger/ e iniciamos la migración de comentarios de blogger a disqus (cosa que todavía no termino así que no se si anda)

les dejo el ultimo paso como tarea para la casa, si me acuerdo posteo como me fue con eso.