نحن بصدد الانتهاء من محطة ياندكس لمشاهدة يوتيوب

على Yandex.Stations ، من غير المناسب مشاهدة YouTube. لا توجد توصيات ، والاشتراكات ، وحتى البحث لا يعمل بشكل طبيعي. لذلك ، كتبت برقية إلى الروبوت لإرسال أي فيديو إليها.



تحت القص ، القصة هي كيف فعلت ذلك على الرغم من حقيقة أنه لا يوجد واجهة برمجة تطبيقات مفتوحة رسمية .

كيف بدأ كل شيء؟


أنا مهندس. أنا أدرس باستمرار كيف تعمل التقنيات والأشياء المختلفة حولها ، وكذلك أقوم بالكثير من المشاريع المثيرة للاهتمام بنفسي. عندما أعطاني أصدقائي Yandex.Station ، عكست بروتوكول التنشيط وقمت بتطوير فكرة نقل البيانات الموجهة نحو التأثير المبهر.

لدي تلفزيون غبي (غير ذكي) ، ولكني أستخدم المحطة الرئيسية للوسائط. كل شيء على ما يرام ، لكن مجرد مشاهدة YouTube غير مريح تمامًا. لا يمكنك تسجيل الدخول إلى حسابك على YouTube ، مما يعني أنه لا توجد توصيات واشتراكات. بالإضافة إلى ذلك ، يتم البحث عن الفيديو في المحطة ، كما أفهمها ، من خلال Yandex.Video. لسوء الحظ ، فإن مثل هذا المخطط لا يعمل بشكل جيد للغاية. في بعض الأحيان ، لا توجد مقاطع فيديو حتى إذا نطقت الاسم حرفيًا ، ولا يمكن مشاهدة مقاطع الفيديو الجديدة على الإطلاق حتى يفهرسها محرك بحث Yandex.

توصلت إلى اتفاق مع حقيقة أنه لا يمكنك مشاهدة YouTube على المحطة ، لكن كل ذلك تغير قبل أسبوعين.

ماذا حدث؟


في صباح يوم السبت ، قررت مشاهدة الموسم الأخير من وادي السيليكون. ذهبت إلى Kinopoisk ورأيت ما يلي:


بعد النقر على الزر ، انتقل الفيديو إلى Yandex.Station وتم تشغيله هناك. تماما مثل ChromeCast أو AirPlay. فرحة! لكنني كنت سعيدًا ليس بالأداء الوظيفي نفسه ، ولكن مع الفرصة المحتملة لإرسال أي فيديو إلى المحطة.

لقد نسيت أن أفكر في هذه السلسلة - طوال عطلة نهاية الأسبوع ذهبت إلى الهندسة العكسية والتنمية.

هيا بنا


نفتح Kinopoisk أو Yandex.Video في Chrome - هناك أدوات ممتازة لتطوير الويب. ابحث عن الزر المطلوب ، وانقر بزر الماوس الأيمن ، وحدد "استكشف العنصر".


هناك الكثير الذي يمكن تعلمه هناك ، لكننا مهتمون بما يتم تنفيذه عند النقر على هذا الزر. نذهب إلى علامة التبويب "الشبكة" الخاصة بأدوات المطورين وننظر في الطلبات.


نعم ، الكثير من الإحصاءات تنطلق ، ولكن هناك طلبان مثيران للعيان يظهران على الفور. هذه هي devices_online_stats والمحطة.

الحصول على قائمة الأجهزة


devices_online_stats - اطلب أجهزة مستخدم نشط. الحصول على طلب بسيط. إذا كنت مخولًا في Yandex ، فيمكنك التعرف على أجهزتك ببساطة عن طريق فتح الرابط في متصفح:

quasar.yandex.ru/devices_online_stats

ما في الجواب:

{ "items":[ { "icon":"https://avatars.mds.yandex.net/get-yandex-station/1540981/yandexstationicon/orig", "id":"************", "name":" ", "online":true, "platform":"yandexstation", "screen_capable":true, "screen_present":true } ], "status":"ok" } 

مثيرة للاهتمام وبديهية للغاية. لقد استبدلت معرف المحطة في المثال بعلامات نجمية فقط في حالة حدوث ذلك ، ولكننا سنحتاج إليها في المستقبل.

تشغيل الفيديو


