Einführung
Über mich
Hallo allerseits, ich bin ein gewöhnlicher Student in der Spezialität "Software-Techniker". Seit meiner Kindheit habe ich Computer geliebt, seit der 7. Klasse begann ich, selbst Programmieren zu lernen. Ich bin seit mehr als einem Jahr Inhaber eines Abonnements für Yandex Music und bin im Allgemeinen mit dem Service zufrieden (obwohl die Wiedergabeliste des Tages jetzt ständig wiederholt wird).
Hintergrund
Ich kann mich nicht genau erinnern, warum ich mich entschlossen habe, nach der offiziellen API-Dokumentation für diesen Dienst zu suchen, wie einem Bot, den ich für Telegram schreiben wollte, aber ich bin auf die Tatsache gestoßen , dass dies nicht der Fall war ... Nach einiger Zeit bin ich auf ein Problem im yandex / audio-js- Repository gestoßen . Dort stellen die Jungs genau die gleiche Frage wie ich: "Wo ist die API?" Nicht viele Leute wollen Musik über einen Browser hören, sie wollen eine Anwendung, aber es gibt auch keine Linux-Anwendung! Die Integration in Ihren Lieblingsspieler ist unmöglich!
Dann kam mir die Idee dazu. Natürlich muss ich irgendwie mit dem Dienst arbeiten, Krücken um eine Webanwendung zu machen ist keine Option. Ich habe verstanden, dass es mit einem solchen Dienst, mobilen und Windows-Anwendungen (aus dem Microsoft Store) einfach unmöglich ist, keine eigene interne API für die Interaktion zu haben. Ich hatte recht!
Obligatorische Lektüre vor dem Hauptteil
Mir ist bewusst, dass ich durch das Studium ihrer nicht öffentlichen API die schmutzigen Dinge anderer Leute durchsuche. Im Folgenden werden verschiedene kontroverse Themen, Entscheidungen von Entwicklern und allgemein beschrieben, wie sie es geschrieben haben und wie sie es verwenden. An einigen Stellen war ich nur schockiert , aber ich bin mir sicher, dass es Gründe dafür gab, wenn sie es taten! Vergessen wir nicht, dass niemand dies hätte sehen sollen. Ich möchte auch sagen, dass alles, was unten geschrieben steht, meine Meinung ist . Sie können ihm zustimmen oder nicht.
Hauptteil
Vorbereitung
Webanwendungs-API
Oben habe ich bereits geschrieben, dass ich die API gefunden habe. Es war überhaupt nicht schwierig. Zuerst habe ich mir ihre Webanwendung angesehen, ihr Endpunkt zum Zeitpunkt des Schreibens ist hier: https://music.yandex.ru/api/v2.1/
. Sie haben ausreichend lange URLs, in denen ich an den Daten teilnehme, und sie senden auch das Formular. Ich bitte Sie auch, darauf zu achten, welche Version der API vorhanden ist .
Sie müssen verstehen, dass das, was ich gefunden habe, von ihnen nur in einer Webanwendung verwendet wird. Es gibt keine OAuth. Genauer gesagt ist es wahrscheinlicher, dass es existiert, aber dort, in den Eingeweiden unserer Sitzung auf der Website. Im Allgemeinen ist die Bibliothek nicht in Verbindung mit Krücken in der Autorisierung geeignet.
Anwendungs-API
Ich machte mich auf die Suche. Ich war zu faul, um das Telefon zu nehmen, daher würde ich zuletzt zu mobilen Anwendungen gelangen. Zu diesem Zeitpunkt lief auf dem Computer Windows 10, und ich habe die offizielle Yandex Music- Anwendung aus dem Microsoft Store aktiv verwendet. Infolgedessen begann ich zu untersuchen, wie es funktioniert.
Für die Recherche brauchte ich einen Sniffer, um den gesamten Anwendungsverkehr zu verfolgen. Sie könnten Wireshark verwenden , aber ich habe mich für HTTP Analyzer entschieden . Es scheint mir leichter und perfekt für meine Aufgabe geeignet.
Schalten Sie den Schnüffler ein, gehen Sie zur Anwendung und Sie sind fertig. Anfragen fließen per Stream. Wir sitzen, verstehen, versuchen, jeden Handler in dieser Anwendung aufzurufen und informieren uns über alle vorhandenen Methoden, ihre Argumente und natürlich über JSON-Antworten .

