Mudando para Disqus
Posted on March 13, 2010
Hoje finalmente migrei todos os comentários do meu blog para o Disqus. Não foi um processo difícil, mas gastei mais tempo do que eu gostaria procurando informações e documentação. O processo consiste de três partes:
- Criar uma conta no Discus e configurá-lo para seu site (essa é a parte fácil)
- Alterar o código do seu blog para que no final do seu post ele faça embed do Disqus (não é tão complicado)
- Migrar todos os comentários antigos do seu blog para o Disqus (isso deu mais trabalho)
Configurar uma conta no Disqus é simples. Você vai configurar se quer que os comentários sejam moderados, com quais redes sociais quer se integrar e assim por diante. Recomendo gastar um tempo no configurador para se familiarizar com as opções.
Modificando o Site
Feito isso, basta modificar seu blog. No meu caso, eu uso o Enki, um dos blogs mais minimalistas e que com o Disqus fica mais mínimo ainda :-) Eu não parei ainda para realmente arrancar a tabela de comentários. Eu me restringi a mudar os templates. Dos pontos importantes, você vai querer alterar o template que renderiza o post. No local onde normalmente fica o loop que imprime comentário a comentário e depois o formulário para novo comentário, você acrescenta:
1 2 3 4 |
<div id="disqus_thread"></div> <script type="text/javascript" src="http://disqus.com/forums/akitaonrails/embed.js"></script> <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript=akitaonrails">comments powered by Disqus.</a></noscript> <a href="http://disqus.com" class="dsq-brlink">blog comments powered by <span class="logo-disqus">Disqus</span></a> |
Isso é suficiente para renderizar o formulário e todos os comentários do post. Ele usar a URL da página atual para localizar os comentários. No serviço dele, seu post é um “thread” e dentro dele ficam vários “posts”. Aliás, seu blog é um “forum”. A nomenclatura é meio genérica porque imagino que eles não queiram se passar como ferramenta apenas para blogs, mas eu ficaria mais satisfeito se os nomes fossem mais triviais como “post”, “comment” e “site”. Mas enfim :-)
Em seguida, precisei alterar o layout do site porque na coluna da direita existe um box para comentários mais recentes. Novamente, o código é simples:
1 2 3 |
<script type="text/javascript" src="http://disqus.com/forums/akitaonrails/recent_comments_widget.js?num_items=8&hide_avatars=1&avatar_size=32&excerpt_length=70"> </script> |
Nesse javascript você pode configurar coisas como quantidade de comentários que quer mostrar e qual o tamanho máximo do texto na listagem.
Outra coisa importante, na página inicial eu mostro todos os posts mais recentes e embaixo de cada um existia um contador com o número de comentários que o post já recebeu. Para isso o Discus recomenda que você acrescente o seguinte código no final do seu layout, antes da tag </body>:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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/akitaonrails/get_num_replies.js' + query + '"></' + 'script>'); })(); //]]> </script> |
Agora, na partial que lista cada post na página principal, eu fiz a seguinte alteração:
1 |
<a href="<%= post_path(post) %>#disqus_thread">View Comments</a> |
Isso vai criar um link com a âncora #discus_thread. O javascript acima vai procurar por todos os links que terminam com essa âncora e então perguntará ao servidor deles pelo contador. Quando receber o resultado ele vai substituir o texto “View Comments” por algo como “5 comments and 1 reaction”.
Migrando os dados
Essa foi a parte fácil. Agora vem a que deu mais trabalho. Para começar, é bom se familiarizar com a documentação das APIs do Discus. Veja a versão mais recente que está no Google Groups deles. Para facilitar eu usei a gem Disqus que o Norman Clarke fez. Porém precisava de alguns pequenos ajustes por isso fiz um fork e já mandei o pull request para ele. Mas é coisa bem mínima mesmo.
Depois de muitos testes, finalmente criei uma tarefa Rake em lib/tasks/load_discus.rake:
Alguns conceitos que você precisa entender são:
- Quando você se cadastra, ganha um “user api key” que você recebe clicando neste link
- Seu site é um “forum” e ele também tem um “forum api key”
- Cada post seu é cadastrado como uma “thread” em um “forum”
- Finalmente cada comentário é um “post” em uma “thread”
Para migrar você navega por todos os seus posts criando threads. Porém a API é meio confusa quanto a isso porque o procedimento que funcionou foi o que eu copiei do gist do Typo onde ele primeiro tenta ver se já existe um objeto thread para a URL do post, se não tiver cria uma nova thread e em seguida atualiza alguns dados extras. A inicialização de uma thread é, portanto, incompleta, exigindo uma segunda operação para atualizá-la. Mais do que isso, não está escrito em nenhum lugar, mas o atributo “title” parece que é importante e precisa estar igual ao que você mostra no título do seu post. Achei tudo isso bem inconsistente e acho que a documentação precisa melhorar um pouco mais.
De qualquer forma, imagino que agora esteja tudo ok. Se alguém ver alguma inconsistência nos comentários – especialmente nos mais antigos – não deixe de me avisar.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




