Problemas al usar el script de importación disqus.rb

Saludos,

Acabo de configurar Discourse, pero me gustaría importar mis comentarios de Disqus. Noté que hay un excelente script de importación, pero parece que no funciona para mí.

ACTUALIZACIÓN #2: Bien, parece que tenía algún XML malformado, así que ahora tengo el mismo problema que se menciona aquí. El problema es que Disqus ya no incluye la dirección de correo electrónico en las exportaciones XML y de hecho las “oculta” en su panel de control. Por lo tanto, quizás no será posible importar los comentarios a menos que se agregue algo de código adicional para generar direcciones de correo electrónico al vuelo para la función create_users.

ACTUALIZACIÓN: En realidad, supongo que debería dar un paso atrás por un momento. Sin ajustar el elemento frozen_string_literal en la parte superior del script, obtengo:

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)

Así que, ¿quizás ese problema debería resolverse primero (antes de profundizar en lo siguiente)?

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)

No sé mucho de Ruby; de hecho, no sé nada, pero sí sé lo suficiente como para intentar agregar algo de depuración como puts "#{id}" para ver si se está obteniendo algo y cosas así. Por ejemplo, agregué la línea anterior 190 - puts "#{target}" o puts "#{str}" para poder ver que definitivamente está leyendo el archivo.

Sé que una parte suficiente del script está funcionando para que IMPORT_FILE y IMPORT_CATEGORY se hayan configurado correctamente.

¿Alguna idea sobre qué más puedo hacer para solucionar el problema o depurar?

¡Gracias! :blue_heart:

Hice algún trabajo con Discus hace un par de meses. Creo que solucioné el problema de frozen_string_literal reemplazando target[sym] << str por target[sym] += str, aunque simplemente cambiar true por false en la primera línea debería ser suficiente.
Recuerdo vagamente que no hacía nada, al igual que parece haber ocurrido en tu caso, pero no recuerdo exactamente qué era y no veo nada obvio en mis cambios. Además, tuve que realizar otros ajustes, ya que esta importación debe integrarse en un sitio existente, así que temo que mi código no te sea de ayuda.

1 me gusta

¡Hola @pfaffman! ¡Gracias por tomarte el tiempo de responder!

También probé usar target[sym] += str y cambiar la primera línea a false. Creo que mi actualización #2 de arriba es correcta. Está intentando pasar el valor de email a otra función, pero como es nulo o vacío, la otra función se descontrola y da error :stuck_out_tongue_closed_eyes:

Sería necesario introducir algún tipo de nuevo código para manejar el caso en que email esté vacío: reemplazarlo con un valor predeterminado, generar un nuevo valor único o simplemente omitir la creación de un nuevo usuario cuando esté vacío.

    @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

Si lo solucionas y realmente está roto para las importaciones de Disqus, ¡siéntete libre de abrir un PR para mejorarlo!

1 me gusta

Siempre tengo la intención de…

2 Me gusta

¡Bien! He logrado que esto funcione utilizando lo siguiente:

    @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

También tengo configurado frozen_string_literal: false.

2 Me gusta

He avanzado más, pero ahora algo nuevo es nil. Voy a investigar y probar, pero agradecería ayuda, y me comprometo a compartir mis hallazgos.

Apliqué los parches de este hilo, y luego me quedé atascado al importar los temas:

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)

Vale. Creo que no estoy para esto esta noche.

He logrado averiguar que find_remote() devuelve nil para un comentario, pero no tengo ni idea de qué significa ni por qué importa. Sospecho que tiene algo que ver con HTTP/HTTPS, así que, por desesperación, voy a cambiar todas las URL de HTTP a HTTPS en mis archivos de exportación de Disqus y esperar lo mejor.

Los consejos son muy bienvenidos.

[¡ACTUALIZACIÓN!]

Mi conjetura actual: si el comentario de Disqus está en una publicación cuyo enlace ya no tiene un hilo en Disqus (como un blog de Tumblr de 1853), entonces este script de importación muere de manera horrible.

Por casualidad, si tengo razón, ¿podría alguien que conozca mejor el código sugerir cómo parchar el importador para que salte alegremente esos hilos y comentarios?

Y si no tengo razón, bueno, entonces probablemente responderé a esto con más descubrimientos. :stuck_out_tongue:

[¡ACTUALIZACIÓN!]

Eliminé manualmente todos los comentarios de los hilos con enlaces que ya no llevan a ningún lado. Esto parece haber sido suficiente para importar todos mis comentarios de Disqus. Por lo tanto, creo que sería genial que alguien que pueda leer el código de este script lo parchara en consecuencia. No creo que pueda hacerlo yo.

Al menos, espero que estas palabras ayuden al siguiente pobre alma que me siga. Buena suerte.

Paz.