Aus dem obigen Screenshot können Sie sofort eine völlig andere API-Adresse erkennen - api.music.yandex.net
. Beachten Sie außerdem die Überschriften. Zusätzlich zu den Informationen über meinen Kunden, von dem die Anfrage gestellt wurde, gibt es ein OAuth-Token - genau das benötigen Sie!
Lern-API
Die Studie fand in Verbindung mit dem Schreiben von Code statt. Ich habe Wrapper-Klassen für Service-Objekte geschrieben, die von der API empfangen wurden, Sendeanforderungen implementiert, die Parameter sortiert und an einigen Stellen nur erraten, was dieser Name bedeuten könnte. Zu diesem Zeitpunkt traf ich verschiedene Dinge, die ich hier nicht erwartet hatte.
Zum Zeitpunkt des Schreibens enthält die Bibliothek 83 Klassen, von denen nur einige Hilfsklassen sind. Der Rest sind Yandex Music-Klassen, die den Umfang dieses Dienstes und den Grad der Abstraktionen angeben.
Das Senden von ~ 47 Methoden wurde implementiert. Und das ist nicht alles, was in der API enthalten ist (mehr dazu weiter unten).
Schmerz
Zuerst habe ich versucht, nicht aufzupassen, ich war einfach überrascht, denn das ist Yandex , wie kann das sein. Aber dann, in einem schönen Moment, wurde alles bombardiert. Ich werde vielleicht mit ihm anfangen.
Zwei Objekte mit unterschiedlichen Ebenen der Feldbefestigung

Das Objekt selbst ist lediglich eine "Referenz" auf sich selbst. In seiner Vollversion. Wenn wir eine Liste von Tracks anfordern, erhalten wir deren ID, anhand derer wir detailliertere Informationen erhalten können. Gute Praxis, viele tun es, aber es wird nicht immer respektiert (Absatz 9).

Nachdem ich die Klasse für dieses Objekt am Anfang implementiert hatte, dachte ich, dass ich sie überall verwenden würde, aber egal wie! Es scheint mir, dass Kommentare überflüssig sind und alles in den Screenshots zu sehen ist.
Ich habe diese Art von Pfosten in meiner Bibliothek nicht TrackShort
, daher verfügt die TrackShort
Klasse jetzt über TrackShortOld
.
Übrigens leben beide Objekte in derselben Methode, in der Landing'a- Methode.
API-Versionen, Methoden
Ich habe Sie nicht nur gebeten, darauf zu achten, wie die Version in der API für die Webanwendung angegeben ist. Wie geben wir normalerweise eine Version an? Wahrscheinlich auf eine der folgenden Arten:
- Erstellen Sie die Version in einer separaten Subdomain.
- Fügen Sie die Version in den Anforderungsteil ein.
- Übergeben Sie die gewünschte Version des API-Parameters an die Anforderung.
Yandex hat in diesem Fall beschlossen, etwas anderes zu tun. Wir haben eine Landing3- Methode - die aktuelle Version zum Zeitpunkt des Schreibens. Aber niemand verbietet es, eine Anfrage für die Landung zu senden2 - eine völlig andere Struktur, andere Objekte.
Ich habe das ganz zufällig entdeckt, nur vergessen, am Ende des Methodennamens eine Zahl einzufügen und eine Reihe von Ausnahmen abzufangen.
Wenn Sie mit dem Neuen arbeiten, geben Sie das Alte nicht auf
Ich habe dies gesehen, als ich Sendemethoden "Like" für alle Objekte geschrieben habe, die es sind. Es gibt tatsächlich nicht viele von ihnen (Wiedergabeliste, Künstler, Titel, Album). Was war meine Überraschung, als ich unterschiedliche Ansätze für dieselbe Aktion sah.
Wir mögen Künstler wie diesen: https://api.music.yandex.net/users/<USER_ID>/likes/artists/add
und übertragen die artist-id
in das Formular.
Wir mögen Tracks wie diesen: https://api.music.yandex.net/users/<USER_ID>/likes/tracks/add-multiple
und in Form von track-ids
.
Wenn Sie es nicht bemerkt haben, wird, wenn Ihnen der Track gefällt, die Add-Multiple- Methode verwendet, nicht Add . Diese Methode wird bei keinem anderen Typ verwendet, aber es gibt alle (es hat sich gelohnt, nur eine Anfrage zu senden)! Und ich habe sie in meiner Bibliothek implementiert, anstatt sie hinzuzufügen . Immerhin ist diese Methode universell. Sie können entweder eine Spur oder mehrere hinzufügen.
Was ist eine eindeutige Spurkennung?
Es ist viel Zeit vergangen, aber ich verstehe immer noch nicht, wann nur die id
Titels gesendet werden soll und wann die ID und die Album-ID über einen Doppelpunkt ( id:album_id
) verkettet werden. Manchmal ist ein Titel in mehreren Alben enthalten, manchmal gibt es kein Album. Zu dunkle Fälle, die von der Seite betrachtet werden, ich weiß nicht, wie sie damit umgehen (oder können es nicht, Bagus 2).
Optional viele Felder
Ich habe ein paar Probleme. Wenn es ein Problem gibt, hängt es mit dem erforderlichen Feld zusammen. Ich bin immer wieder überrascht, dass meiner Meinung nach erforderliche Felder die API einfach nicht zurückgeben.
- album_id der Klassen TrackID und TrackShort;
- order_id der Klasse AutoRenewable (Abonnement);
- next_revision in Feed;
- cover_uri in Track;
- Geburtstag auf dem Konto;
- Tags in der Wiedergabeliste.
Die Liste geht weiter, aber alles ist in der Geschichte der Commits. Vielleicht wird dieser Gegenstand aus dem Finger gesaugt.
Ähnlichkeitsmethoden mit Ausnahme einiger Felder in der Antwort
Antwort auf den api.music.yandex.net/account/status
( api.music.yandex.net/account/status
):

