Probleme bei der Verwendung des disqus.rb Import-Skripts

Hallo,

ich habe Discourse gerade eingerichtet, möchte aber meine Kommentare von Disqus importieren. Ich habe ein schönes Import-Skript gefunden, aber es scheint bei mir nicht zu funktionieren.

UPDATE #2: Ok, es scheint, dass ich einige fehlerhafte XML-Daten hatte, daher habe ich nun das gleiche Problem wie hier beschrieben. Das Problem ist, dass Disqus die E-Mail-Adresse in den XML-Exports nicht mehr enthält und diese in ihrem Dashboard tatsächlich „versteckt“. Vielleicht ist es also nicht möglich, die Kommentare zu importieren, es sei denn, man fügt zusätzlichen Code hinzu, um für die Funktion create_users auch E-Mail-Adressen dynamisch zu generieren.

UPDATE: Eigentlich sollte ich vielleicht einen Schritt zurücktreten. Ohne die Anpassung des Eintrags frozen_string_literal am Anfang des Skripts erhalte ich:

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)

Vielleicht sollte dieses Problem also zuerst behoben werden (bevor man sich mit dem unten Beschriebenen beschäftigt)?

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)

Ich kenne mich nicht sonderlich gut mit Ruby aus – eigentlich gar nicht –, aber ich weiß genug, um einige Debugging-Ausgaben wie puts "#{id}" hinzuzufügen, um zu prüfen, ob etwas abgerufen wird. Zum Beispiel habe ich die Zeile 190 mit puts "#{target}" oder puts "#{str}" ergänzt, damit ich sehen kann, dass die Datei definitiv gelesen wird.

Ich weiß, dass ein Großteil des Skripts funktioniert, da IMPORT_FILE und IMPORT_CATEGORY korrekt gesetzt wurden.

Habt ihr Ideen, was ich sonst noch tun kann, um das Problem zu diagnostizieren oder zu debuggen?

Vielen Dank! :blue_heart:

Ich habe vor ein paar Monaten etwas mit dem Discus gearbeitet. Ich glaube, ich habe das Problem mit frozen_string_literal behoben, indem ich target[sym] << str durch target[sym] += str ersetzt habe, obwohl es wahrscheinlich auch reicht, true in der ersten Zeile einfach auf false zu ändern.
Ich erinnere mich vage, dass es nichts bewirkt hat, so wie es bei dir auch der Fall zu sein scheint, aber ich kann mich nicht mehr genau erinnern, worum es ging, und sehe auch nichts Offensichtliches in meinen Änderungen. Außerdem musste ich einige weitere Anpassungen vornehmen, da dieser Import in eine bestehende Website integriert werden muss, daher befürchte ich, dass mein Code dir nicht weiterhelfen wird.

1 „Gefällt mir“

Hey @pfaffman! Danke, dass du dir die Zeit genommen hast zu antworten!

Ich habe es auch mit target[sym] += str versucht und die erste Zeile ebenfalls auf false geändert. Ich denke, mein Update #2 oben ist korrekt. Es versucht, den Wert in email an eine andere Funktion zu übergeben, aber da er null oder leer ist, gerät die andere Funktion in Panik und wirft einen Fehler :stuck_out_tongue_closed_eyes:

Es müsste irgendein neuer Code eingeführt werden, um den Fall zu behandeln, dass email leer ist, und ihn entweder durch einen Standardwert zu ersetzen, einen neuen eindeutigen Wert zu generieren oder einfach das Erstellen eines neuen Benutzers zu überspringen, wenn er leer ist.

    @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

Wenn du es reparierst und es bei Disqus-Importen wirklich nicht funktioniert, kannst du gerne einen PR öffnen, um es zu verbessern!

1 „Gefällt mir“

Ich beabsichtige immer, …

2 „Gefällt mir“

Alles klar! Ich habe das mit folgendem Code zum Laufen gebracht:

    @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

Außerdem habe ich frozen_string_literal: false gesetzt.

2 „Gefällt mir“

Ich bin weitergekommen, aber jetzt ist etwas neues nil. Ich werde weiter suchen und stochern, aber ich wäre für Hilfe dankbar und verspreche, meine Erkenntnisse zurückzugeben.

Ich habe die Patches in diesem Thread angewendet und bin dann beim Importieren von Themen hier steckengeblieben:

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. Ich glaube nicht, dass ich heute Abend noch dazu in der Lage bin.

Ich habe herausgefunden, dass find_remote() für einen Kommentar nil zurückgibt, und ich habe keine Ahnung, was das bedeutet oder warum es wichtig ist. Ich vermute, dass es etwas mit HTTP/HTTPS zu tun hat, also werde ich aus Verzweiflung einfach alle URLs in meinen Disqus-Exportdateien von HTTP auf HTTPS ändern und hoffen, dass es klappt.

Rat ist sehr willkommen.

[UPDATE!]

Meine aktuelle Vermutung: Wenn der Disqus-Kommentar auf einem Beitrag liegt, dessen Link keinen Disqus-Thread mehr hat (wie etwa ein Tumblr-Blog von 1853), dann geht dieses Importskript auf schreckliche Weise kaputt.

Falls ich zufällig recht habe, könnte jemand, der den Code besser kennt als ich, vorschlagen, wie man den Importeur so patcht, dass er solche Threads und Kommentare einfach überspringt?

Und falls ich falsch liege, werde ich wahrscheinlich mit weiteren Erkenntnissen auf diese Nachricht antworten. :stuck_out_tongue:

[UPDATE!]

Ich habe manuell alle Kommentare aus Threads gelöscht, deren Links nirgendwo mehr hinführen. Das scheint gereicht zu haben, um alle meine Disqus-Kommentare zu importieren. Daher wäre es schön, wenn jemand, der den Code dieses Skripts lesen kann, es entsprechend patchen könnte. Ich glaube nicht, dass ich das selbst schaffen kann.

Ich hoffe zumindest, dass diese Worte dem nächsten armen Seelen helfen, der mir folgt. Viel Glück.

Friede.