Problemas com o uso do script de importação disqus.rb

Olá,

Acabei de configurar o Discourse, mas gostaria de importar meus comentários do Disqus. Notei que existe um script de importação muito bom, porém ele não parece estar funcionando para mim.

ATUALIZAÇÃO #2: Ok, parece que eu tinha algum XML malformado, então agora estou com o mesmo problema mencionado aqui. O problema é que o Disqus não inclui mais o endereço de e-mail nas exportações XML e, na verdade, “oculta” eles no painel deles. Então, talvez não seja possível importar os comentários a menos que você adicione algum código adicional para também gerar endereços de e-mail sob demanda para a função create_users.

ATUALIZAÇÃO: Na verdade, acho que deveria dar um passo atrás por um segundo. Sem ajustar o item frozen_string_literal no topo do script, recebo:

Traceback (most recent call last):
        6: from script/import_scripts/disqus.rb:228:in `<main>'
        5: from script/import_scripts/disqus.rb:228:in `new'
        4: from script/import_scripts/disqus.rb:21:in `initialize'
        3: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.10/lib/nokogiri/xml/sax/parser.rb:104:in `parse_file'
        2: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.10/lib/nokogiri/xml/sax/parser.rb:104:in `parse_with'
        1: from script/import_scripts/disqus.rb:176:in `characters'
script/import_scripts/disqus.rb:195:in `record': can't modify frozen String (FrozenError)

Então, talvez esse problema deva ser resolvido primeiro (antes de investigar o que está abaixo)?

root@discourse:/var/www/discourse# su discourse -c "bundle exec ruby script/import_scripts/disqus.rb"
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

importing users...

importing topics...


Updating topic status

Updating bumped_at on topics

Updating last posted at on users

Updating last seen at on users

Updating first_post_created_at...

Updating user post_count...

Updating user topic_count...

Updating topic users

Updating post timings

Updating featured topic users

Updating featured topics in categories
        4 / 4 (100.0%)  [3222 items/min]  n]  
Resetting topic counters


Done (00h 00min 00sec)

Não sei muito Ruby - na verdade, não sei nada, mas sei o suficiente para tentar adicionar algum depuração como puts "#{id}" para ver se algo está sendo buscado e etc. Por exemplo, adicionei a linha acima 190 - puts "#{target}" ou puts "#{str}" para que eu possa ver que o arquivo está sendo lido definitivamente.

Sei o suficiente do script que está funcionando para saber que IMPORT_FILE e IMPORT_CATEGORY foram definidos corretamente.

Alguma ideia sobre o que mais posso fazer para solucionar/debugar?

Obrigado! :blue_heart:

Trabalhei com o discus há alguns meses. Acho que corrigi o frozen_string_literal substituindo target[sym] << str por target[sym] += str, embora apenas mudar true para false na primeira linha já deveria resolver.
Lembro vagamente que isso não surtiu efeito, assim como parece ter sido para você, mas não me recordo exatamente do que era e não vejo nada óbvio nas minhas alterações. Além disso, precisei fazer outras modificações, já que essa importação precisa se integrar a um site existente, então temo que meu código não lhe ajude.

1 curtida

Olá @pfaffman! Obrigado por dedicar um tempo para responder!

Também tentei usar target[sym] += str e alterar a primeira linha para false. Acredito que minha atualização #2 acima está correta. O código está tentando passar o valor de email para outra função, mas como ele é nulo ou vazio, a outra função entra em pânico e gera um erro :stuck_out_tongue_closed_eyes:

Seria necessário introduzir algum novo código para lidar com o caso em que email está vazio, substituindo-o por um valor padrão, gerando um novo valor único ou simplesmente pulando a criação de um novo usuário quando estiver vazio.

    @parser.posts.each do |id, p|
      p[:author_email] = "#{p[:author_username]}@nowhere.invalid" unless p[:author_usrname]
      next if p[:is_spam] == 'true' || p[:is_deleted] == 'true'
      puts "name: #{p[:author_name]}, username: #{p[:author_username]}, email: #{p[:author_email]} "
      by_email[p[:author_email]] = { name: p[:author_name], username: p[:author_username] }
    end

Se você corrigir e o problema for realmente nos imports do Disqus, fique à vontade para abrir um PR para melhorá-lo!

1 curtida

Eu sempre tenho a intenção de…

2 curtidas

Tudo bem! Consegui fazer isso funcionar usando o seguinte:

    @parser.posts.each do |id, p|
      p[:author_username] = "#{p[:author_name]}" unless p[:author_username]
      p[:author_email] = "#{p[:author_username]}@disqus.sucks" unless p[:author_email]
      next if p[:is_spam] == 'true' || p[:is_deleted] == 'true'
      puts "name: #{p[:author_name]}, username: #{p[:author_username]}, email: #{p[:author_email]}"
      by_email[p[:author_email]] = { name: p[:author_name], username: p[:author_username] }
    end

    @parser.threads.each do |id, t|
      t[:author_username] = "#{t[:author_name]}" unless t[:author_username]
      t[:author_email] = "#{t[:author_username]}@disqus.sucks" unless t[:author_email]
      by_email[t[:author_email]] = { name: t[:author_name], username: t[:author_username] }
    end

Também tenho frozen_string_literal: false definido.

2 curtidas

Cheguei mais longe, mas agora algo novo está nil. Vou investigar e testar, mas agradeceria ajuda e me comprometo a compartilhar minhas descobertas.

Appliquei os patches deste tópico e, em seguida, fiquei travado aqui ao importar tópicos:

Traceback (most recent call last):
        5: from script/import_scripts/disqus.rb:236:in `<main>'
        4: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        3: from script/import_scripts/disqus.rb:29:in `execute'
        2: from script/import_scripts/disqus.rb:70:in `import_topics_and_posts'
        1: from script/import_scripts/disqus.rb:70:in `each'
script/import_scripts/disqus.rb:84:in `block in import_topics_and_posts': undefined method `topic' for nil:NilClass (NoMethodError)

OK. Acho que não estou apto para isso hoje à noite.

Consegui descobrir que find_remote() retorna nil para um comentário e não faço ideia do que isso significa nem por que importa. Suspeito que tenha algo a ver com HTTP/HTTPS, então, na desesperança, vou apenas mudar todas as URLs de HTTP para HTTPS nos meus arquivos de exportação do Disqus e torcer pelo melhor.

Dicas são muito bem-vindas.

[ATUALIZAÇÃO!]

Minha conjectura atual: se o comentário do Disqus estiver em uma postagem cujo link não tem mais um thread no Disqus (como um blog do Tumblr de 1853), então este script de importação morre de forma horrível.

Por acaso, se eu estiver certo, alguém que conheça o código melhor do que eu poderia sugerir como corrigir o importador para que ele pule alegremente esses threads e comentários?

E se eu não estiver certo, bem, então provavelmente responderei a isso com mais descobertas. :stuck_out_tongue:

[ATUALIZAÇÃO!]

Apaguei manualmente todos os comentários de threads com links que não levam a lugar nenhum. Isso parece ter sido suficiente para importar todos os meus comentários do Disqus. Acredito, portanto, que seria ótimo se alguém que consiga ler o código desse script pudesse corrigi-lo de acordo. Não acho que consiga fazer isso.

Espero, pelo menos, que essas palavras ajudem a próxima alma infeliz que me seguir. Boa sorte.

Paz.