Проблемы при использовании скрипта импорта disqus.rb

Приветствую,

Я только что настроил Discourse, но хотел бы импортировать свои комментарии из Disqus. Я заметил, что есть отличный скрипт импорта, однако он, похоже, не работает у меня.

ОБНОВЛЕНИЕ #2: Похоже, у меня был некорректный XML, поэтому теперь у меня возникла та же проблема, что и здесь. Проблема в том, что Disqus больше не включает адрес электронной почты в XML-экспорт и фактически «скрывает» их в своей панели управления. Так что, возможно, импортировать комментарии будет невозможно, если только не добавить дополнительный код для генерации адресов электронной почты на лету для функции create_users.

ОБНОВЛЕНИЕ: На самом деле, думаю, мне стоит немного отступить. Без изменения параметра frozen_string_literal в начале скрипта я получаю:

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)

Так что, возможно, эту проблему следует решить в первую очередь (прежде чем углубляться в то, что ниже)?

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)

Я не очень хорошо знаю Ruby — на самом деле я не знаю его вообще, но мне достаточно знать, чтобы попробовать добавить отладочный код, например puts "#{id}", чтобы увидеть, что-то загружается или нет. Например, я добавил выше строку 190 — puts "#{target}" или puts "#{str}", чтобы убедиться, что файл точно читается.

Я знаю, что часть скрипта работает, так как IMPORT_FILE и IMPORT_CATEGORY установлены правильно.

Есть ли какие-то идеи, что ещё можно сделать для устранения неполадок или отладки?

Спасибо! :blue_heart:

Некоторое время назад я работал с дискусом. Кажется, я исправил frozen_string_literal, заменив target[sym] << str на target[sym] += str, хотя, вероятно, достаточно просто изменить true на false в первой строке.
Я смутно помню, что это не давало эффекта, как, похоже, и у вас, но не могу вспомнить, в чём именно дело, и не вижу ничего очевидного в моих изменениях. Кроме того, мне пришлось внести и другие правки, так как этот импорт нужно интегрировать в существующий сайт, поэтому боюсь, что мой код вам не поможет.

Привет, @pfaffman! Спасибо, что нашли время ответить!

Я также попробовал использовать target[sym] += str и изменил первую строку на false. Думаю, мое обновление #2 выше верное. Оно пытается передать значение из email в другую функцию, но так как оно пустое или null, другая функция «сходит с ума» и выдаёт ошибку :stuck_out_tongue_closed_eyes:

Нужно добавить какой-то новый код, чтобы обрабатывать случай, когда email пустой: либо заменить его на значение по умолчанию, либо сгенерировать новое уникальное значение, либо просто пропустить создание нового пользователя, если оно пустое.

    @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

Если вы исправите это и окажется, что импорт Disqus действительно не работает, не стесняйтесь создать pull request для его улучшения!

Я всегда намереваюсь

Отлично! Мне удалось это реализовать с помощью следующего кода:

    @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

Также у меня установлено значение frozen_string_literal: false.

Я продвинулся дальше, но теперь что-то новое равно nil. Я буду искать и проверять, но буду признателен за помощь и обязуюсь поделиться своими находками.

Я применил исправления из этой темы, но затем застрял при импорте тем:

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)

Ладно. Кажется, сегодня я не справлюсь.

Мне удалось выяснить, что find_remote() возвращает nil для комментария, но я не понимаю, что это значит и почему это важно. Подозреваю, что дело в HTTP/HTTPS, поэтому от отчаяния решил просто заменить все URL с HTTP на HTTPS в моих файлах экспорта Disqus и надеяться на лучшее.

Советы очень приветствуются.

[ОБНОВЛЕНИЕ!]

Моя текущая гипотеза: если комментарий Disqus относится к посту, ссылка на который больше не содержит поток Disqus (например, блог Tumblr из 1853 года), то этот скрипт импорта завершится катастрофической ошибкой.

Если я прав, не мог бы кто-то, кто лучше знает код, подсказать, как исправить импортер, чтобы он просто пропускал такие потоки и комментарии?

А если я не прав, то, скорее всего, отвечу здесь с новыми находками. :stuck_out_tongue:

[ОБНОВЛЕНИЕ!]

Я вручную удалил все комментарии из потоков со ссылками, которые больше никуда не ведут. Похоже, этого хватило для импорта всех моих комментариев Disqus. Поэтому, думаю, было бы здорово, если бы кто-то, кто умеет читать код этого скрипта, применил соответствующее исправление. Я сам, кажется, не смогу этого сделать.

Хотя бы надеюсь, что эти слова помогут следующему бедолаге, который последует по моим стопам. Удачи.

Мир.