En el anterior post comentaba que no había tenido que hacer nada para montar este wordpress. Bueno, al final he tenido que trabajar un poquito.
No tenía pensado publicarlo y por eso no hice un programita que realizara el proceso, pero como no he encontrado documentación sobre el tema, pensé que sería bueno compartirlo.
Cuando me puse con ello pensé que sería muy sencillo ya que wordpress tiene una opción para migrar desde otros sistemas. (Herramientas / Importar)
El problema es que blogia no está entre estos sistemas. No obstante hay una opción (Importar desde RSS 2.0) Que te permite fabricarte un rss para subir los contenidos.
Lo primero que tienes que hacer es descargarte una copia de seguridad de tus post en blogia (en la sección de Administración > Opciones > Extras >Copia de seguridad )
Esta copia es una versión html con todo el contenido de tu blog. Todo sería más fácil si blogia proporcionara un RSS con todo el contenido de tu blog, pero solo puedes acceder a tus 10 últimos post con este método.
Todo lo que he necesitado es tener perl instaldo, grep, wget, xargs y el HTML::Entities instalado en perl. Yo lo hice desde un Unix, pero perl, grep y wget lo tienes para windows. Encuanto xargs, solo lo uso para descargarme las imágenes. Para obtener las imágenes puedes abrir el html que proporciona blogia y guardarlo. Te hará una copia de las imágenes.
Lo primero es transformar el html en un rss:
El html de blogia viene con una cabecera html, un listado de noticias, las noticias en si y el los cierres del html al final . Nos quedamos solo con las noticias y con los campos que queremos. Puedes abrirlo y editarlo sin más o hacer un grep:
grep '<div class="articulo"' > articulos_blogia_2.html
De esta estructura html que nos queda (viene en una sola línea pero lo pongo un poco bonito):
<div id="2009051301">
<a name="art2009051301"></a>
<h2><a href="ENLACE">TITULO</a></h2>
<div>CONTENIDO<p>AUTOR</p>
<p>Etiquetas: <a href="http://www.technorati.com/tag/sup" rel="tag">TAG</a>, <a href="http://www.technorati.com/tag/standup" rel="tag">TAG</a></p>
</div>
<div>FECHA <a href="../2009/051301-magic-carpet-boards.php">Enlace permanente</a>. Tema:
</div> <hr />
<strong>Comentarios:</strong>COMENTARIOS
</div>
Tenemos que pasar a esta otra:
<item>
<link>ENLACE</link>
<guid isPermaLink="false">ENLACE</guid>
<title>TITULO</title>
<content:encoded><![CDATA[CONTENIDO]]></content:encoded>
<category>CATEGORIA 1</category>
<category>CATEGORIA 2</category>
<pubDate>FECHA </pubDate>
<dc:creator>AUTOR</dc:creator>
</item>
A tener en cuenta:
- el autor no lo he manejado por que todos los post estaban firmados por la misma persona.
- La fecha cambia de formato
- Los comentarios no se suben.
perl -p -e 's|.*<h2><a href="([^"]*)">(.*?)</a></h2><div>(.*)</div><div>(\d*)/(\d*)/(.*?)<.*|\n<item>\n<link>$1</link>\n<guid isPermaLink="false">$1</guid>\n<title>$2</title>\n<content:encoded><![CDATA[$3]]></content:encoded>\n<pubDate>$5/$4/$6</pubDate>\n<dc:creator>Gusko</dc:creator></item>|g' articulos_blogia_2.html | perl -p -e 's|<p>Etiquetas: (.*)</p>]]></content:encoded>|]]></content:encoded>\n$1|g' | perl -p -e 's|(, )?<a href="http://www.technorati.com/tag/[^"]*" rel="tag">([^<]*)</a>|<category>$2</category>|g' > rss_descabezado.xml
Es decir, al contenido le paso tres expresiones regulares:
La primera, me queda todo mas o menos montado, pero sin categorias. Las categorias se quedan dentro de contenido:
Busco:
.*<h2><a href="([^"]*)">(.*?)</a></h2><div>(.*)</div><div>(\d*)/(\d*)/(.*?)<.*
Reemplazo:
<item>
<link>$1</link>
<guid isPermaLink="false">$1</guid>
<title>$2</title>\n<content:encoded><![CDATA[$3]]></content:encoded>
<pubDate>$5/$4/$6</pubDate>
<dc:creator>Luarmr</dc:creator>
</item>
La segunda, para sacar los comentarios del content:
Busco:
<p>Etiquetas: (.*)</p>]]></content:encoded>
Reemplazo:
]]></content:encoded>\n$1
Y la última, para darle formato a las categorías.
Busco:
(, )?<a href="http://www.technorati.com/tag/[^"]*" rel="tag">([^<]*)</a>
Reemplazo:
<category>$2</category>
Y la salida la dejo en:
rss_descabezado.xml
Lo llamo descabezado por que no obtenemos un rss válido, le falta la cabecera y el pié, no os preocupéis por que a wordpress le da igual
Depurando el RSS
Este rss ya lo podríamos subir, pero nos encontramos con varios problemas:
Primero, blogia tiene una proteccion hotlinking, para evitar que les roben ancho de banda, por ello debemos descargarnos las imágenes y cambiarles la ruta en nuestro rss. Si subes ahora el rss puede que veas las imágenes por que tu navegador las tiene cacheadas, pero si limpias la cache o las ves desde otro navegador/ordenador, verás que no aparecen.
Creamos un directorio, y ejecuto esta instrucción dentro del directorio. Básicamente, busco las imágenes, me quedo con las de blogia y me las descargo con el wget.
perl -p -e 's|(<img[^>]*>)|\n$1\n|g' ../rss_descabezado.xml | grep '<img' | grep blogia | perl -p -e 's|^.*src="([^"]*)".*$|$1|g' | xargs --replace wget {}
Busco las imágenes (’s|(<img[^>]*>)|\n$1\n|g) y grep ‘<img’) , me quedo solo con las que son de blogia (grep blogia) y extraigo la url (perl -p -e ’s|^.*src=”([^"]*)”.*$|$1|g’)
Todo esto lo paso por un xargs para pedir las imágenes al servidor una a una ( xargs –replace wget {})
Subo las imagenes al servidor y ahora reemplazo la ruta de las imagenes en el rss por la mía.
perl -p -e 's|src="http://losjabalys.blogia.com/upload/|src="http://www.supcenterasturias.com/img/blogia/|g' rss_descabezado.xml > rss_descabezado_con_img.xml
Y otro problema
Algunos de nuestros títulos y de nuestras categorías tienen caracteres como acentos que dan problemas, solución, otra vez el perl.
perl -n -e 'use HTML::Entities; if($_ =~ /<title>(.*)<\/title>/){print "<title>" . (encode_entities($1)). "</title>\n";}else{print $_;}' rss_descabezado_con_img.xml
perl -n -e 'use HTML::Entities; if($_ =~ /<category>(.*)<\/category>/){print "<category>" . (encode_entities($1)). "</category>\n";}else{print $_;}' rss_descabezado_con_img.xml
Es decir, bucamos los title, procesamos su contenido con encode_entities y el resto lo dejamos igual.
Hacemos los mismo con el nodo category.
Y por fín:
Ahora vamos al wordpress y subimos el fichero rss_descabezado_con_img.xml.
Evualá tenemos posts.
Dudo mucho que me haya explicado con claridad, pero si alguien tiene una duda que deje un comentario
Proceso completo
grep '<div class="articulo"' articulos_blogia_recien_descargados.html > articulos_blogia.html;
perl -p -e 's|.*<h2><a href="([^"]*)">(.*?)</a></h2><div>(.*)</div><div>(\d*)/(\d*)/(.*?)<.*|\n<item>\n<link>$1</link>\n<guid isPermaLink="false">$1</guid>\n<title>$2</title>\n<content:encoded><![CDATA[$3]]></content:encoded>\n<pubDate>$5/$4/$6</pubDate>\n<dc:creator>Gusko</dc:creator><comments>$1#comentarios</comments></item>|g' articulos_blogia.html | perl -p -e 's|<p>Etiquetas: (.*)</p>]]></content:encoded>|]]></content:encoded>\n$1|g' | perl -p -e 's|(, )?<a href="http://www.technorati.com/tag/[^"]*" rel="tag">([^<]*)</a>|\n<category>$2</category>\n|g' > rss_descabezado.xml
perl -p -e 's|(<img[^>]*>)|\n$1\n|g' ../rss_descabezado.xml | grep '<img' | grep blogia | perl -p -e 's|^.*src="([^"]*)".*$|$1|g' | xargs --replace wget {}
perl -p -e 's|src="http://losjabalys.blogia.com/upload/|src="http://www.supcenterasturias.com/img/blogia/|g' rss_descabezado.xml > rss_descabezado_con_img.xml
perl -n -e 'use HTML::Entities; if($_ =~ /<title>(.*)<\/title>/){print "<title>" . (encode_entities($1)). "</title>\n";}else{print $_;}' rss_descabezado_con_img.xml
perl -n -e 'use HTML::Entities; if($_ =~ /<category>(.*)<\/category>/){print "<category>" . (encode_entities($1)). "</category>\n";}else{print $_;}' rss_descabezado_con_img.xml
Tags: blogia, Desarrollo web, expresiones regulares, perl, wget, wordpress