Estamos finalizando o Yandex Station para assistir ao YouTube

No Yandex.Stations, é inconveniente assistir ao YouTube. Não há recomendações, assinaturas e até a pesquisa não funciona normalmente. Portanto, escrevi um telegrama para o bot para enviar qualquer vídeo para ele.



Sob o corte, a história é como eu fiz isso, apesar do fato de não haver uma API aberta oficial .

Como tudo começou?


Eu sou engenheiro. Estudo constantemente como diferentes tecnologias e coisas funcionam e também faço muitos projetos interessantes. Quando meus amigos me deram a Yandex.Station, reverti o protocolo de ativação e desenvolvi a ideia de transferência de dados orientada para o efeito uau.

Eu tenho uma TV estúpida (não inteligente) e, como principal console de mídia, uso o Station. Está tudo bem, mas apenas assistir ao YouTube é completamente desconfortável. Você não pode fazer login na sua conta do YouTube, o que significa que não há recomendações e inscrições. Além disso, a pesquisa de vídeo na estação, como eu a entendo, é realizada através do Yandex.Video. Infelizmente, esse esquema não funciona muito bem. Às vezes, não há vídeos, mesmo que você pronuncie o nome literalmente, e você não pode assistir a novos vídeos até que o mecanismo de pesquisa Yandex os indexe.

Eu quase cheguei a um acordo com o fato de que você não pode assistir ao YouTube no Station, mas tudo mudou algumas semanas atrás.

O que aconteceu?


No sábado de manhã, decidi assistir a última temporada do Vale do Silício. Fui ao Kinopoisk e vi o seguinte:


Depois de clicar no botão, o vídeo voou para o Yandex.Station e foi reproduzido mais lá. Assim como o ChromeCast ou o AirPlay. Delícia! Mas fiquei encantado não com a funcionalidade em si, mas com a oportunidade potencial de enviar qualquer vídeo para a estação.

Esqueci de pensar na série - durante todo o fim de semana entrei em engenharia reversa e desenvolvimento.

Vamos acertar.


Abrimos Kinopoisk ou Yandex.Video no Chrome - existem excelentes ferramentas para o desenvolvimento da web. Encontre o botão desejado, clique com o botão direito do mouse e selecione "Explorar o item".


Há muito o que aprender aqui, mas estamos interessados ​​em qual solicitação é executada quando este botão é clicado. Vamos para a guia "Rede" das ferramentas do desenvolvedor e examinamos as solicitações.


Sim, muitas estatísticas voam, mas duas solicitações interessantes são imediatamente visíveis. Estes são devices_online_stats e station.

Obter uma lista de dispositivos


devices_online_stats - solicita dispositivos de usuário ativos. Pedido de obtenção simples. Se você está autorizado no Yandex, pode descobrir seus dispositivos simplesmente abrindo o link em um navegador:

quasar.yandex.ru/devices_online_stats

O que na resposta:

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

Interessante e bastante intuitivo. Substituí o ID da estação no exemplo por asteriscos, apenas por precaução, mas precisaremos disso no futuro.

Reproduzir vídeo


Uma solicitação para yandex.ru/video/station é enviada usando o método POST. Repita-o no console, recebendo o comando da seguinte maneira:


Corra no terminal e obtenha a resposta:

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

Após alguns segundos, o vídeo começa na estação. Sucesso!

Nós coletamos


Eu removi todos os campos "extras" da solicitação para que ela permaneça operacional. Para enviar vídeo para a estação no corpo e nos cabeçalhos da solicitação POST, você precisa colocar apenas 4 parâmetros:

  • SessionID - autorização no Yandex
  • x-csrf-token
  • provider_item_id - link para o vídeo (ou identificador para alguns serviços)
  • device - O identificador do dispositivo que recebemos anteriormente

O que é o x-csrf-token? Não vamos nos aprofundar agora. Pode ser obtido simplesmente por uma solicitação GET para frontend.vh.yandex.ru/csrf_token se você está autorizado no Yandex.

Nesse ponto, eu já havia começado a agrupar tudo em um script Python. Como resultado, a função para enviar vídeo para a estação é mais ou menos assim:

 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 

Você deve ter notado que eu adiciono o campo player_id se um link do YouTube for enviado. O fato é que existem vários players na estação com os códigos youtube, vh e ott. Por padrão, vh é usado, mas a visualização e o título do vídeo são interrompidos. Além disso, seu estado não é redefinido quando o filme é alterado, o que geralmente causa erros (talvez nem todos os campos na solicitação sejam "redundantes"). O ott player, como eu o entendo, é usado para serviços de streaming, o que significa que no futuro você poderá assistir IPTV através da estação.

Qual é o resultado?


Agora eu tenho um bot através do qual enviamos vídeos do YouTube para o Station. Basta clicar em "Compartilhar" no aplicativo do YouTube e enviar o link para o Bot. A propósito, chamei de “Caixa” e fiz um logotipo).


Não o tornei público, para não coletar logins e senhas. Mas você pode implantar o mesmo para si mesmo ou modificá-lo para autorização do OAuth ou enviar vídeos de outros sites. Todas as fontes estão disponíveis no GitHub .

Eu queria que uma extensão do navegador funcionasse como o AirPlay em qualquer vídeo, mas percebi que é mais conveniente enviar do aplicativo pelo telefone. E para esse cenário, um bot é mais adequado. Aqui está um vídeo de seu trabalho:


Conclusão


Quando um engenheiro não tem funcionalidade, ele mesmo a conclui. Agora nós realmente usamos regularmente este bot - muito conveniente :)

Desenvolvedores Yandex, por favor, não quebre esta solicitação. Isso não é uma vulnerabilidade. Funciona apenas com autenticação. E se você puder - tornar pública a API do dispositivo - muito mais poderá ser feito!

Obrigado por ler meus artigos! Espero que você esteja interessado.

Boa sorte

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


All Articles