Nous finalisons Yandex. Station pour regarder YouTube

Sur Yandex.Stations, il n'est pas pratique de regarder YouTube. Il n'y a pas de recommandations, d'abonnements et même la recherche ne fonctionne pas normalement. Par conséquent, j'ai écrit un télégramme au bot pour lui envoyer n'importe quelle vidéo.



Sous la coupe, l'histoire est de savoir comment je l'ai fait malgré le fait qu'il n'y ait pas d'API ouverte officielle .

Comment tout a commencé?


Je suis ingénieur. J'étudie constamment comment différentes technologies et choses fonctionnent, et je réalise moi-même beaucoup de projets intéressants. Lorsque mes amis m'ont donné Yandex.Station, j'ai inversé le protocole d'activation et développé l' idée d'un transfert de données orienté vers l'effet wow.

J'ai un téléviseur stupide (pas intelligent), et en tant que console multimédia principale, j'utilise la Station. Tout va bien, mais regarder YouTube est complètement inconfortable. Vous ne pouvez pas vous connecter à votre compte YouTube, ce qui signifie qu'il n'y a pas de recommandations et d'abonnements. De plus, la recherche de vidéos dans la Station, si je comprends bien, est effectuée via Yandex.Video. Malheureusement, un tel schéma ne fonctionne pas très bien. Parfois, il n'y a pas de vidéos, même si vous prononcez littéralement le nom, et vous ne pouvez pas regarder de nouvelles vidéos tant que le moteur de recherche Yandex ne les indexe pas.

J'ai presque accepté le fait que vous ne pouvez pas regarder YouTube sur la station, mais tout a changé il y a quelques semaines.

Que s'est-il passé?


Samedi matin, j'ai décidé de regarder la dernière saison de la Silicon Valley. Je suis allé à Kinopoisk et j'ai vu ce qui suit:


Après avoir cliqué sur le bouton, la vidéo s'est envolée vers Yandex.Station et a été lue plus loin. Tout comme ChromeCast ou AirPlay. Du plaisir! Mais je n'étais pas ravi de la fonctionnalité elle-même, mais de la possibilité potentielle d'envoyer n'importe quelle vidéo à la station.

J'ai oublié de penser à la série - pendant tout le week-end, je suis passé à l'ingénierie inverse et au développement.

Faisons les choses correctement.


Nous ouvrons Kinopoisk ou Yandex.Video dans Chrome - il existe d'excellents outils pour le développement Web. Trouvez le bouton souhaité, faites un clic droit, sélectionnez «Explorer l'élément».


Il y a beaucoup à apprendre ici, mais nous voulons savoir quelle demande est exécutée lorsque ce bouton est cliqué. Nous allons dans l'onglet "Réseau" des outils de développement et examinons les demandes.


Oui, beaucoup de statistiques s'envolent, mais 2 demandes intéressantes sont immédiatement visibles. Ce sont devices_online_stats et station.

Obtenez une liste d'appareils


devices_online_stats - demande les machines utilisateur actives. Demande simple. Si vous êtes autorisé dans Yandex, vous pouvez vous renseigner sur vos appareils simplement en ouvrant le lien dans un navigateur:

quasar.yandex.ru/devices_online_stats

Que dans la réponse:

{ "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" } 

Intéressant et assez intuitif. J'ai remplacé l'identifiant de station dans l'exemple par des astérisques au cas où, mais nous en aurons besoin à l'avenir.

Lire la vidéo


Une demande à yandex.ru/video/station est envoyée à l'aide de la méthode POST. Répétez-le depuis la console, en recevant la commande comme suit:


Courez dans le terminal et obtenez la réponse:

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

Après quelques secondes, la vidéo démarre à la station. Succès!

Nous collectons


J'ai supprimé tous les champs "supplémentaires" de la demande pour qu'elle reste opérationnelle. Pour envoyer la vidéo à la Station dans le corps et les en-têtes de la requête POST, vous devez mettre seulement 4 paramètres:

  • SessionID - autorisation dans Yandex
  • jeton x-csrf
  • provider_item_id - lien vers la vidéo (ou identifiant pour certains services)
  • device - L'identifiant de l'appareil que nous avons reçu plus tôt

Qu'est-ce que x-csrf-token? Nous n'irons pas en profondeur maintenant. Il peut être obtenu simplement par une demande GET à frontend.vh.yandex.ru/csrf_token si vous êtes autorisé dans Yandex.

À ce stade, j'avais déjà commencé à tout emballer dans un script Python. Par conséquent, la fonction d'envoi de vidéo à la station ressemble à ceci:

 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 

Vous avez peut-être remarqué que j'ajoute le champ player_id si un lien de YouTube est envoyé. Le fait est qu'il y a plusieurs joueurs sur la Station avec les codes youtube, vh et ott. Par défaut, vh est utilisé, mais l'aperçu et le titre de la vidéo sont interrompus. De plus, son état n'est pas réinitialisé lorsque le film est modifié, ce qui provoque souvent des erreurs (peut-être, tous les champs de la demande n'étaient pas «redondants»). Le lecteur ott, si je comprends bien, est utilisé pour les services de streaming, ce qui signifie qu'à l'avenir, vous pourrez regarder IPTV via la station.

Quel est le résultat?


Maintenant, j'ai un bot à travers lequel nous envoyons des vidéos de YouTube à la Station. Cliquez simplement sur "Partager" dans l'application YouTube et envoyez le lien vers Bot. Au fait, je l'ai appelé «Box» et j'ai fait un logo).


Je ne l'ai pas rendu public, afin de ne pas collecter les identifiants et mots de passe. Mais vous pouvez déployer le même pour vous-même ou le modifier pour l'autorisation OAuth ou l'envoi de vidéos à partir d'autres sites. Toutes les sources sont disponibles sur GitHub .

Je voulais faire en sorte qu'une extension de navigateur fonctionne comme AirPlay avec n'importe quelle vidéo, mais j'ai réalisé qu'il était plus pratique d'envoyer depuis l'application depuis le téléphone. Et pour ce scénario, un bot est mieux adapté. Voici une vidéo de son travail:


Conclusion


Lorsqu'un ingénieur manque de fonctionnalité, il la complète lui-même. Maintenant, nous utilisons vraiment régulièrement ce bot - très pratique :)

Développeurs Yandex, veuillez ne pas casser cette demande. Ce n'est pas une vulnérabilité. Fonctionne uniquement avec l'authentification. Et si vous le pouvez - rendez l'API de l'appareil publique - bien plus peut être fait!

Merci d'avoir lu mes articles! J'espère que vous étiez intéressé.

Bonne chance!

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


All Articles