مشاكل في استخدام سكربت استيراد 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:

لقد قمت ببعض العمل مع discus قبل بضعة أشهر. أعتقد أنني أصلحت frozen_string_literal عن طريق استبدال target[sym] << str بـ target[sym] += str، على الرغم من أن مجرد تغيير true إلى false في السطر الأول يجب أن يكون كافياً.
أتذكر بشكل ضبابي أنه لم يفعل شيئاً كما يبدو أنه حدث معك، لكنني لا أتذكر ما كان عليه ولا أرى أي شيء واضح في التغييرات التي قمت بها. وكان عليّ إجراء بعض التغييرات الأخرى لأن هذا الاستيراد يحتاج إلى التكامل مع موقع موجود، لذا أخشى أن كودي لن يفيدك.

إعجاب واحد (1)

مرحبًا @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) لتحسينه!

إعجاب واحد (1)

دائمًا ما أعزم على…

إعجابَين (2)

حسناً! لقد نجحت في تشغيل هذا باستخدام ما يلي:

    @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.

إعجابَين (2)

تمكنت من التقدم أكثر، لكن الآن هناك شيء جديد أصبح 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، لذا، يأسًا، سأقوم بتغيير جميع الروابط من HTTP إلى HTTPS في ملفات تصدير Disqus الخاصة بي وأتمنى الأفضل.

النصائح مُرحَّب بها بشدة.

[تحديث!]

فرضيتي الحالية: إذا كان تعليق Disqus منشورًا على موضوع لا يحتوي الرابط الخاص به على خيط Disqus بعد الآن (مثل مدونة Tumblr من عام 1853)، فإن سكريبت الاستيراد هذا يفشل فشلاً ذريعًا.

بالصدفة، إذا كنت محقًا، هل يمكن لشخص يعرف الكود أفضل مني أن يقترح كيفية تعديل السكريبت ليتخطى هذه الخيوط والتعليقات بسلاسة؟

وإذا لم أكن محقًا، فسأرد على هذا الموضوع باكتشافات إضافية على الأرجح. :stuck_out_tongue:

[تحديث!]

حذفت يدويًا جميع التعليقات من الخيوط التي تحتوي على روابط لم تعد تؤدي إلى أي مكان. يبدو أن هذا كان كافيًا لاستيراد جميع تعليقات Disqus الخاصة بي. لذلك، أعتقد أنه سيكون من الرائع لو قام شخص قادر على قراءة كود هذا السكريبت بتعديله وفقًا لذلك. لا أعتقد أنني أستطيع فعل ذلك.

آمل، على الأقل، أن تساعد هذه الكلمات الروح البائسة التالية التي ستأتي بعدي. حظًا موفقًا.

سلام.