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}"를 추가하여 파일이 definitely 읽히고 있는지 확인했습니다.

IMPORT_FILE과 IMPORT_CATEGORY가 올바르게 설정되었음을 알 정도로 스크립트가 작동하고 있다는 것은 알고 있습니다.

문제 해결/디버깅을 위해 다른 방법으로 시도해 볼 수 있는 아이디어가 있을까요?

감사합니다! :blue_heart:

몇 달 전 discus에서 일부 작업을 했습니다. frozen_string_literal 문제를 target[sym] << str을 target[sym] += str로 교체하여 수정했다고 생각하지만, 첫 줄의 true를 false로만 변경해도 괜찮을 것입니다.

당신처럼 아무런 효과가 없었던 것 같은 막연한 기억은 있지만, 당시 어떤 상황이였는지 기억나지 않고 제 변경 사항에서 눈에 띄는 것도 보이지 않습니다. 또한 이 가져오기(import)가 기존 사이트에 통합되어야 하므로 다른 변경 사항들도 몇 가지 넣었기 때문에, 제 코드가 당신에게 도움이 되지 못할 것 같습니다.

Hey @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 가져오기가 실제로 깨진 상태라면, 개선하기 위해 PR을 열어 주세요!

나는 항상 ~할 의도가 있다…

좋아요! 다음 코드를 사용하여 작동하도록 만들었습니다:

    @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와 관련이 있을 것 같아, 절박한 마음에 Disqus 내보내기 파일의 모든 URL을 HTTP에서 HTTPS로 변경하고 상황이 나아지기를 바라고 있습니다.

어떤 조언이라도 환영합니다.

[업데이트!]

현재 제 추측은 다음과 같습니다: Disqus 댓글이 더 이상 Disqus 스레드가 없는 게시물(예: 1853년의 tumblr 블로그)에 있는 경우, 이 가져오기 스크립트가 끔찍한 방식으로 실패합니다.

만약 제가 맞다면, 저보다 코드를 더 잘 아는 누군가가 가져오기 도구를 패치하여 이러한 스레드와 댓글을 문제없이 건너뛰게 하는 방법을 제안해 주실 수 있을까요?

그리고 제가 틀렸다면, 아마도 더 많은 발견과 함께 이 게시물에 다시 답글을 달게 될 것입니다. :stuck_out_tongue:

[업데이트!]

더 이상 어디로도 연결되지 않는 링크를 가진 스레드의 모든 댓글을 수동으로 삭제했습니다. 이 작업으로 모든 Disqus 댓글을 가져오는 데 충분해 보입니다. 따라서, 이 스크립트의 코드를 읽을 수 있는 누군가가 이에 맞게 패치해 주면 좋겠습니다. 제가 할 수 있다고 생각하지 않습니다.

적어도 이 글이 저를 따라올 다음 불쌍한 사람에게 도움이 되기를 바랍니다. 행운을 빕니다.

평화롭게.