مقدمة
عني
مرحباً بالجميع ، أنا طالب عادي في تخصص "فني برمجيات". منذ طفولتي ، كنت مولعا بأجهزة الكمبيوتر ، ومنذ الصف السابع بدأت أتعلم البرمجة نفسها. لقد كنت صاحب اشتراك في Yandex Music منذ أكثر من عام وأنا راضٍ بشكل عام عن الخدمة (رغم أن هناك الآن تكرار مستمر في قائمة التشغيل اليوم).
قبل التاريخ
لا أتذكر بالضبط السبب في أنني قررت البحث عن وثائق API الرسمية لهذه الخدمة ، مثل الروبوت الذي أردت كتابته في Telegram ، لكنني صادفت حقيقة أنه لم يكن ... بعد مضي بعض الوقت ، صادفت مشكلة في مستودع yandex / audio-js . هناك ، يسأل الرجال نفس السؤال الذي طرحته بالضبط: "أين واجهة برمجة التطبيقات؟" ليس الكثير من الناس حريصون على الاستماع إلى الموسيقى من خلال متصفح ، فهم يريدون تطبيقًا ، لكن لا يوجد تطبيق Linux أيضًا! دمج لاعبك المفضل أمر مستحيل!
ثم حصلت على فكرة للقيام بذلك. بطبيعة الحال ، أحتاج إلى العمل بطريقة أو بأخرى مع الخدمة ، وجعل العكازات حول تطبيق ويب ليس خيارًا. لقد فهمت أن وجود مثل هذه الخدمة ، والتطبيقات النقالة والتطبيقات الخاصة بنظام Windows (من متجر Microsoft) ، من المستحيل بكل بساطة ألا يكون لديك واجهة برمجة تطبيقات داخلية للتفاعل. كنت على حق!
قراءة إلزامية قبل الجسم الرئيسي
أدرك أنه من خلال دراسة واجهة برمجة التطبيقات غير العامة الخاصة بهم ، أتعرف على الأشياء القذرة الخاصة بالأشخاص الآخرين. فيما يلي وصف للقضايا المختلفة المثيرة للجدل ، وقرارات المطورين ، وبشكل عام ، كيف كتبوها وكيف يستخدمونها. لقد صدمت للتو في بعض الأماكن ، لكنني متأكد من أنهم إذا فعلوا ذلك ، فهناك أسباب لذلك ! دعونا لا ننسى أنه لا ينبغي لأحد أن يرى هذا. أريد أيضًا أن أقول إن كل شيء مكتوب أدناه هو رأيي . يمكنك أن تتفق معه أم لا.
الجسم الرئيسي
تدريب
API تطبيق ويب
أعلاه ، لقد كتبت بالفعل أنني وجدت واجهة برمجة التطبيقات. لم يكن الأمر صعباً على الإطلاق. بادئ ذي بدء ، نظرت إلى تطبيق الويب الخاص بهم ، ونقطة النهاية الخاصة بهم في وقت كتابة هذا التقرير هنا: https://music.yandex.ru/api/v2.1/
. لديهم عناوين URL طويلة بما فيه الكفاية أشارك فيها في البيانات ، كما يرسلون النموذج. كما أطلب منك الانتباه إلى الإشارة إلى إصدار API ، هو عليه.
يجب أن تفهم أن ما وجدته لا يستخدمه إلا في تطبيق ويب. لا يوجد شيء. بتعبير أدق ، من الأرجح وجودها ، ولكن هناك ، في أحشاء جلستنا على الموقع. بشكل عام ، ليست المكتبة مناسبة فيما يتعلق بالعكازات في التفويض.
API التطبيق
انطلقت للبحث أكثر. كنت كسولًا جدًا لأخذ الهاتف ، لذلك ، سأستفيد من تطبيقات الهاتف المحمول. في ذلك الوقت ، كان الكمبيوتر يعمل بنظام Windows 10 ، واستخدمت بنشاط تطبيق Yandex Music الرسمي من متجر Microsoft . نتيجة لذلك ، بدأت في دراسة كيفية عمله.
للبحث ، كنت بحاجة إلى متتبع الشم لتتبع كل حركة مرور التطبيقات. يمكنك استخدام Wireshark ، لكنني استقرت على محلل HTTP . يبدو لي أكثر خفيفة الوزن ومناسبة تماما لمهمتي.
قم بتشغيل الشم ، وانتقل إلى التطبيق وانتهيت. طلبات التدفق عن طريق تيار. نحن نجلس ونفهم ونحاول الاتصال بكل معالج موجود في هذا التطبيق ونتعرف على جميع الطرق الحالية ، وسيطاتهم ، وبالطبع إجابات JSON .

