방금 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가 올바르게 설정되었음을 알 정도로 스크립트가 작동하고 있다는 것은 알고 있습니다.
몇 달 전 discus에서 일부 작업을 했습니다. frozen_string_literal 문제를 target[sym] << str을 target[sym] += str로 교체하여 수정했다고 생각하지만, 첫 줄의 true를 false로만 변경해도 괜찮을 것입니다.
당신처럼 아무런 효과가 없었던 것 같은 막연한 기억은 있지만, 당시 어떤 상황이였는지 기억나지 않고 제 변경 사항에서 눈에 띄는 것도 보이지 않습니다. 또한 이 가져오기(import)가 기존 사이트에 통합되어야 하므로 다른 변경 사항들도 몇 가지 넣었기 때문에, 제 코드가 당신에게 도움이 되지 못할 것 같습니다.
target[sym] += str를 사용해보고 첫 번째 줄을 false로 바꾸는 것도 시도해 봤습니다. 위에서 언급한 제 업데이트 #2가 옳다고 생각합니다. email의 값을 다른 함수에 전달하려고 하는데, 값이 null이거나 비어 있어서 다른 함수가 오류를 일으키고 있습니다
email이 비어 있는 경우를 처리하고 기본값으로 대체하거나, 새로운 고유 값을 생성하거나, 비어 있으면 새 사용자 생성을 건너뛰도록 하는 새로운 코드가 필요합니다.
더 멀리까지 진행했지만, 이제 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 블로그)에 있는 경우, 이 가져오기 스크립트가 끔찍한 방식으로 실패합니다.
만약 제가 맞다면, 저보다 코드를 더 잘 아는 누군가가 가져오기 도구를 패치하여 이러한 스레드와 댓글을 문제없이 건너뛰게 하는 방법을 제안해 주실 수 있을까요?
그리고 제가 틀렸다면, 아마도 더 많은 발견과 함께 이 게시물에 다시 답글을 달게 될 것입니다.
[업데이트!]
더 이상 어디로도 연결되지 않는 링크를 가진 스레드의 모든 댓글을 수동으로 삭제했습니다. 이 작업으로 모든 Disqus 댓글을 가져오는 데 충분해 보입니다. 따라서, 이 스크립트의 코드를 읽을 수 있는 누군가가 이에 맞게 패치해 주면 좋겠습니다. 제가 할 수 있다고 생각하지 않습니다.
적어도 이 글이 저를 따라올 다음 불쌍한 사람에게 도움이 되기를 바랍니다. 행운을 빕니다.