引言
关于我
大家好,我是“软件技术员”专业的普通学生。 从小就喜欢计算机,从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 ,怎么可能。 但是,在一个好的时刻,一切都炸了。 我也许会从他开始。
两个对象具有不同级别的场附着

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

从一开始就为该对象实现了类,我想我会在任何地方使用它,但是无论如何! 在我看来,评论是多余的,所有内容都可以在屏幕截图中看到。
我没有在我的库中修复这种TrackShort
,因此现在拥有TrackShortOld
类具有TrackShortOld
。
顺便说一句,这两个对象都以相同的方法生活在着陆方法中。
API版本,方法
我不仅要请您注意Web应用程序的API中如何指定版本。 通常,我们通常如何指示版本? 可能以下列方式之一:
- 在单独的子域上制作版本;
- 将版本放入请求部分;
- 将所需版本的API参数传递给请求。
Yandex在这种情况下决定不这样做。 我们有一个Landing3方法-在撰写本文时它的当前版本。 但是没有人禁止发送登陆请求2-一种完全不同的结构,其他物体。
我很偶然地发现了这一点,只是忘记在方法名称的末尾添加一个数字并捕获大量异常。
用新的,不要放弃旧的
当我为所有对象编写发送方法“赞”时,我看到了这一点。 实际上,它们并不多(播放列表,艺术家,曲目,专辑)。 当我看到同一动作的不同方法时,我感到惊讶。
我们喜欢这样的艺术家: 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 。 毕竟,这种方法是通用的。 您可以添加一个或多个轨道。
什么是唯一曲目标识符
已经过去了很多时间,但是我仍然不知道何时仅发送曲目id
,以及何时将ID和album_id通过冒号( id:album_id
)串联id:album_id
。 有时在几张专辑中有一个曲目,有时则没有专辑。 从侧面看情况太晦涩,我不知道他们是如何处理的(或者做不到,bagus 2)。
可选许多领域
我遇到了几个问题。 如果有问题,则与必填字段相关。 我认为,必填字段不会直接返回API,我从未感到惊讶。
- TrackID和TrackShort类的album_id;
- 类AutoRenewable的order_id(订阅);
- Feed中的next_revision;
- Track中的cover_uri;
- 帐户中的生日;
- 播放列表中的标签。
列表继续,但是所有内容都在提交历史中。 也许这东西从手指上吸了。
相似方法,除了答案中的某些字段
帐户状态响应( api.music.yandex.net/account/status
):

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

我知道权限是不同的,这些字段现在不限于高速缓存中的轨道数,而是每小时的跳过数,但它看起来更像是某种重复。
我不知道Yandex的使用方法,但我将其合并为一类。
那么一个或多个?
我一直认为,如果一个方法返回一个列表,那么即使结果是一个元素,包含该元素的列表也将被返回,仅此而已。

该功能将返回,然后是功能 ,然后是功能和功能 。
滥用方法
在上面,我写道他们使用一种或另一种方法来执行一项操作。 他们走得更远。

除了播放列表ID和要删除轨道以及删除轨道的帧外,由于某种原因,它们还会将要删除的轨道传输到从播放列表删除轨道的方法中。 像其他所有内容一样,我可能不理解这一点,但是该方法在没有太多信息的情况下仍然有效。 而且删除了哪些曲目,最好在背面找到,而不是通过参数传递。
要求很高
我在上面写道,提供带有曲目ID的列表是一种好习惯,只有在确实需要时,您才能获得有关曲目的详细信息。 在此并不总是使用此功能。
看一看他们如何毫不留情地在一个请求中从“喜欢”播放列表中提供我所有曲目的详细信息:

它给了所有396首曲目 ! 收到的字节数: 3.75M ,这是另一个封面下载!
法式面包
将所有曲目从“喜欢”下载到缓存
当达到限制时,在末尾添加一个并且从头开始删除。 感谢您对队列的可视化,但是我想我只是从播放列表中下载最后100首曲目。 这发生在Android的移动客户端中( 观看视频 )。
当我需要发送ID时,我看起来并不困惑,但是当ID:Album_id时

注意事项
激活礼品代码的尝试次数为10。下一次禁令24小时。
根据您所坐的应用程序,会为您提供不同的优惠来购买订阅。
缓存中的曲目数量限制只是一种错觉,它只是一个数字,并且该应用程序不允许您加载更多内容(bagus 2)。
所有这些聪明的播放列表,建议,文本和按钮颜色都来自API-此处就是真正的RESTFull。
即使您已订阅,也会返回广告的开始时间和广告本身。
包含有关要下载文件位置数据的XML链接持续1分钟,然后出现410错误。
结论
我只写了我记得的东西。 毕竟,我经历了所有这些几个月。 我所有的笔记都是电报中的消息,因为当我遇到这样的事情时,我与朋友分享了。 我试图恢复关键点。
我绝不是要说一切都多么糟糕,以某种方式专门将门框公开。 也许这根本不是门槛,但是我上面写的所有东西对我个人而言似乎都很奇怪。
他与您分享了他如何为私有Yandex.Music服务API编写库以及在开发过程中遇到了什么。
现在,您知道他们的Windows应用程序如何以及如何运行,因此也知道了我的库。
顺便说一下,现在我尝试全部记录下来,在记录库时,我会自动记录它们的API。 太紧了,我仍然需要时间来找到一家从事工业技术实践的公司。
感谢您阅读此处的内容!