منذ بضعة أيام (أعتقد أن ذلك كان مباشرة بعد التحديث إلى Discourse 2.5 النسخة التجريبية 5 - واستمر في النسخة التجريبية 6 - لكنه قد يكون مجرد صدفة)، فإن تضمين مقاطع فيديو YouTube يعمل بشكل متقطع. بعد بضع ساعات من عدم العمل، عاد التضمين للعمل بشكل طبيعي تلقائيًا.
منذ أمس، توقف العمل تمامًا.
لا أرى أي خطأ محدد مثير للشك في سجلات المنتدى.
هل يمكن أن يكون ذلك مشكلة في مهلة الانتظار؟ هل توجد طريقة للتحقيق في هذا الأمر بشكل محدد؟
بعض التفاصيل الإضافية الصغيرة.
أنا أستخدم Discourse 2.5.0.beta6 المحدّث إلى الإصدار 2d880b42a3 (تم إعادة البناء مباشرة قبل إرسال هذا المنشور).
عند إنشاء منشور جديد يحتوي على رابط يوتيوب، ألاحظ في وحدة تحكم Google Chrome خطأً إضافيًا قبل ظهور خطأ 404 عند طلب GET إلى onebox، ويشير هذا الخطأ إلى مشكلة في تسجيل Service Worker.
أود التنبيه إلى أن أي onebox يعمل باستثناء يوتيوب.
إذا قمت بتكرار استدعاء GET البسيط (مع تمرير الرؤوس وما إلى ذلك كما هو متوقع) إلى /onebox?url=…، فستحصل ببساطة على خطأ HTML 404.
إذا قمت بتكرار الطلب الذي يقوم به onebox على الخادم، بنسخه من كود Ruby في ملف youtube_onebox.rb، وهو curl 'https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=Xl-PTTeRsik' لأحد مقاطع الفيديو غير المدمجة، فإنه يبدو أنه يعمل بشكل مثالي.
في الواقع، يعيد الاستدعاء ما يلي: {"author_name":"AstronautiCAST","version":"1.0","height":270,"author_url":"https:\/\/www.youtube.com\/user\/AstronautiCAST","provider_name":"YouTube","provider_url":"https:\/\/www.youtube.com\/","thumbnail_height":360,"width":480,"html":"\u003ciframe width=\"480\" height=\"270\" src=\"https:\/\/www.youtube.com\/embed\/Xl-PTTeRsik?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c\/iframe\u003e","type":"video","thumbnail_width":480,"title":"Loading cargo into HTV-9 Konutori","thumbnail_url":"https:\/\/i.ytimg.com\/vi\/Xl-PTTeRsik\/hqdefault.jpg"}root@fait-2020:/var/discourse#
الذي يحتوي على كل ما يحتاجه onebox للتضمين.
@Falco، آسف جدًا لإزعاجك، لكن غياب دمج مقاطع YouTube (oneboxing) يُعيق تجربة المستخدم في منتدانا بشكل كبير.
في اليوم السابق، جربت عدة أشياء، مثل محاولة قراءة الكود المصدري (لفهم المرحلة ونوع الشرط الذي قد يؤدي إلى استجابة 404 من دمج YouTube)، وصولًا إلى نسخ منتدانا الحالي المنتج إلى قطرة Digital Ocean منفصلة جديدة.
قراءة الكود لم تكن مفيدة حقًا، وذلك بشكل رئيسي بسبب نقص معرفتي الحقيقية بالمنصة.
تبقى سؤال واحد مفتوحًا هنا: هل عملية دمج YouTube تُسجل في مكان ما؟ سيكون ذلك مفيدًا جدًا لفهم الخطأ الذي يجعل دمج YouTube يتخلى عن المحاولة ويعيد استجابة 404.
كانت قطرة النسخ محاولة للتحقق مما إذا كان عنوان IP للخادم المنتج محظورًا من قِبل YouTube، وفي الوقت نفسه ما إذا كان هناك شيء متعلق باسم النطاق الذي نستخدمه.
حسنًا، على الرغم من أن عنوان IP واسم النطاق كانا مختلفين، فإن دمج YouTube لم يعمل.
آمل حقًا أن يتمكن شخص ما من اقتراح طريقة على الأقل لتتبع ما تفعله عملية دمج YouTube.
شكرًا لكم جميعًا على الردود.
غير واضح لي بعدُ لماذا، عندما أحاكي الطلب الذي يقوم به محرك Onebox (أو على الأقل أتوقع أن يكون هذا هو الحال. هل هذا صحيح يا @Falco؟)، أحصل على استجابة JSON بإجابة صحيحة، وليس على خطأ 429.
هل هناك طلب آخر يقوم به Onebox ويتلقى خطأ 429 قبل تنفيذ الطلب كما هو موضح في لقطة الشاشة الخاصة بي، وهو curl 'https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=Xl-PTTeRsik' ؟
من البديهي أن هذه الطلبات قد تم إجراؤها من نفس الخادم الذي يشغّل Discourse (أي نفس عنوان IP الصادر).
عدتُ هنا لإغلاق هذا الموضوع.
أمس أزال يوتيوب الحظر عنا وعُدنا إلى العمل.
هناك نقطتان أعتقد أن من المفيد فهمهما على أي حال:
هل يمكن لـ onebox تسجيل التفاصيل في حال فشل عملية الـ oneboxing؟ سيكون ذلك مفيدًا جدًا لفهم سبب فشلها بالضبط.
بما أن العنصر الوحيد الضروري لعملية الـ oneboxing لفيديوهات يوتيوب هو معرف الفيديو، أليس من الجيد محاولة جلب البيانات من كل أنواع الروابط الثلاثة الثلاثة قبل إرجاع خطأ 404 (وكما ذُكر أعلاه، فإن رابط /embed/ لم يتوقف عن العمل أبدًا بطريقة ما، حتى أثناء الحظر)؟
أعتقد أن جزءًا من التحدي هنا هو أنه إذا أعادت الصفحة المستهدفة صفحة بدون وسوم og، فلن يعرف Onebox أن ذلك كان بسبب إعادة توجيه ما. ومع ذلك، يمكن تسجيل ذلك (“ONEBOX: لم يتم العثور على وسوم og”)، ويجب بالتأكيد تسجيل جميع الأخطاء التي تؤدي إلى ظهور oneboxes فارغة.
tl;dr أود أن أضيف أننا نواجه نفس المشكلة على ما يبدو. إذا كانت هناك مشكلة في حد المعدل (rate-limit) بسبب تغيير حديث، فأعتقد أن مستخدمين آخرين سيبدأون في مواجهتها أثناء الهجرة أو إعادة معالجة المنشورات، أو ربما ببساطة بسبب نشاط مكثف في المنتدى. حقيقة أن “واين بوكس” (onebox) يفشل ظاهريًا بصمت تعني أن هذه المشاكل لا تظهر إلا عندما يبدأ المستخدمون في الشكوى من غياب مربعات يوتيوب.
الخلفية
نحن نستخدم الإصدار 2.6.0.beta 1
كان المستخدمون يتلقون رسائل حول محتوى غير آمن. وعند التحقيق، بدا أن متصفح كروم يشتكي من الصور المرتبطة من مواقع تستخدم بروتوكول HTTP. لذا قمت بضبط Discourse لتحميل جميع الصور والوسائط وتقديمها عبر HTTPS.
بمجرد تغيير الإعداد، تطلب ذلك إعادة معالجة (re-bake) للمنشورات التاريخية. ومنذ تلك المعالجة، تغيرت كثير من مقاطع فيديو يوتيوب التي كانت سابقًا معروضة كـ “واين بوكس” إلى روابط عادية.
لدينا موضوع واحد يحتوي على 10,000 منشور يتكون حصريًا من ردود تحتوي على مقاطع فيديو من يوتيوب، وجميع المنشورات عبارة عن روابط وليست “واين بوكس”.
أثناء إعادة المعالجة، تم تنفيذ جميع الوظائف المجدولة بشكل طبيعي، لذا لا توجد وظائف عالقة في قائمة انتظار للحذف.
لم أرَ رسائل الخطأ نفسها التي وصفها @marcozambi، لكنني أعتقد أننا نتجاوز حد المعدل أيضًا.
ما الذي جربته؟
دعمًا لنظرية حد المعدل، فإن قطعة صغيرة من الكود التي كتبتها لإعادة معالجة المنشورات نجحت (حولت إلى “واين بوكس”) في أول 80+ فيديو من يوتيوب في موضوع ما، ثم فشلت في تحويل الفيديوهات المتبقية.
عند هذه النقطة، حتى عند تعديل المنشور وإجراء تعديل بسيط ثم حفظه مرة أخرى، لم يُجبر الرابط على التوسع كـ “واين بوكس”. وفي الوقت نفسه، كانت جميع قوائم الانتظار فارغة أو تحتوي على وظائف بسيطة تتم معالجتها فورًا كما هو متوقع.
حاولت إعادة تشغيل هذا الكود على مدار 30 دقيقة، لكنه فشل في إجبار الروابط على التحول إلى “واين بوكس”. لا أعتقد أن الرقم 80 سحري هنا، بل هو مجرد ما كان متاحًا من الحصة التي نملكها.
ذكر @marcozambi أن رابط يوتيوب بصيغة /embed/ نجح بينما فشلت الروابط الأخرى، لذا قمت بتعديل الكود لاستخدام بحث واستبدال عبر تعبيرات نمطية (regex) لتحويل روابط يوتيوب إلى صيغة /embed/.
نجح الكود.
إعادة تشغيل الكود لإعادة معالجة المنشورات فقط لم ينجح في تحويلها إلى تمثيلات “واين بوكس”.
خطتي هي تجربة مهمة تحول جميع روابط يوتيوب في الموضوع الكبير إلى صيغة /embed/. إذا فشلت هذه المحاولة أو تجاوزنا حد معدل أعلى، فسألقي نظرة على أداة Onebox Assistant الخاصة بـ @merefield.
حسنًا، هناك بالتأكيد شيء غريب يحدث ويبدو أنه مرتبط بالحد من المعدل (rate-limit).
لا أعرف ما إذا كنا نواجه حدًا في المعدل لأنني قمت بعملية إعادة معالجة (rebake) ضخمة فوقعنا في مشكلة، أو أننا نتجاوز حدودًا قد يراها الآخرون أيضًا.
يبدو أن عملية تضمين مقاطع فيديو YouTube (Oneboxing) لها حد معين، وبمجرد بلوغ هذا الحد، تفشل العملية بصمت دون إشعار.
أعتقد أنه يجب تغيير هذا السلوك لأسباب واضحة على الأرجح، وتحديدًا لأي شخص يقوم بهجرة أو إعادة معالجة (rebake) دون أن يدرك أن العديد من الروابط المضمنة (Oneboxes) التي لم تُوسَّع أو التي وُسِّعت سابقًا أصبحت الآن مجرد روابط نصية عادية.
ذكر @marcozambi أعلاه أن تنسيق عنوان URL الخاص بـ YouTube الذي يحتوي على /embed/ قبل معرف الفيديو يعمل عندما تفشل التنسيقات الأخرى (على الأرجح بسبب مشكلة في الحد من المعدل).
إليك مقطع فيديو يوضح هذه الظاهرة جيدًا.
عندما تم تسجيل هذه اللقطة، لم تكن هناك مهام تسد الطابور، وكان المنتدى يعمل بشكل جيد بشكل عام.
قبل هذا الفيديو، بدأت روابط YouTube بالفعل في الفشل عند محاولة توسيعها بواسطة OneBox.
ستلاحظ نافذة التكوين حيث يفشل OneBox في توسيع رابط YouTube بتنسيق https://youtu.be/<video-id>.
ثم قمت بتغيير التنسيق إلى https://youtube.com/embed/<video-id> فنجح OneBox في توسيعه.
ثم جربت مرة أخرى بالتنسيق الأصلي ففشل.
أثناء تسجيل هذا الفيديو، راقبت تبويبات وحدة تحكم المتصفح وشبكة الاتصال. أدرك أن المشكلة تقع بالتأكيد بين خادمنا وYouTube وليس بين متصفحي وخادمنا، لكنني أدرجها أدناه في حال كانت مفيدة.
(اعتذارات عن طبيعة الصورة المكبرة جدًا - أتمنى أن تكون مرئية عند التكبير)
لستُ مقتنعًا بأن تنسيق الرابط /embed/ هو الحل السحري في هذه الحالة،
أعتقد أنه يبدو كطريق له حدود معدل منفصلة، بحيث عندما يصل مسار https://youtu.be/<video-id> إلى حدّه، يوجد مسار آخر بحد منفصل على مسار https://youtube.com/embed/<video-id>.
والدليل على أن كلا المسارين محدودان يأتي من أداة كتبتها لتغيير تنسيق تضمينات يوتيوب في موضوع ضخم يحتوي على 10 آلاف منشور، حيث كانت 99% من الردود عبارة عن مقاطع فيديو من يوتيوب.
في هذه المرحلة، كان Onebox يفشل بالفعل في توسيع الروابط بتنسيق https://youtu.be/<video-id>.
أداتي، التي غيّرت عنوان فيديو يوتيوب إلى تنسيق https://youtube.com/embed/<video-id>، تم تشغيلها على أول 3000 منشور في الموضوع.
عملت بشكل جيد مع أول 1108 منشور، ثم، بينما غيّرت التنسيق للمنشورات الـ 1900 التالية تقريبًا، لم تقم Onebox بتوسيعها.
خلال هذا الوقت، تم إنشاء العديد من الوظائف (استخدمت كودي post.revise) وتمت معالجتها جميعًا دون أخطاء أو إعادة محاولات.
من الناحية الخبرية، لاحظت أن معالجة الوظائف تسارعت بشكل ملحوظ في مرحلة معينة. أفترض أن هذا قد يكون لأن كود Onebox كان يحصل بسرعة على نوع من الأخطاء من يوتيوب - لكنني لم أقيس الوقت وقد يكون هناك أسباب أخرى عديدة.
أود أن أكون مستعدًا لتقديم أدلة أكثر تفصيلاً هنا، لكنني لست متأكدًا مما يمكنني فعله دون توظيف أدوات تتبع في مكتبة Onebox gem.
أنا هاكر وليس خبيرًا في Ruby، لكنني سأكون سعيدًا جدًا بمحاولة اتباع بعض التعليمات عالية المستوى.