我如何为Yandex.Music服务编写库

引言


关于我


大家好,我是“软件技术员”专业的普通学生。 从小就喜欢计算机,从7年级开始,我就开始学习编程本身。 我已经成为Yandex Music订阅的拥有者一年多了,对此服务总体上感到满意(尽管现在播放列表中有连续的重复)。


背景知识


我不完全记得为什么我决定寻找该服务的官方API文档,就像我想为Telegram编写的机器人一样,但是我遇到了一个事实,那就是……在一段时间之后,我遇到了yandex / audio-js存储库中的问题。 在那里,人们问与我完全相同的问题:“ API在哪里?” 渴望通过浏览器听音乐的人并不多,他们想要一个应用程序,但是也没有Linux应用程序! 集成到您喜欢的播放器是不可能的!


然后我有了做这个的主意。 自然地,我需要以某种方式使用该服务,围绕Web应用程序创建拐杖不是一个选择。 我知道拥有这样的服务,拥有移动应用程序和Windows应用程序(来自Microsoft Store),根本就不可能没有自己的内部API进行交互。 我是对的!


主体前必读


我知道,通过研究他们的非公开API,我在其他人的肮脏事物中摸索。 下面将描述各种有争议的问题,开发人员的决策,以及总体上他们是如何编写和使用它们的。 在某些地方, 我只是感到震惊 ,但我敢肯定,如果这样做,那是有原因的 ! 我们不要忘记,没有人应该看到过这一点。 我还想说,下面写的所有内容都是我的看法 。 你可以同意他与否。


主体


准备工作


Web应用程序API


上面已经写了我找到API的信息。 这一点都不困难。 首先,我查看了他们的Web应用程序,撰写本文时的端点在这里: https://music.yandex.ru/api/v2.1/ : https://music.yandex.ru/api/v2.1/ 。 它们具有足够长的URL,我可以在其中参与数据,并且还发送表单。 我还请您注意指出API的版本


您需要了解,我发现它们仅在Web应用程序中使用。 没有OAuth。 更确切地说,它更可能存在,但是在那里,在我们本次会议的肠道中。 通常,该库不适用于授权的拐杖。


应用程式API


我出发去进一步搜索。 我懒得接电话,因此,我将最后接触移动应用程序。 当时,该计算机运行的是Windows 10,我积极使用了Microsoft Store官方的Yandex Music应用程序。 结果,我开始研究它是如何工作的。


为了进行研究,我需要一个嗅探器来跟踪所有应用程序流量。 您可以使用Wireshark ,但我决定使用HTTP Analyzer 。 在我看来,它更轻巧,非常适合我的任务。


打开嗅探器,转到应用程序,您就完成了。 按流请求流。 我们坐着,理解并尝试调用此应用程序中的每个处理程序,并了解所有现有方法,它们的参数以及JSON答案


其中一个请求的屏幕截图


从上面的屏幕截图中,您可以立即注意到一个完全不同的API地址api.music.yandex.net 。 此外,请注意标题。 除了有关发出请求的我的客户端的信息之外,还有一个OAuth令牌-这就是您所需要的!


学习API


这项研究是与编写代码一起进行的。 我为从API接收的服务对象编写了包装器类,实现了发送请求,整理了参数,并在某些地方猜测了这个名称的含义。 在这个阶段,我遇到了很多我没想到在这里看到的东西。


在编写本文时,该库包含83个类,其中只有一些是辅助类。 其余的是Yandex Music类,它们指示此服务的规模和抽象级别。


已发送约47种方法 。 这还不是API中的全部功能(更多内容请参见下文)。



