Problemi con l'utilizzo dello script di importazione disqus.rb

Saluti,

Ho appena configurato Discourse, ma vorrei importare i miei commenti da Disqus. Ho notato che esiste uno script di importazione molto carino, tuttavia sembra non funzionare per me.

AGGIORNAMENTO #2: Ok, sembra che avessi del XML malformato, quindi ora ho lo stesso problema notato qui. Il problema è che Disqus non include più l’indirizzo email nelle esportazioni XML e in realtà lo “nasconde” nella loro dashboard. Quindi forse non sarà possibile importare i commenti a meno che non si aggiunga del codice aggiuntivo per generare indirizzi email al volo per la funzione create_users.

AGGIORNAMENTO: In realtà, credo di dover fare un passo indietro per un attimo. Senza modificare l’elemento frozen_string_literal in cima allo script, ottengo:

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)

Quindi, forse quel problema dovrebbe essere risolto per primo (prima di approfondire quanto segue)?

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)

Non conosco molto Ruby - in realtà non ne conosco affatto, ma so abbastanza da provare ad aggiungere un po’ di debug come puts "#{id}" per vedere se viene recuperato qualcosa e così via. Ad esempio, ho aggiunto sopra la riga 190 - puts "#{target}" o puts "#{str}" così posso vedere che sta effettivamente leggendo il file.

So che una parte dello script funziona, dato che IMPORT_FILE e IMPORT_CATEGORY sono stati impostati correttamente.

Qualche idea su cosa altro posso fare per risolvere il problema o fare debug?

Grazie! :blue_heart:

Ho lavorato sul discus un paio di mesi fa. Penso di aver risolto il problema di frozen_string_literal sostituendo target[sym] << str con target[sym] += str, anche se probabilmente bastava cambiare true in false nella prima riga.
Ricordo vagamente che non facesse nulla, come sembra sia successo anche per te, ma non ricordo esattamente cosa fosse e non vedo nulla di evidente tra le mie modifiche. Inoltre, ho dovuto apportare altre modifiche perché questa importazione deve integrarsi in un sito esistente, quindi temo che il mio codice non ti sia d’aiuto.

1 Mi Piace

Ciao @pfaffman! Grazie per il tempo che hai dedicato a rispondere!

Ho provato anche a usare target[sym] += str e a impostare la prima riga su false. Penso che il mio aggiornamento #2 sopra sia corretto. Sta cercando di passare il valore di email a un’altra funzione, ma poiché è nullo o vuoto, l’altra funzione va in tilt e genera un errore :stuck_out_tongue_closed_eyes:

Sarebbe necessario introdurre del nuovo codice per gestire il caso in cui email sia vuoto, sostituendolo con un valore predefinito, generando un nuovo valore univoco o semplicemente saltando la creazione di un nuovo utente quando è vuoto.

    @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 la correggi e si rivela davvero rotta per le importazioni di Disqus, sentiti libero di aprire una PR per migliorarla!

1 Mi Piace

Ho sempre l’intenzione di…

2 Mi Piace

Perfetto! Sono riuscito a farlo funzionare usando quanto segue:

    @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

Ho anche impostato frozen_string_literal: false.

2 Mi Piace

Sono arrivato più lontano, ma ora qualcosa di nuovo è nil. Continuerò a cercare e a esaminare, ma apprezzerei un aiuto; mi impegno a condividere le mie scoperte.

Ho applicato le patch in questo thread, ma mi sono bloccato qui durante l’importazione dei topic:

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. Non credo di essere in grado di risolvere la cosa stasera.

Sono riuscito a capire che find_remote() restituisce nil per un commento, ma non ho idea di cosa significhi né perché sia importante. Sospetto che abbia a che fare con HTTP/HTTPS, quindi, per disperazione, cambierò semplicemente tutti gli URL da HTTP a HTTPS nei miei file di esportazione Disqus e spero nel meglio.

I consigli sono molto graditi.

[AGGIORNAMENTO!]

La mia attuale ipotesi: se il commento Disqus si trova su un post il cui link non ha più un thread Disqus (come un blog Tumblr del 1853), allora questo script di importazione muore una morte orribile.

Per caso, se ho ragione, qualcuno che conosce meglio il codice potrebbe suggerire come correggere l’importatore in modo che salti semplicemente tali thread e commenti?

E se non avessi ragione, beh, allora probabilmente risponderò a questo messaggio con ulteriori scoperte. :stuck_out_tongue:

[AGGIORNAMENTO!]

Ho eliminato manualmente tutti i commenti dai thread con link che non portano più da nessuna parte. Questo sembra essere stato sufficiente per importare tutti i miei commenti Disqus. Credo quindi che sarebbe utile se qualcuno in grado di leggere il codice di questo script potesse correggerlo di conseguenza. Non credo di poterlo fare io.

Spero, almeno, che queste parole aiutino il prossimo povero animo che mi seguirà. Buona fortuna.

Ciao.