من لقطة الشاشة أعلاه ، يمكنك ملاحظة عنوان API مختلف تمامًا على الفور - api.music.yandex.net
. علاوة على ذلك ، انتبه إلى العناوين. بالإضافة إلى معلومات حول موكلي الذي تم تقديم الطلب منه ، يوجد رمز OAuth - هذا ما تحتاجه!
تعلم API
أجريت الدراسة بالاقتران مع رمز الكتابة. لقد كتبت فئات مجمعة لكائنات الخدمة المستلمة من واجهة برمجة التطبيقات ، وقمت بتنفيذ طلبات الإرسال ، وقمت بتصنيف المعلمات ، وفي بعض الأماكن خمنت معنى هذا الاسم. في هذه المرحلة ، قابلت أشياء مختلفة لم أتوقع رؤيتها هنا.
في وقت كتابة هذا التقرير ، كانت المكتبة تحتوي على 83 فصلًا ، وبعضها فقط مساعد. الباقي هي فصول ياندكس للموسيقى ، مما يدل على حجم هذه الخدمة ومستوى التجريد.
إرسال ~ 47 تم تنفيذ الطرق . وهذا ليس كل ما هو موجود في API (المزيد حول ذلك أدناه).
ألم
في البداية ، حاولت عدم الانتباه ، لقد فوجئت ببساطة ، لأن هذا هو ياندكس ، كيف يمكن أن يكون هذا. ولكن بعد ذلك ، في لحظة واحدة جيدة ، قصف كل شيء. سأبدأ ، ربما ، معه.
كائنين بمستويات مختلفة من مرفق المجال

الكائن نفسه هو مجرد "مرجع" لنفسه. إلى نسخته الكاملة. عند طلب قائمة المقطوعات الموسيقية ، يتم منحنا هويتهم ، والتي يمكننا من خلالها الحصول على معلومات أكثر تفصيلاً. الممارسة الجيدة ، كثير منها ، لكنها لا تحترم دائمًا (الفقرة 9).

بعد أن نفذت الفصل لهذا الكائن في البداية ، اعتقدت أنني سوف أستخدمه في كل مكان ، ولكن بغض النظر عن الكيفية! يبدو لي أن التعليقات لا لزوم لها ويمكن رؤية كل شيء في لقطات الشاشة.
لم أقوم بإصلاح هذا النوع من العضادات في مكتبتي ، لذلك أصبح لدى TrackShortOld
class الآن TrackShortOld
.
بالمناسبة ، كلا هذين الكائنين يعيشان بنفس الطريقة ، في طريقة الهبوط .
إصدارات API ، الطرق
لم أطلب منك فقط الانتباه إلى كيفية تحديد الإصدار في واجهة برمجة التطبيقات لتطبيق الويب. بشكل عام ، كيف نشير عادة إلى إصدار؟ ربما بإحدى الطرق التالية:
- جعل الإصدار على مجال فرعي منفصل ؛
- ضع الإصدار في جزء الطلب ؛
- تمرير الإصدار المطلوب من معلمة API إلى الطلب.
قررت ياندكس في هذه الحالة أن تفعل خلاف ذلك. لدينا طريقة الهبوط - نسخته الحالية في وقت كتابة هذا التقرير. لكن لا أحد يمنع إرسال طلب للهبوط 2 - هيكل مختلف تمامًا ، أشياء أخرى.
لقد اكتشفت ذلك عن طريق الصدفة ، فقط نسيت أن أضيف رقمًا إلى نهاية اسم الطريقة واكتشفت مجموعة من الاستثناءات.
العمل مع الجديد ، لا تستسلم على القديم
رأيت هذا عندما كتبت أساليب إرسال "أعجبني" لجميع الكائنات الموجودة. في الواقع ليس هناك الكثير منهم (قائمة التشغيل ، الفنان ، المسار ، الألبوم). ما كان مفاجأة لي عندما رأيت أساليب مختلفة لنفس الإجراء.
نحن نحب الفنانين مثل هذا: https://api.music.yandex.net/users/<USER_ID>/likes/artists/add
ونقل artist-id
في النموذج.
نحن نحب مسارات مثل هذه: https://api.music.yandex.net/users/<USER_ID>/likes/tracks/add-multiple
وفي شكل track-ids
.
إذا لم تكن قد لاحظت ، فعندما تحب المسار ، يتم استخدام طريقة الوظيفة الإضافية ، وليس الوظيفة الإضافية . لا يتم استخدام هذه الطريقة مع أي أنواع أخرى ، لكنها جميعًا موجودة (الأمر يستحق مجرد محاولة إرسال طلب)! وقمت بتنفيذها في مكتبتي بدلاً من الإضافة . بعد كل شيء ، هذه الطريقة عالمية. يمكنك إضافة مسار واحد أو عدة.
ما هو معرف المسار الفريد
لقد مر الكثير من الوقت ، لكنني ما زلت لا أفهم متى أرسل id
المسار فقط ، ومتى يتم ربط المعرّف و album_id عبر نقطتين ( id:album_id
). في بعض الأحيان يكون المسار في عدة ألبومات ، وفي بعض الأحيان لا يوجد ألبوم. في الحالات الغامضة التي تبدو من الجانب ، لا أعرف كيف يتعاملون مع هذا (أو لا يمكنهم فعل ذلك ، البغي 2).
العديد من المجالات اختياري
لقد حصلت على اثنين من القضايا. إذا كانت هناك مشكلة ، فهذا يرتبط بالحقل المطلوب. لا أتوقف أبدًا عن دهشتي من أن الحقول المطلوبة ، ببساطة ، لا تُرجع واجهة برمجة التطبيقات.
- album_id للفئة TrackID و TrackShort ؛
- order_id للفئة AutoRenewable (اشتراك) ؛
- next_revision في الخلاصة ؛
- cover_uri في المسار ؛
- عيد ميلاد في الحساب ؛
- العلامات في قائمة التشغيل.
تطول القائمة ، لكن كل شيء في تاريخ التعهدات. ربما يتم امتصاص هذا العنصر من الإصبع.
طرق التشابه باستثناء بعض الحقول في الجواب
استجابة لحالة الحساب ( api.music.yandex.net/account/status
):