起初,我试着不注意,我只是感到惊讶,因为这是Yandex ,怎么可能。 但是,在一个好的时刻,一切都炸了。 我也许会从他开始。


  1. 两个对象具有不同级别的场附着


    对象的新版本


    对象本身只是对其的“引用”。 完整版。 当请求曲目列表时,我们会得到它们的ID,通过它我们可以获得更详细的信息。 许多国家都有良好做法,但并不总是得到尊重(第9段)。


    对象的旧版本


    从一开始就为该对象实现了类,我想我会在任何地方使用它,但是无论如何! 在我看来,评论是多余的,所有内容都可以在屏幕截图中看到。


    我没有在我的库中修复这种TrackShort ,因此现在拥有TrackShortOld类具有TrackShortOld


    顺便说一句,这两个对象都以相同的方法生活在着陆方法中。


  2. API版本,方法


    我不仅要请您注意Web应用程序的API中如何指定版本。 通常,我们通常如何指示版本? 可能以下列方式之一:


    • 在单独的子域上制作版本;
    • 将版本放入请求部分;
    • 将所需版本的API参数传递给请求。

    Yandex在这种情况下决定不这样做。 我们有一个Landing3方法-在撰写本文时它的当前版本。 但是没有人禁止发送登陆请求2-一种完全不同的结构,其他物体。


    我很偶然地发现了这一点,只是忘记在方法名称的末尾添加一个数字并捕获大量异常。


  3. 用新的,不要放弃旧的


    当我为所有对象编写发送方法“赞”时,我看到了这一点。 实际上,它们并不多(播放列表,艺术家,曲目,专辑)。 当我看到同一动作的不同方法时,我感到惊讶。


    我们喜欢这样的艺术家: https://api.music.yandex.net/users/<USER_ID>/likes/artists/add : https://api.music.yandex.net/users/<USER_ID>/likes/artists/add artist-id artists/ 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 tracks track-ids并采用track-ids的形式。


    如果您没有注意到,那么当您喜欢曲目时,将使用add-multiple方法,而不是add 。 此方法未与其他任何类型一起使用, 但是它们都存在 (值得尝试发送一个请求)! 我在我的库中实现了它们,而不是add 。 毕竟,这种方法是通用的。 您可以添加一个或多个轨道。


  4. 什么是唯一曲目标识符


    已经过去了很多时间,但是我仍然不知道何时仅发送曲目id ,以及何时将ID和album_id通过冒号( id:album_id )串联id:album_id 。 有时在几张专辑中有一个曲目,有时则没有专辑。 从侧面看情况太晦涩,我不知道他们是如何处理的(或者做不到,bagus 2)。


  5. 可选许多领域


    我遇到了几个问题。 如果有问题,则与必填字段相关。 我认为,必填字段不会直接返回API,我从未感到惊讶。


    • TrackID和TrackShort类的album_id;
    • 类AutoRenewable的order_id(订阅);
    • Feed中的next_revision;
    • Track中的cover_uri;
    • 帐户中的生日;
    • 播放列表中的标签。

    列表继续,但是所有内容都在提交历史中。 也许这东西从手指上吸了。


  6. 相似方法,除了答案中的某些字段


    帐户状态响应( api.music.yandex.net/account/status ):


    帐户状态响应


    响应无线电帐户状态( https://api.music.yandex.net/rotor/account/status ):


    帐户状态无线电响应


    我知道权限是不同的,这些字段现在不限于高速缓存中的轨道数,而是每小时的跳过数,但它看起来更像是某种重复。


    我不知道Yandex的使用方法,但我将其合并为一类。


  7. 那么一个或多个?


    我一直认为,如果一个方法返回一个列表,那么即使结果是一个元素,包含该元素的列表也将被返回,仅此而已。


    特征和特征


    功能将返回,然后是功能 ,然后是功能功能


  8. 滥用方法


    在上面,我写道他们使用一种或另一种方法来执行一项操作。 他们走得更远。


    当背面很清楚时发送已删除的曲目


    除了播放列表ID和要删除轨道以及删除轨道的帧外,由于某种原因,它们还会将要删除的轨道传输到从播放列表删除轨道的方法中。 像其他所有内容一样,我可能不理解这一点,但是该方法在没有太多信息的情况下仍然有效。 而且删除了哪些曲目,最好在背面找到,而不是通过参数传递。


  9. 要求很高


    我在上面写道,提供带有曲目ID的列表是一种好习惯,只有在确实需要时,您才能获得有关曲目的详细信息。 在此并不总是使用此功能。


    看一看他们如何毫不留情地在一个请求中从“喜欢”播放列表中提供我所有曲目的详细信息:


    大量要求


    它给了所有396首曲目 ! 收到的字节数: 3.75M ,这是另一个封面下载!



法式面包


  1. 将所有曲目从“喜欢”下载到缓存


    当达到限制时,在末尾添加一个并且从头开始删除。 感谢您对队列的可视化,但是我想我只是从播放列表中下载最后100首曲目。 这发生在Android的移动客户端中( 观看视频 )。


  2. 当我需要发送ID时,我看起来并不困惑,但是当ID:Album_id时


    重复曲目



注意事项


激活礼品代码的尝试次数为10。下一次禁令24小时。


根据您所坐的应用程序,会为您提供不同的优惠来购买订阅。


缓存中的曲目数量限制只是一种错觉,它只是一个数字,并且该应用程序不允许您加载更多内容(bagus 2)。


所有这些聪明的播放列表,建议,文本和按钮颜色都来自API-此处就是真正的RESTFull。


即使您已订阅,也会返回广告的开始时间和广告本身。


包含有关要下载文件位置数据的XML链接持续1分钟,然后出现410错误。


结论


我只写了我记得的东西。 毕竟,我经历了所有这些几个月。 我所有的笔记都是电报中的消息,因为当我遇到这样的事情时,我与朋友分享了。 我试图恢复关键点。


我绝不是要说一切都多么糟糕,以某种方式专门将门框公开。 也许这根本不是门槛,但是我上面写的所有东西对我个人而言似乎都很奇怪。


他与您分享了他如何为私有Yandex.Music服务API编写库以及在开发过程中遇到了什么。


现在,您知道他们的Windows应用程序如何以及如何运行,因此也知道了我的库。


顺便说一下,现在我尝试全部记录下来,在记录库时,我会自动记录它们的API。 太紧了,我仍然需要时间来找到一家从事工业技术实践的公司。


感谢您阅读此处的内容!

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


All Articles