Problèmes avec l'utilisation du script d'importation disqus.rb

Salutations,

Je viens de configurer Discourse, mais je souhaiterais importer mes commentaires depuis Disqus. J’ai remarqué qu’il existe un script d’importation très bien conçu, mais il ne semble pas fonctionner pour moi.

MISE À JOUR #2 : Ok, il semble que j’avais un XML mal formé, j’ai donc maintenant le même problème tel que noté ici. Le problème est que Disqus n’inclut plus l’adresse e-mail dans les exports XML et les « cache » en fait dans leur tableau de bord. Donc, il se peut simplement que l’importation des commentaires ne soit pas possible, sauf si vous ajoutez du code supplémentaire pour générer des adresses e-mail à la volée pour la fonction create_users.

MISE À JOUR : En fait, je suppose que je devrais faire un pas en arrière un instant. Sans ajuster l’élément frozen_string_literal au début du script, j’obtiens :

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)

Donc, peut-être que ce problème devrait être résolu en premier (avant de creuser ce qui suit) ?

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)

Je ne connais pas beaucoup Ruby – en fait, je n’en connais aucun, mais je sais assez pour essayer d’ajouter du débogage comme puts "#{id}" pour voir si quelque chose est récupéré, etc. Par exemple, j’ai ajouté la ligne 190 ci-dessus – puts "#{target}" ou puts "#{str}" – afin de voir que le fichier est bien lu.

Je sais qu’une partie du script fonctionne, car IMPORT_FILE et IMPORT_CATEGORY ont été correctement définis.

Avez-vous des idées sur ce que je pourrais faire d’autre pour dépanner/déboguer ?

Merci ! :blue_heart:

J’ai travaillé sur le disque il y a quelques mois. Je pense avoir corrigé le problème de frozen_string_literal en remplaçant target[sym] << str par target[sym] += str, bien que changer simplement true en false dans la première ligne devrait suffire.
Je me souviens vaguement que cela ne produisait aucun effet, comme cela semble être le cas pour vous, mais je ne me rappelle plus exactement ce que c’était et je ne vois rien d’évident dans mes modifications. De plus, j’ai dû apporter d’autres changements car cette importation doit s’intégrer dans un site existant, donc je crains que mon code ne vous soit d’aucune aide.

1 « J'aime »

Salut @pfaffman ! Merci d’avoir pris le temps de répondre !

J’ai aussi essayé d’utiliser target[sym] += str et de modifier la première ligne pour qu’elle soit false. Je pense que ma mise à jour #2 ci-dessus est correcte. Elle tente de passer la valeur de email à une autre fonction, mais comme elle est nulle ou vide, l’autre fonction s’emballe et génère une erreur :stuck_out_tongue_closed_eyes:

Il faudrait introduire un nouveau code pour gérer le cas où email est vide : remplacer cette valeur par une valeur par défaut, générer une nouvelle valeur unique, ou simplement ignorer la création d’un nouvel utilisateur lorsque le champ est vide.

    @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 vous le corrigez et que c’est vraiment cassé pour les importations Disqus, n’hésitez pas à ouvrir une PR pour l’améliorer !

1 « J'aime »

J’ai toujours l’intention de…

2 « J'aime »

Parfait ! J’ai réussi à faire fonctionner cela en utilisant ce qui suit :

    @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

J’ai également défini frozen_string_literal: false.

2 « J'aime »

Je suis allé plus loin, mais maintenant quelque chose de nouveau est nil. Je vais chercher et tâtonner, mais j’apprécierais de l’aide, et je m’engage à partager mes découvertes.

J’ai appliqué les correctifs de ce fil, puis je suis resté bloqué ici lors de l’importation des sujets :

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)

Bon. Je ne pense pas être en mesure de résoudre ça ce soir.

J’ai réussi à déterminer que find_remote() renvoie nil pour un commentaire, mais je ne sais pas ce que cela signifie ni pourquoi c’est important. Je soupçonne que cela a un lien avec HTTP/HTTPS, donc par désespoir, je vais simplement remplacer toutes les URLs de HTTP par HTTPS dans mes fichiers d’exportation Disqus et espérer le meilleur.

Les conseils sont très bienvenus.

[MISE À JOUR !]

Ma conjecture actuelle : si le commentaire Disqus se trouve sur un post dont le lien ne pointe plus vers un fil Disqus (comme un blog Tumblr de 1853), alors ce script d’importation échoue lamentablement.

Par hasard, si j’ai raison, quelqu’un qui connaît mieux le code pourrait-il suggérer comment corriger l’importateur afin qu’il saute simplement ces fils et commentaires sans problème ?

Et si je me trompe, eh bien, je répondrai probablement à ce message avec de nouvelles découvertes. :stuck_out_tongue:

[MISE À JOUR !]

J’ai supprimé manuellement tous les commentaires des fils dont les liens ne mènent plus nulle part. Cela semble avoir suffi pour importer tous mes commentaires Disqus. Je pense donc qu’il serait bien qu’une personne capable de lire le code de ce script puisse le corriger en conséquence. Je ne pense pas pouvoir le faire moi-même.

J’espère, du moins, que ces mots aideront la prochaine pauvre âme qui me suivra. Bonne chance.

Paix.