حالة حساب الرد اللاسلكي ( https://api.music.yandex.net/rotor/account/status
):

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

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

بالإضافة إلى معرف قائمة التشغيل والإطارات التي تريد حذفها والمسار الذي تتبعه ، فإنها لسبب ما تنقل المسارات المراد حذفها إلى طريقة حذف المسارات من قائمة التشغيل. من الممكن أنني لم أفهم هذا ، مثل كل شيء آخر ، لكن الطريقة تعمل بدون الكثير من المعلومات. وما المسارات التي تم حذفها ، من الأفضل معرفة ذلك من الخلف ، بدلاً من المرور بالمعلمة.
طلبات ثقيلة جدا
لقد كتبت أعلاه أن إعطاء قائمة بمُعرّفات المسارات هو ممارسة جيدة ، حيث تحصل على معلومات مفصلة حول مسار فقط عندما تحتاج إليه حقًا. هذا لا يستخدم دائما هنا.
ألقِ نظرة على كيفية تقديم معلومات مفصلة عن جميع مساراتي بلا رحمة من قائمة التشغيل "أعجبني" في طلب واحد:

أعطى كل 396 المسارات ! بايت المتلقاة: 3.75M ، وهذا هو آخر تنزيل الغطاء!
Bagusiki
تنزيل جميع المسارات إلى ذاكرة التخزين المؤقت من "أعجبني"
عندما تم الوصول إلى الحد الأقصى ، تمت إضافة إلى النهاية وإزالتها من البداية. شكرًا لتصور قائمة الانتظار ، لكنني اعتقدت أنني سأقوم فقط بتنزيل أحدث 100 أغنية من قائمة التشغيل. حدث هذا في برنامج العميل المحمول لنظام Android ( شاهد الفيديو ).
يبدو أنني لست مرتبكًا عندما أحتاج إلى إرسال معرف ، ولكن عندما id: album_id

تصريحات
عدد محاولات تفعيل رمز الهدية هو 10. الحظر التالي لمدة 24 ساعة.
بناءً على التطبيق الذي تجلس منه ، تُقدم لك عروض مختلفة لشراء اشتراك.
يعد الحد الأقصى لعدد المسارات في ذاكرة التخزين المؤقت مجرد وهم ، إنه مجرد رقم ، ولا يسمح لك التطبيق بتحميل المزيد (bagus 2).
تأتي كل قوائم التشغيل والاقتراحات والألوان النصية والأزرار الذكية من واجهة برمجة التطبيقات - ومن هنا ، RESTFull الحقيقي.
يتم إرجاع وقت بدء الإعلان والإعلان نفسه حتى إذا كان لديك اشتراك.
يستمر ارتباط XML الذي يحتوي على بيانات حول موقع الملف الذي سيتم تنزيله دقيقة واحدة ، ثم خطأ 410.
استنتاج
كتبت فقط ما تذكرت. بعد كل شيء ، صادفت كل هذا لعدة أشهر. كل ملاحظاتي هي رسائل في برقية ، لأنه عندما صادفت شيئًا كهذا ، شاركت مع الأصدقاء. حاولت استعادة النقاط الرئيسية.
لم أكن أريد بأي حال من الأحوال أن أقول كم كان كل شيء سيئًا ، بطريقة ما أن أعرض عضادات الجمهور بشكل خاص. ربما هذه ليست دعامة على الإطلاق ، لكن كل ما كتبته أعلاه يبدو غريباً بالنسبة لي شخصياً .
شارك معك كيف كتب مكتبة واجهة برمجة تطبيقات خدمة Yandex.Music الخاصة وما الأشياء التي واجهها أثناء التطوير.
أنت تعرف الآن كيف وماذا يعمل تطبيق Windows الخاص بهم ، وبالتالي مكتبتي.
بالمناسبة ، أحاول الآن توثيق كل ذلك ، عند توثيق مكتبتي ، أقوم بتوثيق API تلقائيًا. إنها ضيقة ، ولا أزال أحتاج إلى وقت لإيجاد شركة لممارسة الممارسات التكنولوجية الصناعية.
شكرا لقراءتك هنا!