يتم إرسال طلب إلى yandex.ru/video/station باستخدام طريقة POST. كرر ذلك من وحدة التحكم ، مع تلقي الأمر على النحو التالي:


ركض في المحطة واحصل على الجواب:

 { "status": "play", "msg": "success", "code": 1 } 

بعد بضع ثوانٍ ، يبدأ الفيديو في المحطة. النجاح!

نحن نجمع


أزلت جميع الحقول "الإضافية" من الطلب بحيث يظل قيد التشغيل. لإرسال فيديو إلى المحطة في الجسم ورؤوس طلب POST ، تحتاج إلى وضع 4 معلمات فقط:

  • SessionID - إذن في ياندكس
  • س CSRF-رمزية
  • provider_item_id - رابط إلى الفيديو (أو المعرف لبعض الخدمات)
  • الجهاز - معرف الجهاز الذي تلقيناه مسبقًا

ما هو الرمز المميز لـ x-csrf؟ لن نتعمق الآن. يمكن الحصول عليها ببساطة عن طريق طلب GET إلى frontend.vh.yandex.ru/csrf_token إذا كنت مخولًا في Yandex.

في هذه المرحلة ، كنت قد بدأت بالفعل في لف كل شيء بنص بيثون. نتيجة لذلك ، تبدو وظيفة إرسال الفيديو إلى المحطة كما يلي:

 def sendToScreen(video_url): # Auth and getting Session_id auth_data = { 'login': config.login, 'passwd': config.password } s = requests.Session() s.get("https://passport.yandex.ru/") s.post("https://passport.yandex.ru/passport?mode=auth&retpath=https://yandex.ru", data=auth_data) Session_id = s.cookies["Session_id"] # Getting x-csrf-token token = s.get('https://frontend.vh.yandex.ru/csrf_token').text # Getting devices info TODO: device selection here devices_online_stats = s.get("https://quasar.yandex.ru/devices_online_stats").text devices = json.loads(devices_online_stats)["items"] # Preparing request headers = { "x-csrf-token": token, } data = { "msg": { "provider_item_id": video_url }, "device": devices[0]["id"] } if "https://www.youtube" in video_url: data["msg"]["player_id"] = "youtube" # Sending command with video to device res = s.post("https://yandex.ru/video/station", data=json.dumps(data), headers=headers) return res.text 

ربما لاحظت أنني أضفت الحقل player_id إذا تم إرسال رابط من YouTube. الحقيقة هي أن هناك العديد من اللاعبين على المحطة مع رموز youtube و vh و ot. بشكل افتراضي ، يتم استخدام vh ، ولكن بعد ذلك ، يتم قطع معاينة وعنوان الفيديو. بالإضافة إلى ذلك ، لا تتم إعادة ضبط حالته عندما يتم تغيير الفيلم ، مما يؤدي في كثير من الأحيان إلى أخطاء (ربما ، لم تكن جميع الحقول في الطلب "زائدة عن الحاجة"). يتم استخدام المشغل ot ، كما أفهمه ، لخدمات البث ، مما يعني أنه في المستقبل يمكنك مشاهدة IPTV عبر المحطة.

ما هي النتيجة؟


لدي الآن روبوت يمكننا من خلاله إرسال الفيديو من YouTube إلى المحطة. فقط انقر فوق "مشاركة" في تطبيق YouTube وأرسل الرابط إلى Bot. بالمناسبة ، أنا أطلق عليها "صندوق" وجعلت شعار).


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

كنت أرغب في جعل امتداد المتصفح يعمل تمامًا مثل AirPlay مع أي فيديو ، لكنني أدركت أنه من الأسهل إرساله من التطبيق من الهاتف. وبالنسبة لهذا السيناريو ، فإن الروبوت هو الأنسب. هنا شريط فيديو عن عمله:


استنتاج


عندما يفتقر المهندس إلى الوظيفة ، فإنه يكملها بنفسه. الآن نحن حقا استخدام هذا الروبوت بانتظام - مريحة للغاية :)

مطوري ياندكس ، يرجى عدم كسر هذا الطلب. هذه ليست ثغرة أمنية. يعمل فقط مع المصادقة. وإذا كنت تستطيع - جعل واجهة برمجة تطبيقات الجهاز عامة - فيمكن فعل الكثير!

شكرا لقراءة مقالاتي! آمل أن تكونوا مهتمين.

حظا سعيدا

Source: https://habr.com/ru/post/ar479242/


All Articles