Migrando de Haloscan a Disqus (si podés comentar, funcionó ;-)
Si sos usuario de Haloscan, y estás empezando a preguntarte que hacer... esta página te va a explicar una forma de llevarte tus comentarios a Disqus, otro servicio de comentarios para blogs gratuito.
Hace unos pocos días Haloscan anunció el fin de su servicio de comentarios gratuitos para blogs. Adiviná en qué servicio tengo 9 años de comentarios? Sí, en Haloscan.
Ofrecen una migración sencilla a su plataforma Echo, que es un servicio pago. Si bien Echo parece una plataforma de comentarios perfectamente digna, no tengo ganas de gastar dinero en este bloh si puedo evitarlo. Ya bastante le doy tiempo!
Por suerte, los muchachos de Haloscan permiten exportar los comentarios (antes había que pagar para eso), así que gracias Haloscan, fué un gusto!
Entonces empecé a investigar a donde me podía escapar. Parece haber dos sistemas grandes y gratuitos de comentarios:
Téngase en mente que principal interés es no perder mis comentarios, no la calidad del servicio. Habiendo dicho eso, los dos parecen ofrecer más o menos las mismas características.
Consideremos como importar comentarios en cada servicio:
Disqus: Puede importar de blogger y algún otro servicio hosteado. No de Haloscan.
Intense Debate: Puede importar algunos servicios hosteados y algunos archivos. No el que Haloscan me dió.
Entonce que hago? Escribir un programa en Python, por supuesto! Ahí ganó Disqus: tienen un API pública para los comentarios.
Entonces, todo lo que hay que hacer es:
Entender el API de Disqus
Entender los comentarios de Haloscan (es XML)
Crear los hilos necesarios en Disqus
Postear los comentarios de Haloscan a Disqus
Arreglar el blog para que los links a Haloscan funcionen con Disqus
Pan comido. Me llevó medio día, lo que a mi tarifa actual es el equivalente de 3 años de Echo, pero que gracia tendría pagar?
Así que, vamos paso por paso.
1. Entender el API de Disqus
Por suerte hay una biblioteca razonable: Disqus Python Client library y docs para la API así que esto no fué tan difícil.
Instale la biblioteca:
hg clone https://IanLewis@bitbucket.org/IanLewis/disqus-python-client/ cd disqus-python-client python setup.py install
El uso que vamos a darle al API es sencillo, así que si hace falta, lee la documentación 15 minutos. Yo saqué todo lo que necesitaba de este script para importar pybloxsom
Básicamente:
Obterner un key para la API
Loguearse
Obtener el "foro" correcto (Se puede usar una cuenta Disqus para más de un blog)
Postear en el hilo adecuado
2. Entender el archivo de comentarios de Haloscan
No sólo es XML, ¡ Es XML fácil!
Es más o menos así:
<?xml version="1.0" encoding="iso-8859-1" ?>
<comments>
<thread id="BB546">
<comment>
<datetime>2007-04-07T10:21:54-05:00</datetime>
<name>superstoned</name>
<email>josje@isblond.nl</email>
<uri></uri>
<ip>86.92.111.236</ip>
<text><![CDATA[that is one hell of a cool website ;-)]]></text>
</comment>
<comment>
<datetime>2007-04-07T16:14:53-05:00</datetime>
<name>Remi Villatel</name>
<email>maxilys@tele2.fr</email>
<uri></uri>
<ip>77.216.206.65</ip>
<text><![CDATA[Thank you for these rare minutes of sweetness in this rough world...]]></text>
</comment>
</thread>
</comments>
Entonces: un tag comments, que contiene una o más tags thread, que contienen uno o mas tags comment. ¡Pan comido con ElementTree!
Hay una obvia correspondencia entre comentarios y threads en Haloscan y Disqus. Bien.
3. Crear los hilos necesarios en Disqus
Esta es la parte complicada, porque requiere cosas de tu blog.
Hay que tener un permalink por post
Cada permalink debe ser una página separada. No sirve un permalink con # en la URL.
Para cada post, hay que saber el título, el permalink, y cómo identificar los comentarios en Haloscan.
Por ejemplo, supongamos que hay un post en //ralsina.me/weblog/posts/ADV0.html con un link de Haloscan como éste:
<a href="javascript:HaloScan('ADV0');" target="_self"> <script type="text/javascript">postCount('ADV0');</script></a>
¿Adónde más sale ese 'ADVO'? En el archivo XML de Haloscan, por supuesto. Es el atributo "id" de un thread.
Además, el título de este post es "Advogato post for 2000-01-17 17:19:57" (Es mi blog por supuesto ;-)
¿Tenés esos datos?
Entonces vamos a crear un thread en Disqus con exactamente los mismos datos:
URL
Thread ID
Titulo
La mala noticia es... vas a necesitar tener esta información para todo tu blog y guardarla en algún lado. Si tenés suerte, tal vez la puedas sacar de una base de datos, como hice yo. Si no... bueno, va a ser bastante trabajo :-(
Para los propósitos de esta explicación voy a asumir que ese dato está en un bonito diccionario indexado por thread id:
{ id1: (url, title), id2: (url, title) }
4. Postear los comentarios de Haloscan a Disqus
Aquí está el código. No está realmente probado, porque tuve que hacer varios intentos y arreglos parciales, pero debería estar cerca de lo correcto. (download):
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Read all comments from a CAIF file, the XML haloscan exports
from disqus import DisqusService
from xml.etree import ElementTree
from datetime import datetime
import time
# Obviously these should be YOUR comment threads ;-)
threads={
'ADV0': ('//ralsina.me/weblog/posts/ADV0.html','My first post'),
'ADV1': ('//ralsina.me/weblog/posts/ADV1.html','My second post'),
}
key='USE YOUR API KEY HERE'
ds=DisqusService()
ds.login(key)
forum=ds.get_forum_list()[0]
def importThread(node):
t_id=node.attrib['id']
# Your haloscan thread data
thr_data=threads[t_id]
# A Disqus thread: it will be created if needed
thread=ds.thread_by_identifier(forum,t_id,t_id)['thread']
# Set the disqus thread data to match your blog
ds.update_thread(forum, thread, url=thr_data[0], title=thr_data[1])
# Now post all the comments in this thread
for node in node.findall('comment'):
dt=datetime.strptime(node.find('datetime').text[:19],'%Y-%m-%dT%H:%M:%S')
name=node.find('name').text or 'Anonymous'
email=node.find('email').text or ''
uri=node.find('uri').text or ''
text=node.find('text').text or 'No text'
print '-'*80
print 'Name:', name
print 'Email:', email
print 'Date:', dt
print 'URL:', uri
print
print 'Text:'
print text
print ds.create_post(forum, thread, text, name, email,
created_at=dt, author_url=uri)
time.sleep(1)
def importComments(fname):
tree=ElementTree.parse(fname)
for node in tree.findall('thread'):
importThread(node)
# Replace comments.xml with the file you downloaded from Haloscan
importComments('comments.xml')
Ahora, si tuvimos suerte, ya tenés una linda y funcional colección de comentarios en tu cuenta de Disqus, y la tranquilidad de que no se perdieron los datos. Listo para el paso final?
5. Hackear tu blog para que los links de Haloscan ahora vayan a Disqus
Tal vez no necesites hacer nada más de lo que la guía de instalación de Disqus sugiere. Si vas a hacer la instalación universal editando HTML manualmente, es algo así:
Primero cambié mis links de comentarios. Así era con Haloscan:
<a href="javascript:HaloScan('ADV0');" target="_self"> <script type="text/javascript">postCount('ADV0');</script></a>
Y así es con Disqus:
<a href="//ralsina.me/weblog/posts/ADV0.html#disqus_thread">Comments</a>
Se agrega el javascript al fondo, antes del </body> como dice la guía (Éste es el mío, no es el que querés usar!):
<script type="text/javascript"> //<![CDATA[ (function() { var links = document.getElementsByTagName('a'); var query = '?'; for(var i = 0; i < links.length; i++) { if(links[i].href.indexOf('#disqus_thread') >= 0) { query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&'; } } document.write('<script charset="utf-8" type="text/javascript" src="http://disqus.com/forums/yourownblognamegoeshere/get_num_replies.js' + query + '"></' + 'script>'); })(); //]]> </script>
Además, en la página del post, hay que agregar el "embed code" de la guía de Disqus donde sea que vayan los comentarios.
Si querés que más de una página comparta los comentarios (por ejemplo, yo uso los mismos comentarios para la versión en inglés y castellano de un post), hay que usar algo así antes del embed code:
<script type="text/javascript"> var disqus_url = "http://the_url_where_the_comments_really_belong.com"; </script>
Y eso es todo. Debería ser suficiente para ponerte en marcha. Sin embargo:
Si esta guía te resultó útil y te ahorró dinero, porqué no ser un buen tipo y dármelo a mí? Hay un link de donaciones a la izquierda ;-)
Si no lo podés hacer andar, pedime ayuda. Cobro barato!
Asegurate de exportar los comentarios de Haloscan mientras puedas!