# music-sdk **Repository Path**: it_programmer/music-sdk ## Basic Information - **Project Name**: music-sdk - **Description**: 本项目~,只需要简单几行代码,即可轻松调用音乐API。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-09-20 - **Last Updated**: 2025-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: CloudMusic ## README # CloudMusic ## 引言 你是否看过下面两个音乐API,想要通过Java去调用API,但觉得不方便呢? ### 接口文档: #### [一、QQ音乐API在线文档](https://jsososo.github.io/QQMusicApi/#/) #### [二、网易云音乐API在线文档](https://neteasecloudmusicapi.vercel.app/#/) 那么不妨来看一下本项目~,只需要简单几行代码,即可轻松调用音乐API。 ## 灵感来源 本项目灵感来源于 [1015770492/yumbo-music-utils](https://github.com/1015770492/yumbo-music-utils) ## 项目简介 CloudMusic 是一个免费开源的Java版本实现的云音乐API,包含所有[QQ音乐API](https://jsososo.github.io/QQMusicApi/#/)和[网易云音乐API](https://neteasecloudmusicapi.vercel.app/#/),可用于学习参考。 ## 项目说明 ### 一、项目结构 ```text src ├─java │ └─com │ └─cloud │ └─music │ ├─annotation // 自定义注解 │ ├─aspect // 切面 │ ├─config │ │ ├─properties // 配置文件 │ │ └─proxy // 动态代理配置 │ ├─constant // 常量 │ ├─controller // 控制器 │ ├─dto │ │ ├─netease // 网易云音乐DTO │ │ └─qq // QQ音乐DTO │ ├─service │ │ ├─netease // 网易云音乐Service │ │ └─qq // QQ音乐Service │ └─utils // 工具类 └─resources ``` ### 二、项目技术 1. 使用SpringBoot开发,使用Maven进行构建,使用JDK11进行编译 2. 使用了Lombok,使用IDEA的同学请安装Lombok插件 3. 借鉴了Mybatis的设计思想,使用动态代理实现了对QQ音乐和网易云音乐的API调用 ### 三、项目依赖 使用到的依赖: spring-web、lombok、fastjson、hutool等 ```xml org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.79 org.springframework.boot spring-boot-starter-validation org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test cn.hutool hutool-all 5.8.22 org.springframework.boot spring-boot-starter-aop org.jetbrains annotations 13.0 compile ``` ## 接口文档 #### [一、QQ音乐API在线文档](https://jsososo.github.io/QQMusicApi/#/) #### [二、网易云音乐API在线文档](https://binaryify.github.io/NeteaseCloudMusicApi/#/) ## 使用说明 ### 使用须知: - 响应返回的数据统一为JSONObject对象。 - 项目提供两种参数传递方式:①JSONObject对象,②内置DTO对象。 - JSONObject对象作为参数时,不进行校验逻辑;内置DTO对象作为参数时,支持校验逻辑。 - 在测试方法中测试云音乐API接口时,可以通过CookieUtil.setCurrentCookie()方法注入Cookie。 - 项目中提供静态方法来调用云音乐API,可以直接通过类名调用。网易云音乐接口类NeteaseMusicUtil,QQ音乐接口类QqMusicUtil。 - 根据音乐API文档进行的封装,方法的命名采用小驼峰命名。 例如文档中的接口是:/search/hot,则对应的调用方法就是:searchHot。 - 内置DTO对象封装接口所要的请求参数(包含必选或非必选参数),内置DTO类命名采用大驼峰命名。例如文档中的接口是:/search/hot,则对应的DTO类就是:SearchHot。 ### 一、注解说明 **@CookieInject** 作用:注解在@Controller/@RestController类上或者方法上,用于获取请求header中Cookie值,并将Cookie值注入到发送远程请求的header中。 **@OptionLog** 作用:注解在@Controller/@RestController类上或者方法上,用于输出接口请求日志。 **@MusicServiceScan** 作用:用于扫描@MusicService注解的接口类。 **@MusicService** 作用:注解在接口类上,用于标识该接口类为音乐服务接口类。 **@Music** 作用:注解在接口方法上,用于标识该方法为音乐服务接口方法。 ### 二、使用示例 #### 1、使用JSONObject对象作为参数 ```java @SpringBootTest public class CloudMusicApplicationTest { /** * 使用JSONObject对象作为参数,调用手机验证码发送接口 */ @Test public void captchaSentTest() { // 注入Cookie,测试接口时使用,不写也可以,默认会注入Cookie="",在调用登录接口之后的接口时,需要注入Cookie。 // CookieUtil.setCurrentCookie("xxx"); // 1、创建JSONObject对象,存放请求参数phone JSONObject params = new JSONObject().fluentPut("phone", "15563694567"); // 2.调用手机验证码发送接口 JSONObject responseBody = NeteaseMusicUtil.captchaSent(params); // 3.打印响应结果 System.out.println(responseBody); } } ``` #### 2、使用内置DTO对象作为参数 ```java @SpringBootTest public class CloudMusicApplicationTest { /** * 使用内置DTO对象作为参数,调用手机验证码发送接口 */ @Test public void captchaSentTest() { // 注入Cookie,测试接口时使用,不写也可以,默认会注入Cookie="",在调用登录接口之后的接口时,需要注入Cookie。 // CookieUtil.setCurrentCookie("xxx"); // 1、创建CaptchaSent对象,存放请求参数phone CaptchaSent captchaSent = CaptchaSent.builder().phone("15563694567").build(); // 2.调用手机验证码发送接口 JSONObject responseBody = NeteaseMusicUtil.captchaSent(captchaSent); // 3.打印响应结果 System.out.println(responseBody); } } ``` #### 3、使用内置DTO对象作为参数,支持校验逻辑 ```java @SpringBootTest public class CloudMusicApplicationTest { /** * 使用内置DTO对象作为参数,调用手机验证码发送接口 */ @Test public void captchaSentTestByDto() { // 注入Cookie,测试接口时使用,不写也可以,默认会注入Cookie="",在调用登录接口之后的接口时,需要注入Cookie。 // CookieUtil.setCurrentCookie("xxx"); // CaptchaSent captchaSent = CaptchaSent.builder().phone("12345678910").build(); 手机号码格式不正确 // CaptchaSent captchaSent = CaptchaSent.builder().phone("abcdef").build(); 手机号码格式不正确 // CaptchaSent captchaSent = CaptchaSent.builder().phone("123456").build(); 手机号码格式不正确 // 以上三种情况在请求发送之前就可以抛出异常,不会发送请求,减少接口发送次数,提高接口调用效率。 // 1、创建CaptchaSent对象,存放请求参数phone CaptchaSent captchaSent = CaptchaSent.builder().phone("15563694567").build(); // 2.调用手机验证码发送接口 JSONObject responseBody = NeteaseMusicUtil.captchaSent(captchaSent); // 3.打印响应结果 System.out.println(responseBody); } /** * 使用内置JOSNObject对象作为参数,调用手机验证码发送接口 */ @Test public void captchaSentTestByJsonObject() { // 注入Cookie,测试接口时使用,不写也可以,默认会注入Cookie="",在调用登录接口之后的接口时,需要注入Cookie。 // CookieUtil.setCurrentCookie("xxx"); // JSONObject params = new JSONObject().fluentPut("phone", "12345678910"); 手机号码格式不正确 // JSONObject params = new JSONObject().fluentPut("phone", "abcdef"); 手机号码格式不正确 // JSONObject params = new JSONObject().fluentPut("phone", "123456"); 手机号码格式不正确 // 以上三种情况不会走校验逻辑,会发送请求,但是接口会返回错误信息响应。 // 1、创建JSONObject对象,存放请求参数phone JSONObject params = new JSONObject().fluentPut("phone", "15563694567"); // 2.调用手机验证码发送接口 JSONObject responseBody = NeteaseMusicUtil.captchaSent(params); // 3.打印响应结果 System.out.println(responseBody); } } ``` #### 4、使用注解@CookieInject注入Cookie ```java @RestController @CookieInject // 会获取请求header中的Cookie值,并将Cookie值注入到发送远程请求的header中,注解在类上时,会对类中的所有方法生效,注解在方法上时,只会对该类所有方法生效。 public class TestController { // @CookieInject 注解在方法上时,只会对该方法生效。 @GetMapping("/get/user/subcount") public JSONObject getUserSubcount() { // 如果不使用@CookieInject注解,需要手动注入Cookie // CookieUtil.setCurrentCookie("xxx"); JSONObject resBody = new JSONObject(); // 获取登录用户信息 , 歌单,收藏,mv, dj 数量 NeteaseMusicUtil.userSubcount(); return resBody; } } ``` #### 5、使用注解@OptionLog输出接口请求日志 ```java @RestController @OptionLog // 会输出接口请求日志,注解在类上时,会对类中的所有方法生效,注解在方法上时,只会对该注解的方法生效。 public class TestController { // @OptionLog 注解在方法上时,只会对该方法生效。 @GetMapping("/get/user/subcount") public JSONObject getUserSubcount() { // 如果不使用@CookieInject注解,需要手动注入Cookie // CookieUtil.setCurrentCookie("xxx"); JSONObject resBody = new JSONObject(); // 获取登录用户信息 , 歌单,收藏,mv, dj 数量 NeteaseMusicUtil.userSubcount(); return resBody; } } ``` #### 6、将内置DTO对象作为接收前端请求参数 ```java import com.alibaba.fastjson.JSONObject; import com.cloud.music.utils.NeteaseMusicUtil; @RestController @CookieInject @OptionLog public class TestController { @PostMapping("/share/resource") public JSONObject shareResource(@RequestBody ShareResource shareResource) { // 如果不使用@CookieInject注解,需要手动注入Cookie // CookieUtil.setCurrentCookie("xxx"); JSONObject resBody = NeteaseMusicUtil.shareResource(shareResource); return resBody; } } ``` ## 捐赠 如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! [//]: # (![donate](https://anncwb.github.io/anncwb/images/sponsor.png))