Status des https://api.music.yandex.net/rotor/account/status
( https://api.music.yandex.net/rotor/account/status
):

Ich verstehe, dass die Rechte unterschiedlich sind. Die Felder beschränken sich jetzt nicht mehr auf die Anzahl der Spuren im Cache, sondern auf die Anzahl der Sprünge pro Stunde, aber es sieht eher nach einer Art Duplizierung aus.
Ich weiß nicht wie in Yandex, aber ich habe es zu einer Klasse zusammengefasst.
Also einer oder viele?
Ich habe immer gedacht, dass, wenn eine Methode eine Liste zurückgibt, selbst wenn das Ergebnis ein Element ist, die Liste, die dieses Element enthält, zurückgegeben wird und nichts anderes, als hier und dann und mehr.

Diese Funktion wird zurückgegeben, dann Funktionen , dann Funktion und Funktionen .
Missbrauch von Methoden
Oben habe ich geschrieben, dass sie die eine oder andere Methode verwenden, um eine Aktion auszuführen. Sie gingen weiter.

Zusätzlich zur Wiedergabelisten- ID und den Frames mit und nach dem zu löschenden Titel übertragen sie aus irgendeinem Grund zu löschende Titel auf die Methode zum Löschen von Titeln aus der Wiedergabeliste. Es ist möglich, dass ich das nicht verstanden habe, wie alles andere auch, aber die Methode funktioniert ohne zu viele Informationen. Und welche Tracks gelöscht wurden, ist besser auf der Rückseite herauszufinden, als Parameter zu übergeben.
Sehr schwere Anfragen
Ich habe oben geschrieben, dass es eine gute Praxis ist, eine Liste mit Titel-IDs zu erstellen. Sie erhalten detaillierte Informationen zu einem Titel nur dann, wenn Sie ihn wirklich benötigen. Dies wird hier nicht immer verwendet.
Schauen Sie sich an, wie gnadenlos sie detaillierte Informationen zu allen meinen Titeln aus der Wiedergabeliste "Gefällt mir" in einer Anfrage geben:

Es gab alle 396 Tracks ! Erhaltene Bytes: 3,75 Millionen , und dies ist ein weiterer Cover-Download!
Baguettes
Laden Sie alle Titel von "Gefällt mir" in den Cache herunter.
Als das Limit erreicht war, wurde am Ende eine Addition vorgenommen und von Anfang an entfernt. Vielen Dank für die Visualisierung der Warteschlange, aber ich dachte, ich würde nur die letzten 100 Titel von der Wiedergabeliste herunterladen. Dies geschah im mobilen Client für Android ( Video ansehen ).
Sieht so aus, als wäre ich nicht verwirrt, wenn ich eine ID senden muss, sondern wenn id: album_id

Anmerkungen
Die Anzahl der Versuche, den Geschenkcode zu aktivieren, beträgt 10. Nächstes Verbot für 24 Stunden.
Abhängig von der Anwendung, in der Sie sitzen, werden Ihnen verschiedene Angebote zum Kauf eines Abonnements gemacht.
Die Begrenzung der Anzahl der Titel im Cache ist eine Illusion, es ist nur eine Zahl, und die Anwendung erlaubt Ihnen nicht, mehr zu laden (Bagus 2).
Alle diese cleveren Wiedergabelisten, Vorschläge, Text- und Schaltflächenfarben stammen aus der API - hier ist es, echtes RESTFull.
Die Startzeit der Anzeige und der Anzeige selbst wird zurückgegeben, auch wenn Sie ein Abonnement haben.
Ein Link zu XML mit Daten zum Speicherort der herunterzuladenden Datei dauert 1 Minute, dann ein 410-Fehler.
Fazit
Ich schrieb nur das, woran ich mich erinnerte. Immerhin bin ich einige Monate lang auf all das gestoßen. Alle meine Notizen sind Nachrichten in einem Telegramm, denn als ich auf so etwas stieß, teilte ich es mit Freunden. Ich habe versucht, die wichtigsten Punkte wiederherzustellen.
Auf keinen Fall wollte ich sagen, wie schlimm alles war, irgendwie, um die Pfosten speziell öffentlich zu machen. Vielleicht ist dies überhaupt kein Pfosten, aber alles, was ich oben geschrieben habe, scheint mir persönlich seltsam.
Er teilte Ihnen mit, wie er die Bibliothek für die private Yandex.Music-Service-API geschrieben hat und auf welche Dinge er während der Entwicklung gestoßen ist.
Jetzt wissen Sie, wie und was ihre Windows-Anwendung funktioniert, und daher meine Bibliothek.
Übrigens, jetzt versuche ich, alles zu dokumentieren. Wenn ich meine Bibliothek dokumentiere, dokumentiere ich automatisch deren API. Es ist eng und ich brauche noch Zeit, um ein Unternehmen zu finden, das die industrielle technologische Praxis durchläuft.
Vielen Dank für das Lesen bis hierher!