我们正在完成Yandex。Station的收看工作,以观看YouTube

在Yandex.Stations上,观看YouTube很不方便。 没有建议,订阅,甚至搜索均无法正常进行。 因此,我给机器人写了一封电报,向它发送任何视频。



尽管没有正式的开放API ,但故事是我如何做到的。

这一切是如何开始的?


我是工程师。 我一直在研究不同的技术和事物如何工作,并且自己也做很多有趣的项目。 当我的朋友给我Yandex.Station时,我逆转了激活协议,并提出了基于哇效果的数据传输思想。

我有一台笨拙的(不是智能的)电视,作为主媒体控制台,我使用了Station。 一切都很好,但是仅仅观看YouTube完全不舒服。 您无法登录YouTube帐户,这意味着没有建议和订阅。 另外,据我所知,该站中的视频搜索是通过Yandex.Video进行的。 不幸的是,这样的方案不能很好地工作。 有时,即使您按字面名发音,也没有视频,并且直到Yandex搜索引擎将它们编入索引之后,才可以观看新视频。

我几乎同意您无法在Station上观看YouTube的事实,但是一切都在几周前发生了变化。

怎么了


在周六早上,我决定观看硅谷的最后一个赛季。 我去了Kinopoisk,看到了以下内容:


单击按钮后,视频飞到Yandex.Station,并在此处进一步播放。 就像ChromeCast或AirPlay。 真高兴! 但是,我对功能本身不感到高兴,但对将任何视频发送到电视台的潜在机会感到高兴。

我忘了考虑这个系列了-在整个周末我都从事逆向工程和开发。

让我们做对。


我们在Chrome中打开Kinopoisk或Yandex.Video-有出色的Web开发工具。 找到所需的按钮,单击鼠标右键,选择“浏览项目”。


在这里可以学到很多东西,但是我们对单击此按钮后执行什么请求很感兴趣。 我们转到开发人员工具的“网络”标签,然后查看请求。


是的,大量统计数据飞速发展,但立即可以看到2个有趣的请求。 这些是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" } 

有趣且直观。 为了防止万一,我在示例中将Station ID替换为星号,但将来我们将需要它。

播放影片


使用POST方法发送对yandex.ru/video/station的请求。 从控制台重复此操作,并收到以下命令:


在终端中运行并获得答案:

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

几秒钟后,视频将从电台开始播放。 成功!

我们收集


我从请求中删除了所有“额外”字段,以使其保持可操作状态。 要将视频发送到主体和POST请求标头中的Station,您只需放置4个参数:

  • SessionID-Yandex中的授权
  • x-csrf令牌
  • provider_item_id-链接到视频(或某些服务的标识符)
  • 设备-我们之前收到的设备的标识符

什么是x-csrf令牌? 我们现在不会深入。 如果您在Yandex中获得了授权,则可以通过对frontend.vh.yandex.ru/csrf_token的GET请求简单地获得它。

至此,我已经开始将所有内容包装在Python脚本中。 结果,用于向站点发送视频的功能如下所示:

 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 

您可能已经注意到,如果发送了YouTube的链接,我会添加player_id字段。 事实是,该站上有多个播放器,其代码分别为youtube,vh和ott。 默认情况下,使用vh,但是视频的预览和标题中断。 此外,更改电影时不会重置其状态,这通常会导致错误(也许并非请求中的所有字段都是“冗余”的)。 据我了解,ott播放器用于流媒体服务,这意味着将来您可以通过电视台观看IPTV。

结果如何?


现在,我有一个机器人,通过它我们可以将YouTube中的视频发送到工作站。 只需在YouTube应用程序中单击“共享”,然后将链接发送到Bot。 顺便说一句,我称它为“盒子”并做了一个徽标)。


我没有公开它,以免收集登录名和密码。 但是您可以自己部署它,也可以对其进行修改以进行OAuth授权或从其他站点发送视频。 所有资源都可以在GitHub找到

我想制作一个浏览器扩展程序,使其与任何视频都可以像AirPlay一样工作,但是我意识到从手机中的应用程序发送邮件更方便。 对于这种情况,机器人更适合。 这是他的作品的视频:


结论


当工程师缺乏功能时,他会自己完成。 现在我们真的经常使用这个机器人了-非常方便:)

Yandex开发人员,请不要违反此要求。 这不是漏洞。 仅适用于身份验证。 如果可以的话-将设备API公开-可以做更多的事情!

感谢您阅读我的文章! 我希望你有兴趣。

祝你好运!

Source: https://habr.com/ru/post/zh-CN479242/


All Articles