├── .gitignore ├── LICENSE ├── README.md ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── music │ │ ├── MusicJavaApiApplication.java │ │ ├── config │ │ ├── Constant.java │ │ ├── Monitor.java │ │ ├── MusicHandlerInterceptor.java │ │ ├── RestTemplateAutoConfiguration.java │ │ └── TypeConfig.java │ │ ├── enums │ │ └── AesEncryptEnum.java │ │ ├── module │ │ ├── api │ │ │ ├── CommentHugList.java │ │ │ ├── HugComment.java │ │ │ ├── PlaylistDetail.java │ │ │ └── Toplist.java │ │ ├── base │ │ │ ├── BaseModule.java │ │ │ ├── BaseModuleApi.java │ │ │ ├── BaseModuleEApi.java │ │ │ ├── BaseModuleGetType.java │ │ │ ├── BaseModuleNoType.java │ │ │ ├── BaseModuleWeApi.java │ │ │ └── InitModule.java │ │ ├── eapi │ │ │ ├── ActivateInitProfile.java │ │ │ ├── CellphoneExistenceCheck.java │ │ │ ├── CommentNew.java │ │ │ ├── CountriesCodeList.java │ │ │ ├── HomepageDragonBall.java │ │ │ ├── PlaylistDescUpdate.java │ │ │ ├── PlaylistNameUpdate.java │ │ │ ├── PlaylistTagsUpdate.java │ │ │ ├── SearchDefault.java │ │ │ ├── SongUrl.java │ │ │ └── UserFolloweds.java │ │ ├── get │ │ │ └── LoginQrCreate.java │ │ ├── notype │ │ │ └── Banner.java │ │ └── weapi │ │ │ ├── Album.java │ │ │ ├── AlbumDetail.java │ │ │ ├── AlbumDetailDynamic.java │ │ │ ├── AlbumList.java │ │ │ ├── AlbumListStyle.java │ │ │ ├── AlbumNew.java │ │ │ ├── AlbumNewest.java │ │ │ ├── AlbumSongsaleboard.java │ │ │ ├── AlbumSub.java │ │ │ ├── AlbumSublist.java │ │ │ ├── ArtistAlbum.java │ │ │ ├── ArtistDesc.java │ │ │ ├── ArtistDetail.java │ │ │ ├── ArtistList.java │ │ │ ├── ArtistMv.java │ │ │ ├── ArtistNewMv.java │ │ │ ├── ArtistNewSong.java │ │ │ ├── ArtistSongs.java │ │ │ ├── ArtistSub.java │ │ │ ├── ArtistSublist.java │ │ │ ├── ArtistTopSong.java │ │ │ ├── Artists.java │ │ │ ├── AudioMatch.java │ │ │ ├── Calendar.java │ │ │ ├── CaptchaSent.java │ │ │ ├── CaptchaVerify.java │ │ │ ├── CheckMusic.java │ │ │ ├── CloudMatch.java │ │ │ ├── Cloudsearch.java │ │ │ ├── Comment.java │ │ │ ├── CommentAlbum.java │ │ │ ├── CommentDj.java │ │ │ ├── CommentEvent.java │ │ │ ├── CommentFloor.java │ │ │ ├── CommentHot.java │ │ │ ├── CommentLike.java │ │ │ ├── CommentMusic.java │ │ │ ├── CommentMv.java │ │ │ ├── CommentPlaylist.java │ │ │ ├── CommentVideo.java │ │ │ ├── DailySignin.java │ │ │ ├── DigitalAlbumOrdering.java │ │ │ ├── DigitalAlbumPurchased.java │ │ │ ├── DjBanner.java │ │ │ ├── DjCategoryExcludehot.java │ │ │ ├── DjCategoryRecommend.java │ │ │ ├── DjCatelist.java │ │ │ ├── DjDetail.java │ │ │ ├── DjHot.java │ │ │ ├── DjPaygift.java │ │ │ ├── DjPersonalizeRecommend.java │ │ │ ├── DjProgram.java │ │ │ ├── DjProgramDetail.java │ │ │ ├── DjProgramToplist.java │ │ │ ├── DjProgramToplistHours.java │ │ │ ├── DjRadioHot.java │ │ │ ├── DjRecommend.java │ │ │ ├── DjRecommendType.java │ │ │ ├── DjSub.java │ │ │ ├── DjSublist.java │ │ │ ├── DjSubscriber.java │ │ │ ├── DjTodayPerfered.java │ │ │ ├── DjToplist.java │ │ │ ├── DjToplistHours.java │ │ │ ├── DjToplistNewcomer.java │ │ │ ├── DjToplistPay.java │ │ │ ├── DjToplistPopular.java │ │ │ ├── Event.java │ │ │ ├── EventDel.java │ │ │ ├── EventForward.java │ │ │ ├── FmTrash.java │ │ │ ├── Follow.java │ │ │ ├── HistoryRecommendSongs.java │ │ │ ├── HistoryRecommendSongsDetail.java │ │ │ ├── HomepageBlockPage.java │ │ │ ├── HotTopic.java │ │ │ ├── Like.java │ │ │ ├── Likelist.java │ │ │ ├── ListenTogetherStatus.java │ │ │ ├── Login.java │ │ │ ├── LoginCellphone.java │ │ │ └── LoginQrCheck.java │ │ ├── service │ │ ├── BaseService.java │ │ └── impl │ │ │ └── BaseServiceImpl.java │ │ └── util │ │ ├── CookieUtil.java │ │ ├── CryptoUtil.java │ │ └── RestTemplateUtil.java └── resources │ └── application.properties └── test └── java └── com └── music └── MusicJavaApiApplicationTests.java /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | .mvn/wrapper/maven-wrapper.jar 4 | **/src/main/**/target/ 5 | **/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | **/src/main/**/build/ 30 | **/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | /.mvn/ 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Wangjingning 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=jnwang95&repo=music-java-api&show_icons=true&theme=radical)](https://github.com/jnwang95/music-java-api) 2 | [![Anurag's GitHub stats](https://github-readme-stats.vercel.app/api?username=jnwang95&show_icons=true&theme=radical)](https://github.com/jnwang95/music-java-api) 3 | 4 | 5 | # music-java-api 6 | 集成网易云音乐api 7 | 以Java开发服务,前端调用者可自行设计 8 | 9 | 10 | ## 开发环境 11 | Jdk 16 、 Maven 、SpringBoot 、 Lombok 12 | 13 | ## 技术选型 14 | SpringBoot 、Hutool 15 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.5.1 9 | 10 | 11 | com.music 12 | music-java-api 13 | 0.0.1-SNAPSHOT 14 | music-java-api 15 | 网易云音乐api-java版 16 | 17 | 16 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-web 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-configuration-processor 28 | true 29 | 30 | 31 | org.projectlombok 32 | lombok 33 | true 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-starter-test 38 | test 39 | 40 | 41 | cn.hutool 42 | hutool-all 43 | 5.6.6 44 | 45 | 46 | 47 | 48 | 49 | 50 | org.springframework.boot 51 | spring-boot-maven-plugin 52 | 53 | 54 | 55 | org.projectlombok 56 | lombok 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/main/java/com/music/MusicJavaApiApplication.java: -------------------------------------------------------------------------------- 1 | package com.music; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cache.annotation.EnableCaching; 6 | 7 | @EnableCaching 8 | @SpringBootApplication 9 | public class MusicJavaApiApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(MusicJavaApiApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/music/config/Constant.java: -------------------------------------------------------------------------------- 1 | package com.music.config; 2 | 3 | public class Constant { 4 | 5 | public static String NETEASE_BASE_URL = "http://music.163.com"; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/music/config/Monitor.java: -------------------------------------------------------------------------------- 1 | package com.music.config; 2 | 3 | import lombok.AllArgsConstructor; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 7 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 9 | 10 | /** 11 | * 全局拦截监控器 12 | */ 13 | @Configuration 14 | @Component 15 | @AllArgsConstructor 16 | public class Monitor extends WebMvcConfigurationSupport { 17 | 18 | private final MusicHandlerInterceptor musicHandlerInterceptor; 19 | 20 | @Override 21 | public void addInterceptors(InterceptorRegistry registry) { 22 | registry.addInterceptor(musicHandlerInterceptor).addPathPatterns("/music/**"); 23 | } 24 | /** 25 | * 放行static静态文件 26 | * @param registry 注册器 27 | */ 28 | @Override 29 | protected void addResourceHandlers(ResourceHandlerRegistry registry) { 30 | registry.addResourceHandler("/**") 31 | .addResourceLocations("classpath:/resource/","classpath:/static/"); 32 | super.addResourceHandlers(registry); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/config/MusicHandlerInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.music.config; 2 | 3 | import com.music.service.BaseService; 4 | import com.music.util.CookieUtil; 5 | import lombok.AllArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.stereotype.Component; 9 | import org.springframework.web.servlet.HandlerInterceptor; 10 | 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import java.io.IOException; 14 | import java.io.PrintWriter; 15 | 16 | /** 17 | * 自定义拦截器 18 | * 1. 自定义适配音乐接口 19 | * 2.自定义记录pv,uv 20 | */ 21 | @Slf4j 22 | @Component 23 | @AllArgsConstructor 24 | public final class MusicHandlerInterceptor implements HandlerInterceptor { 25 | 26 | private final BaseService bs; 27 | 28 | @Override 29 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 30 | ResponseEntity musicData = bs.getMusicData(request); 31 | PrintWriter writer = null; 32 | response.setCharacterEncoding("UTF-8"); 33 | response.setContentType("text/html;charset=utf-8"); 34 | try { 35 | writer = response.getWriter(); 36 | CookieUtil.setCookie(musicData.getHeaders(), response); 37 | writer.print(musicData.getBody()); 38 | }catch (IOException e){ 39 | e.printStackTrace(); 40 | }finally { 41 | assert writer != null; 42 | writer.close(); 43 | } 44 | return false; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/music/config/RestTemplateAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.music.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.http.converter.HttpMessageConverter; 6 | import org.springframework.http.converter.StringHttpMessageConverter; 7 | import org.springframework.web.client.RestTemplate; 8 | 9 | import java.nio.charset.Charset; 10 | import java.nio.charset.StandardCharsets; 11 | import java.util.List; 12 | 13 | @Configuration 14 | public class RestTemplateAutoConfiguration { 15 | 16 | /** 17 | * 功能描述:注册restTemplate服务 18 | */ 19 | @Bean 20 | public RestTemplate registerTemplate() { 21 | RestTemplate restTemplate = new RestTemplate(); 22 | List> httpMessageConverters = restTemplate.getMessageConverters(); 23 | httpMessageConverters.forEach(httpMessageConverter -> { 24 | if(httpMessageConverter instanceof StringHttpMessageConverter messageConverter){ 25 | //设置编码为UTF-8 26 | messageConverter.setDefaultCharset(StandardCharsets.UTF_8); 27 | } 28 | }); 29 | return restTemplate; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/config/TypeConfig.java: -------------------------------------------------------------------------------- 1 | package com.music.config; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | 5 | import java.util.Map; 6 | import java.util.concurrent.ConcurrentHashMap; 7 | 8 | /** 9 | * 评论类型配置 10 | */ 11 | public final class TypeConfig { 12 | 13 | public final static Map resourceTypeMap = CollUtil.newHashMap(); 14 | public final static Map t = new ConcurrentHashMap<>(); 15 | public final static String anonymous_token = "8aae43f148f990410b9a2af38324af24e87ab9227c9265627ddd10145db744295fcd8701dc45b1ab8985e142f491516295dd965bae848761274a577a62b0fdc54a50284d1e434dcc04ca6d1a52333c9a"; 16 | 17 | static { 18 | 19 | t.put("1","add"); 20 | t.put("0","delete"); 21 | t.put("2","reply"); 22 | 23 | resourceTypeMap.put("0","R_SO_4_"); 24 | resourceTypeMap.put("1","R_MV_5_"); 25 | resourceTypeMap.put("2","A_PL_0_"); 26 | resourceTypeMap.put("3","R_AL_3_"); 27 | resourceTypeMap.put("4","A_DJ_1_"); 28 | resourceTypeMap.put("5","R_VI_62_"); 29 | resourceTypeMap.put("6","A_EV_2_"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/enums/AesEncryptEnum.java: -------------------------------------------------------------------------------- 1 | package com.music.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public enum AesEncryptEnum { 9 | 10 | CBC("CBC"), ECB("ECB"); 11 | 12 | private final String type; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/api/CommentHugList.java: -------------------------------------------------------------------------------- 1 | package com.music.module.api; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.config.TypeConfig; 6 | import com.music.module.base.BaseModuleApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/7 16:43 14 | */ 15 | @Service 16 | public class CommentHugList implements BaseModuleApi { 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | 20 | cookies.put("os","ios"); 21 | cookies.put("appver","8.1.20"); 22 | String type = TypeConfig.resourceTypeMap.get(StrUtil.nullToDefault(queryMap.get("type"), "0")); 23 | String threadId = type + queryMap.get("sid"); 24 | 25 | object.set("targetUserId",queryMap.get("uid")); 26 | object.set("commentId",queryMap.get("cid")); 27 | object.set("threadId",threadId); 28 | object.set("cursor", StrUtil.nullToDefault(queryMap.get("cursor"),"-1")); 29 | object.set("pageNo", StrUtil.nullToDefault(queryMap.get("page"),"1")); 30 | object.set("idCursor", StrUtil.nullToDefault(queryMap.get("idCursor"),"-1")); 31 | object.set("pageSize", StrUtil.nullToDefault(queryMap.get("pageSize"),"100")); 32 | } 33 | 34 | @Override 35 | public String getUrl() { 36 | return "https://music.163.com/api/v2/resource/comments/hug/list"; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/api/HugComment.java: -------------------------------------------------------------------------------- 1 | package com.music.module.api; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.config.TypeConfig; 6 | import com.music.module.base.BaseModuleApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/7 16:43 14 | */ 15 | @Service 16 | public class HugComment implements BaseModuleApi { 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | 20 | cookies.put("os","ios"); 21 | cookies.put("appver","8.1.20"); 22 | String type = TypeConfig.resourceTypeMap.get(StrUtil.nullToDefault(queryMap.get("type"), "0")); 23 | String threadId = type + queryMap.get("sid"); 24 | 25 | object.set("targetUserId",queryMap.get("uid")); 26 | object.set("commentId",queryMap.get("cid")); 27 | object.set("threadId",threadId); 28 | } 29 | 30 | @Override 31 | public String getUrl() { 32 | return "https://music.163.com/api/v2/resource/comments/hug/listener"; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/api/PlaylistDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.api; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/7 16:43 13 | * @description 歌单详情 14 | */ 15 | @Service 16 | public class PlaylistDetail implements BaseModuleApi { 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | object.set("id",queryMap.get("id") ); 20 | object.set("n",100000); 21 | object.set("s", StrUtil.nullToDefault(queryMap.get("s"),"8")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/v6/playlist/detail"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/api/Toplist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.api; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/7 16:37 12 | * @description 所有榜单介绍 13 | */ 14 | @Service 15 | public class Toplist implements BaseModuleApi { 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/api/toplist"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModule.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | import cn.hutool.json.JSONObject; 4 | 5 | import java.util.Map; 6 | 7 | public interface BaseModule { 8 | 9 | /** 10 | * 构建参数 11 | * @param object json参数体 12 | * @param queryMap 查询的参数 13 | * @param cookies cookies 14 | */ 15 | void execute (JSONObject object,Map queryMap,Map cookies); 16 | 17 | /** 18 | * 获取url 19 | * @return yrl 20 | */ 21 | String getUrl(); 22 | 23 | /** 24 | * 获取类型 25 | * @return weapi,api,wapi 26 | */ 27 | String getType(); 28 | 29 | /** 30 | * 获取eapi的构造url 31 | * @return url 32 | */ 33 | String getOptionsUrl(); 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModuleApi.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | public interface BaseModuleApi extends BaseModule { 4 | 5 | @Override 6 | default String getType(){ 7 | return "api"; 8 | } 9 | 10 | @Override 11 | default String getOptionsUrl() { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModuleEApi.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | public interface BaseModuleEApi extends BaseModule { 4 | 5 | @Override 6 | default String getType(){ 7 | return "eapi"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModuleGetType.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | public interface BaseModuleGetType extends BaseModule { 4 | 5 | @Override 6 | default String getType(){ 7 | return null; 8 | } 9 | 10 | @Override 11 | default String getOptionsUrl(){ 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModuleNoType.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | public interface BaseModuleNoType extends BaseModule { 4 | 5 | @Override 6 | default String getType(){ 7 | return null; 8 | } 9 | 10 | @Override 11 | default String getOptionsUrl(){ 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/BaseModuleWeApi.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | public interface BaseModuleWeApi extends BaseModule { 4 | 5 | @Override 6 | default String getType(){ 7 | return "weapi"; 8 | } 9 | 10 | @Override 11 | default String getOptionsUrl() { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/base/InitModule.java: -------------------------------------------------------------------------------- 1 | package com.music.module.base; 2 | 3 | import lombok.AllArgsConstructor; 4 | import org.springframework.beans.BeansException; 5 | import org.springframework.context.ApplicationContext; 6 | import org.springframework.context.ApplicationContextAware; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Locale; 10 | import java.util.Map; 11 | 12 | /** 13 | * 获取应用上下文并获取相应的接口实现类 14 | */ 15 | @Component 16 | @AllArgsConstructor 17 | public class InitModule implements ApplicationContextAware { 18 | 19 | /** 20 | * 用于保存接口实现类名及对应的类 21 | */ 22 | private final Map map; 23 | 24 | /** 25 | * 获取应用上下文并获取相应的接口实现类 26 | */ 27 | @Override 28 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 29 | Map oldMap = applicationContext.getBeansOfType(BaseModule.class); 30 | for (Map.Entry entry : oldMap.entrySet()) { 31 | String key = entry.getKey(); 32 | BaseModule value = entry.getValue(); 33 | map.put(key.toLowerCase(Locale.ROOT),value); 34 | } 35 | } 36 | 37 | /** 38 | * 获取所有实现集合 39 | */ 40 | public Map getMap() { 41 | return map; 42 | } 43 | 44 | /** 45 | * 获取对应服务 46 | */ 47 | public BaseModule getService(String key) { 48 | return map.get(key); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/ActivateInitProfile.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 初始化昵称 11 | */ 12 | @Service 13 | public class ActivateInitProfile implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute (JSONObject object,Map queryMap,Map cookies) { 17 | object.set("nickname",queryMap.get("nickname")); 18 | } 19 | 20 | @Override 21 | public String getUrl() { 22 | return "https://music.163.com/eapi/activate/initProfile"; 23 | } 24 | 25 | @Override 26 | public String getOptionsUrl() { 27 | return "/api/activate/initProfile"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/CellphoneExistenceCheck.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 检测手机号码是否已注册 11 | */ 12 | @Service 13 | public class CellphoneExistenceCheck implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | object.set("cellphone",queryMap.get("phone")); 18 | object.set("countrycode",queryMap.get("countrycode")); 19 | } 20 | 21 | @Override 22 | public String getUrl() { 23 | return "https://music.163.com/eapi/cellphone/existence/check"; 24 | } 25 | 26 | @Override 27 | public String getOptionsUrl() { 28 | return "/api/cellphone/existence/check"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/CommentNew.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.core.util.NumberUtil; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.json.JSONObject; 6 | import com.music.config.TypeConfig; 7 | import com.music.module.base.BaseModuleEApi; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | * 评论 14 | */ 15 | @Service 16 | public class CommentNew implements BaseModuleEApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | String type = TypeConfig.resourceTypeMap.get(queryMap.get("type")); 23 | object.set("threadId",type + queryMap.get("id")); 24 | object.set("pageSize", StrUtil.nullToDefault(queryMap.get("pageSize"),"20")); 25 | object.set("showInner", StrUtil.nullToDefault(queryMap.get("showInner"),"true")); 26 | object.set("pageNo", StrUtil.nullToDefault(queryMap.get("pageNo"),"1")); 27 | String cursor; 28 | if (StrUtil.equals(queryMap.get("sortType"),"3")){ 29 | cursor = StrUtil.nullToDefault(queryMap.get("cursor"), "0"); 30 | }else { 31 | cursor = NumberUtil.mul(StrUtil.nullToDefault(queryMap.get("pageNo"), "1"), StrUtil.nullToDefault(queryMap.get("pageSize"), "20")).toString(); 32 | } 33 | object.set("cursor", cursor); 34 | object.set("sortType", queryMap.get("sortType")); 35 | 36 | } 37 | 38 | @Override 39 | public String getUrl() { 40 | return "https://music.163.com/api/v2/resource/comments"; 41 | } 42 | 43 | @Override 44 | public String getOptionsUrl() { 45 | return "/api/v2/resource/comments"; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/CountriesCodeList.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 国家编码列表 11 | */ 12 | @Service 13 | public class CountriesCodeList implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | } 18 | 19 | @Override 20 | public String getUrl() { 21 | return "https://interface3.music.163.com/eapi/lbs/countries/v1"; 22 | } 23 | 24 | @Override 25 | public String getOptionsUrl() { 26 | return "/api/lbs/countries/v1"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/HomepageDragonBall.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.config.TypeConfig; 5 | import com.music.module.base.BaseModuleEApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 首页-发现 dragon ball 12 | * 这个接口为移动端接口,首页-发现页(每日推荐、歌单、排行榜 那些入口) 13 | * !需要登录或者匿名登录,非登录返回 [] 14 | */ 15 | @Service 16 | public class HomepageDragonBall implements BaseModuleEApi { 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | 21 | if (queryMap.containsKey("MUSIC_U") || queryMap.containsValue("MUSIC_U")) { 22 | cookies.put("MUSIC_A", TypeConfig.anonymous_token); 23 | } 24 | cookies.put("os", "ios"); 25 | cookies.put("appver", "8.1.20"); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/eapi/homepage/dragon/ball/static"; 31 | } 32 | 33 | @Override 34 | public String getOptionsUrl() { 35 | return "/api/homepage/dragon/ball/static"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/PlaylistDescUpdate.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 更新歌单描述 11 | */ 12 | @Service 13 | public class PlaylistDescUpdate implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | 18 | object.set("id",queryMap.get("id")); 19 | object.set("desc",queryMap.get("desc")); 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://interface3.music.163.com/eapi/playlist/desc/update"; 25 | } 26 | 27 | @Override 28 | public String getOptionsUrl() { 29 | return "/api/playlist/desc/update"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/PlaylistNameUpdate.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 更新歌单名 11 | */ 12 | @Service 13 | public class PlaylistNameUpdate implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | 18 | object.set("id",queryMap.get("id")); 19 | object.set("name",queryMap.get("name")); 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://interface3.music.163.com/eapi/playlist/update/name"; 25 | } 26 | 27 | @Override 28 | public String getOptionsUrl() { 29 | return "/api/playlist/update/name"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/PlaylistTagsUpdate.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 更新歌单标签 11 | */ 12 | @Service 13 | public class PlaylistTagsUpdate implements BaseModuleEApi { 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | 18 | object.set("id",queryMap.get("id")); 19 | object.set("tags",queryMap.get("tags")); 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://interface3.music.163.com/eapi/playlist/tags/update"; 25 | } 26 | 27 | @Override 28 | public String getOptionsUrl() { 29 | return "/api/playlist/tags/update"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/SearchDefault.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleEApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 默认搜索关键词 11 | */ 12 | @Service 13 | public class SearchDefault implements BaseModuleEApi { 14 | @Override 15 | public void execute(JSONObject object, Map queryMap, Map cookies) { 16 | 17 | } 18 | 19 | @Override 20 | public String getUrl() { 21 | return "https://interface3.music.163.com/eapi/search/defaultkeyword/get"; 22 | } 23 | 24 | @Override 25 | public String getOptionsUrl() { 26 | return "/api/search/defaultkeyword/get"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/SongUrl.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleEApi; 6 | import com.music.util.CryptoUtil; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * 歌曲链接 13 | */ 14 | @Service 15 | public class SongUrl implements BaseModuleEApi { 16 | @Override 17 | public void execute(JSONObject object, Map queryMap, Map cookies) { 18 | cookies.put("os","pc"); 19 | if (!queryMap.containsKey("MUSIC_U") || !queryMap.containsValue("MUSIC_U")) { 20 | cookies.put("_ntes_nuid", CryptoUtil.strToHex(CryptoUtil.createSecretKey())); 21 | } 22 | object.set("br", StrUtil.nullToDefault(queryMap.get("br"),"999000")); 23 | object.set("id",queryMap.get("id")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://interface3.music.163.com/eapi/song/enhance/player/url"; 29 | } 30 | 31 | @Override 32 | public String getOptionsUrl() { 33 | return "/api/song/enhance/player/url"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/eapi/UserFolloweds.java: -------------------------------------------------------------------------------- 1 | package com.music.module.eapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleEApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 关注TA的人(粉丝) 12 | */ 13 | @Service 14 | public class UserFolloweds implements BaseModuleEApi { 15 | 16 | private String uid; 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | uid = queryMap.get("uid"); 20 | object.set("userId",queryMap.get("uid")); 21 | object.set("time",queryMap.get("0")); 22 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 23 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 24 | object.set("getcounts",queryMap.get("true")); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/eapi/user/getfolloweds/" + this.uid; 30 | } 31 | 32 | @Override 33 | public String getOptionsUrl() { 34 | return "/api/user/getfolloweds"; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/get/LoginQrCreate.java: -------------------------------------------------------------------------------- 1 | package com.music.module.get; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleNoType; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 二维码 12 | */ 13 | @Service 14 | public class LoginQrCreate implements BaseModuleNoType { 15 | 16 | private String key; 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | this.key = queryMap.get("key"); 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/login?codekey=" + this.key; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/notype/Banner.java: -------------------------------------------------------------------------------- 1 | package com.music.module.notype; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleNoType; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 首页轮播图 12 | */ 13 | @Service 14 | public class Banner implements BaseModuleNoType { 15 | 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | 20 | if (StrUtil.isEmpty(queryMap.get("type"))) { 21 | object.set("clientType", "pc"); 22 | }else if (StrUtil.equals("0",queryMap.get("type"))){ 23 | object.set("clientType", "pc"); 24 | }else if (StrUtil.equals("1",queryMap.get("type"))){ 25 | object.set("clientType", "android"); 26 | }else if (StrUtil.equals("2",queryMap.get("type"))){ 27 | object.set("clientType", "iphone"); 28 | }else if (StrUtil.equals("3",queryMap.get("type"))){ 29 | object.set("clientType", "ipad"); 30 | }else { 31 | object.set("clientType", "pc"); 32 | } 33 | } 34 | 35 | @Override 36 | public String getUrl() { 37 | return "https://music.163.com/api/v2/banner/get" ; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Album.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 专辑内容 13 | */ 14 | @Service 15 | public class Album implements BaseModuleWeApi { 16 | 17 | private String url; 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | this.url = queryMap.get("id"); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/weapi/v1/album/" + this.url; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 数字专辑详情 13 | */ 14 | @Service 15 | public class AlbumDetail implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/weapi/vipmall/albumproduct/detail"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumDetailDynamic.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 专辑动态信息 13 | */ 14 | @Service 15 | public class AlbumDetailDynamic implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/album/detail/dynamic"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumList.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 数字专辑-新碟上架 14 | */ 15 | @Service 16 | public class AlbumList implements BaseModuleWeApi { 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 21 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 22 | object.set("total", queryMap.get("true")); 23 | object.set("area", StrUtil.nullToDefault(queryMap.get("area"),"ALL")); 24 | object.set("type", queryMap.get("type")); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/weapi/vipmall/albumproduct/list"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumListStyle.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 数字专辑-语种风格馆 14 | */ 15 | @Service 16 | public class AlbumListStyle implements BaseModuleWeApi { 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"10")); 21 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 22 | object.set("total", queryMap.get("true")); 23 | object.set("area", StrUtil.nullToDefault(queryMap.get("area"),"Z_H")); 24 | //Z_H:华语,E_A:欧美,KR:韩国,JP:日本 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/weapi/vipmall/appalbum/album/style"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumNew.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 全部新碟 14 | */ 15 | @Service 16 | public class AlbumNew implements BaseModuleWeApi { 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"10")); 21 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 22 | object.set("total", queryMap.get("true")); 23 | object.set("area", StrUtil.nullToDefault(queryMap.get("area"),"ALL")); 24 | //Z_H:华语,E_A:欧美,KR:韩国,JP:日本 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/weapi/album/new"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumNewest.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 最新专辑 13 | */ 14 | @Service 15 | public class AlbumNewest implements BaseModuleWeApi { 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | } 20 | 21 | @Override 22 | public String getUrl() { 23 | return "https://music.163.com/api/discovery/newAlbum"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumSongsaleboard.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 数字专辑&数字单曲-榜单 14 | */ 15 | @Service 16 | public class AlbumSongsaleboard implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | 22 | object.set("albumType", StrUtil.nullToDefault(queryMap.get("queryMap"),"0")); 23 | var type = StrUtil.nullToDefault(queryMap.get("type"),"daily"); // daily,week,year,total 24 | this.url = type; 25 | if (type.equals("year")) { 26 | object.set("year",queryMap.get("year")); 27 | } 28 | } 29 | 30 | @Override 31 | public String getUrl() { 32 | return "https://music.163.com/api/feealbum/songsaleboard/"+ url +"/type"; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumSub.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 收藏/取消收藏专辑 13 | */ 14 | @Service 15 | public class AlbumSub implements BaseModuleWeApi { 16 | 17 | private String url; 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | 21 | this.url = "1".equals(queryMap.get("t")) ? "sub" : "unsub"; 22 | object.set("id", queryMap.get("id")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/api/album/" + this.url; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AlbumSublist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 已收藏专辑列表 14 | */ 15 | @Service 16 | public class AlbumSublist implements BaseModuleWeApi { 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"25")); 21 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 22 | object.set("total", true); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/weapi/album/sublist"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistAlbum.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 歌手专辑列表 14 | */ 15 | @Service 16 | public class ArtistAlbum implements BaseModuleWeApi { 17 | 18 | private String url; 19 | 20 | @Override 21 | public void execute(JSONObject object, Map queryMap, Map cookies) { 22 | this.url = queryMap.get("id"); 23 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 24 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 25 | object.set("total", true); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/weapi/artist/albums/" + this.url ; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistDesc.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 歌手介绍 13 | */ 14 | @Service 15 | public class ArtistDesc implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/weapi/artist/introduction" ; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 歌手介绍 13 | */ 14 | @Service 15 | public class ArtistDetail implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/artist/head/info/get" ; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistList.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.NumberUtil; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.json.JSONObject; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Locale; 10 | import java.util.Map; 11 | 12 | /** 13 | * @author wjning 14 | * @date 2021/6/8 9:24 15 | * @description 歌手分类 16 | * type 取值 17 | * 1:男歌手 18 | * 2:女歌手 19 | * 3:乐队 20 | * 21 | * area 取值 22 | * -1:全部 23 | * 7华语 24 | * 96欧美 25 | * 8:日本 26 | * 16韩国 27 | * 0:其他 28 | * 29 | * initial 取值 a-z/A-Z 30 | */ 31 | @Service 32 | public class ArtistList implements BaseModuleWeApi { 33 | 34 | 35 | @Override 36 | public void execute(JSONObject object, Map queryMap, Map cookies) { 37 | object.set("area", queryMap.get("area")); 38 | object.set("type", StrUtil.nullToDefault(queryMap.get("type"),"1")); 39 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 40 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 41 | object.set("total", true); 42 | 43 | boolean initial = NumberUtil.isNumber(queryMap.get("initial")); 44 | if (initial) object.set("initial", queryMap.get("initial")); 45 | else { 46 | int code = StrUtil.nullToEmpty(queryMap.get("initial")).toUpperCase(Locale.ROOT).codePointAt(0); 47 | object.set("initial", code); 48 | } 49 | } 50 | 51 | @Override 52 | public String getUrl() { 53 | return "https://music.163.com/api/v1/artist/list" ; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistMv.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 歌手相关MV 13 | */ 14 | @Service 15 | public class ArtistMv implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("artistId", queryMap.get("id")); 21 | object.set("limit", queryMap.get("limit")); 22 | object.set("offset", queryMap.get("offset")); 23 | object.set("total", true); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/artist/mvs" ; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistNewMv.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.date.DateTime; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.json.JSONObject; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/8 9:24 14 | * @description 歌手相关新MV 15 | */ 16 | @Service 17 | public class ArtistNewMv implements BaseModuleWeApi { 18 | 19 | 20 | @Override 21 | public void execute(JSONObject object, Map queryMap, Map cookies) { 22 | cookies.put("os", "ios"); 23 | cookies.put("appver", "8.1.20"); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("startTimestamp", StrUtil.nullToDefault(queryMap.get("before"), DateTime.now().getTime() + "")); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/api/sub/artist/new/works/mv/list" ; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistNewSong.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.date.DateTime; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.json.JSONObject; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/8 9:24 14 | * @description 歌手相关新歌曲 15 | */ 16 | @Service 17 | public class ArtistNewSong implements BaseModuleWeApi { 18 | 19 | 20 | @Override 21 | public void execute(JSONObject object, Map queryMap, Map cookies) { 22 | cookies.put("os", "ios"); 23 | cookies.put("appver", "8.1.20"); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("startTimestamp", StrUtil.nullToDefault(queryMap.get("before"), DateTime.now().getTime() + "")); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/api/sub/artist/new/works/song/list" ; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistSongs.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 歌手相关歌曲 14 | */ 15 | @Service 16 | public class ArtistSongs implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os", "pc"); 22 | object.set("id", queryMap.get("id")); 23 | object.set("private_cloud", true); 24 | object.set("work_type", 1); 25 | object.set("order", StrUtil.nullToDefault(queryMap.get("order"),"hot")); 26 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 27 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 28 | } 29 | 30 | @Override 31 | public String getUrl() { 32 | return "https://music.163.com/api/v1/artist/songs" ; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistSub.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 收藏与取消收藏歌手 13 | */ 14 | @Service 15 | public class ArtistSub implements BaseModuleWeApi { 16 | 17 | private String url; 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | this.url = "1".equals(queryMap.get("t")) ? "sub" : "unsub"; 22 | object.set("artistId", queryMap.get("id")); 23 | object.set("artistIds","[" + queryMap.get("id") + "]"); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/artist/" + this.url ; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistSublist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 关注歌手列表 14 | */ 15 | @Service 16 | public class ArtistSublist implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"25")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | object.set("total", true); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/artist/sublist" ; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ArtistTopSong.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 歌手热门 50 首歌曲 13 | */ 14 | @Service 15 | public class ArtistTopSong implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/artist/top/song" ; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Artists.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 歌手单曲 13 | */ 14 | @Service 15 | public class Artists implements BaseModuleWeApi { 16 | 17 | private String url; 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | this.url = queryMap.get("id"); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/weapi/v1/artist/" + this.url ; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/AudioMatch.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | */ 12 | @Service 13 | public class AudioMatch implements BaseModuleWeApi { 14 | 15 | 16 | @Override 17 | public void execute(JSONObject object, Map queryMap, Map cookies) { 18 | cookies.put("os","pc"); 19 | object.set("algorithmCode", "shazam_v2"); 20 | object.set("times", 1); 21 | object.set("sessionId", "C999431ACDC84EDBB984763654E6F8D7"); 22 | object.set("duration", 3.3066249999999995); 23 | object.set("from", "recognize-song"); 24 | object.set("rawdata", "eJx10mtIU2EcBvDtnCwNMfO2klUSmSQ5ZugKW/v/0TIjJVdhDStbXpqXrhY5Kwhtrcwiut9VSqMUMxX6IFqsD92sD1YgWGHRBcowKrpnPa/v+drg4flt572ds2PQ6XQut7MwJ940w2TOyS0pzF+/BV/MJrNO+3TVLOHUzKx5iw3/H5uZ7yxegct3tTl7Cr6QEa0gZ/dZOFsvfe5YHe1D+yFZxpncqEj/cCdwoirdVxHNnZrX3xygU5g7Eh6I9uOx8Ch4y9FQjlKkDz1pYrFXIJLUOovFGcYivqJgXqaXDqu7Rzc0XzmZxG81B/fF8wRVusn2jN5rDnwca8tFhyAJP4L4qiI9vX8cWzEmVKzT/46qxNpIdZOZz2HNcHhSkZ3D4AjYFpfGFkX6+dB+FvcSBe/SWbkLPVnEOJ1DFelXxVVci/Wj4TsBLhrQ/LGoaU4HxsTA28L76Cc8Dfau/U6F6FgkyBDDJar0g8tesmOvOHioWeXXmme6l3MLbIIre6wciU5E2t/k8WVxHfHvuUWXsH4SPCv1NW1Cz0aivgYO34vw1AEvi3MlIw0xHl6JNVPEGW41UJsqPaXYYTuEnotMdHwYfv7CFR/i+aXmrY5wrlSkEwr+0EJ0GvLmdw4/RS9Amj93UAbGZMIF40ezE3PtcG/yBWrT3L6oh66hFyMXK4xsUKT7aufzapxnFTwiNc3Wis5Bdm+OYCvmOuHj/ZeoQPOI00PUrUjXpG+kMFU61tFFDvQaZOn5DH4mzoLw4Hsaj14rzu/K4jF66fSWTnJinW3wBvcveqjZN3iFjKp0qKuF1mi21keST3NtTcbwu1eG3Dussr9eemljLIco0tVH7HwA493wOr+FlIjfy+GvkR4uwfjt4v/6G8K3NX8K38lt6B1ISa+Bv2O8Fy69foZOovci2S4Lr1aku4P9OEWVTt9wgMQ7exgJ8JXyI0W694WFyuBjcH75XyrEXsfhg+ZSvqZIf/Lct8Wp0md2tJN4PifEfjcm8gu02Ptbj459eum8eg8bFWlLXTb/A+uo9bM="); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/api/music/audio/match" ; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Calendar.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.date.DateTime; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.json.JSONObject; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | */ 14 | @Service 15 | public class Calendar implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("startTime", StrUtil.nullToDefault(queryMap.get("startTime"), DateTime.now().getTime() + "")); 21 | object.set("endTime", StrUtil.nullToDefault(queryMap.get("endTime"), DateTime.now().getTime() + "")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/mcalendar/detail" ; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CaptchaSent.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 发送验证码 14 | */ 15 | @Service 16 | public class CaptchaSent implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("ctcode", StrUtil.nullToDefault(queryMap.get("ctcode"),"86")); 22 | object.set("cellphone", queryMap.get("phone")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/api/sms/captcha/sent"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CaptchaVerify.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 校验验证码 14 | */ 15 | @Service 16 | public class CaptchaVerify implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("ctcode", StrUtil.nullToDefault(queryMap.get("ctcode"),"86")); 22 | object.set("cellphone", queryMap.get("phone")); 23 | object.set("captcha", queryMap.get("captcha")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/sms/captcha/verify"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CheckMusic.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 数字专辑详情 14 | */ 15 | @Service 16 | public class CheckMusic implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("ids", "[" + queryMap.get("id") + "]"); 22 | object.set("br", StrUtil.nullToDefault(queryMap.get("id"),"999000")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/weapi/song/enhance/player/url"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CloudMatch.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | */ 13 | @Service 14 | public class CloudMatch implements BaseModuleWeApi { 15 | 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | cookies.put("os","ios"); 20 | cookies.put("appver","8.1.20"); 21 | object.set("userId", queryMap.get("uid")); 22 | object.set("songId", queryMap.get("sid")); 23 | object.set("adjustSongId", queryMap.get("asid")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/api/cloud/user/song/match"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Cloudsearch.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * 搜索 14 | */ 15 | @Service 16 | public class Cloudsearch implements BaseModuleWeApi { 17 | 18 | // 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("s", queryMap.get("keywords")); 22 | object.set("total", true); 23 | object.set("type", StrUtil.nullToDefault(queryMap.get("type"),"1")); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/api/cloudsearch/pc"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Comment.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.config.TypeConfig; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 发送与删除评论 14 | */ 15 | @Service 16 | public class Comment implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | 22 | cookies.put("os","pc"); 23 | this.url = TypeConfig.t.get(queryMap.get("t")); 24 | String type = TypeConfig.resourceTypeMap.get(queryMap.get("type")); 25 | 26 | if ("A_EV_2_".equals(type)) { 27 | object.set("threadId", queryMap.get("threadId")); 28 | }else { 29 | object.set("threadId", type + queryMap.get("id")); 30 | } 31 | 32 | if (this.url.equals("add")) { 33 | object.set("content", queryMap.get("content")); 34 | } 35 | if (this.url.equals("delete")) { 36 | object.set("commentId", queryMap.get("commentId")); 37 | } 38 | if (this.url.equals("reply")) { 39 | object.set("commentId", queryMap.get("commentId")); 40 | object.set("content", queryMap.get("content")); 41 | } 42 | 43 | 44 | object.set("id", queryMap.get("id")); 45 | } 46 | 47 | @Override 48 | public String getUrl() { 49 | return "https://music.163.com/weapi/resource/comments/" + this.url; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentAlbum.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 专辑评论 14 | */ 15 | @Service 16 | public class CommentAlbum implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | object.set("rid", queryMap.get("id")); 23 | this.url = queryMap.get("id"); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/v1/resource/comments/R_AL_3_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentDj.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台评论 14 | */ 15 | @Service 16 | public class CommentDj implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | object.set("rid", queryMap.get("id")); 23 | this.url = queryMap.get("id"); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/v1/resource/comments/A_DJ_1_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentEvent.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 获取动态评论 14 | */ 15 | @Service 16 | public class CommentEvent implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | 22 | this.url = queryMap.get("id"); 23 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 24 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 25 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/weapi/v1/resource/comments/" + this.url; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentFloor.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.config.TypeConfig; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/8 9:24 14 | * @description 获取动态评论 15 | */ 16 | @Service 17 | public class CommentFloor implements BaseModuleWeApi { 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | 22 | String type = TypeConfig.resourceTypeMap.get(queryMap.get("type")); 23 | object.set("parentCommentId",queryMap.get("parentCommentId")); 24 | object.set("threadId",type + queryMap.get("id")); 25 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 26 | object.set("time", StrUtil.nullToDefault(queryMap.get("time"),"-1")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/api/resource/comment/floor/get"; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentHot.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.config.TypeConfig; 6 | import com.music.module.base.BaseModuleWeApi; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author wjning 13 | * @date 2021/6/8 9:24 14 | * @description 热门评论 15 | */ 16 | @Service 17 | public class CommentHot implements BaseModuleWeApi { 18 | 19 | private String type; 20 | private String id; 21 | @Override 22 | public void execute(JSONObject object, Map queryMap, Map cookies) { 23 | 24 | cookies.put("os","pc"); 25 | this.type = TypeConfig.resourceTypeMap.get(queryMap.get("type")); 26 | this.id = queryMap.get("id"); 27 | 28 | object.set("rid",queryMap.get("id")); 29 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 30 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 31 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 32 | } 33 | 34 | @Override 35 | public String getUrl() { 36 | return "https://music.163.com/weapi/v1/resource/hotcomments/" + this.type + this.id; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentLike.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.config.TypeConfig; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 点赞与取消点赞评论 14 | */ 15 | @Service 16 | public class CommentLike implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | 22 | cookies.put("os","pc"); 23 | this.url = "1".equals(queryMap.get("t")) ? "like" : "unlike"; 24 | String type = TypeConfig.resourceTypeMap.get(queryMap.get("type")); 25 | object.set("commentId", queryMap.get("cid")); 26 | 27 | if ("A_EV_2_".equals(type)) { 28 | object.replace("threadId",queryMap.get("threadId")); 29 | }else { 30 | object.set("threadId", type + queryMap.get("id")); 31 | } 32 | } 33 | 34 | @Override 35 | public String getUrl() { 36 | return "https://music.163.com/weapi/v1/comment/" + this.url; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentMusic.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 歌曲评论 14 | */ 15 | @Service 16 | public class CommentMusic implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | this.url = queryMap.get("id"); 23 | object.set("rid",queryMap.get("id")); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/api/v1/resource/comments/R_SO_4_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentMv.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description MV评论 14 | */ 15 | @Service 16 | public class CommentMv implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | this.url = queryMap.get("id"); 23 | object.set("rid",queryMap.get("id")); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/v1/resource/comments/R_MV_5_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentPlaylist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 歌曲评论 14 | */ 15 | @Service 16 | public class CommentPlaylist implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | this.url = queryMap.get("id"); 23 | object.set("rid",queryMap.get("id")); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/v1/resource/comments/A_PL_0_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/CommentVideo.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 视频评论 14 | */ 15 | @Service 16 | public class CommentVideo implements BaseModuleWeApi { 17 | 18 | private String url; 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","pc"); 22 | this.url = queryMap.get("id"); 23 | object.set("rid",queryMap.get("id")); 24 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 25 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 26 | object.set("beforeTime", StrUtil.nullToDefault(queryMap.get("before"),"0")); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/v1/resource/comments/R_VI_62_" + this.url; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DailySignin.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 签到 12 | 0为安卓端签到 3点经验, 1为网页签到,2点经验 13 | 签到成功 {'android': {'point': 3, 'code': 200}, 'web': {'point': 2, 'code': 200}} 14 | 重复签到 {'android': {'code': -2, 'msg': '重复签到'}, 'web': {'code': -2, 'msg': '重复签到'}} 15 | 未登录 {'android': {'code': 301}, 'web': {'code': 301}} 16 | */ 17 | @Service 18 | public class DailySignin implements BaseModuleWeApi { 19 | 20 | 21 | @Override 22 | public void execute(JSONObject object, Map queryMap, Map cookies) { 23 | object.set("type", StrUtil.nullToDefault(queryMap.get("type"),"0")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/point/dailyTask"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DigitalAlbumOrdering.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 购买数字专辑 13 | */ 14 | @Service 15 | public class DigitalAlbumOrdering implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("business", "Album"); 21 | object.set("paymentMethod", queryMap.get("payment")); 22 | object.set("from", "web"); 23 | JSONObject subObject = new JSONObject(); 24 | subObject.set("business", "Album"); 25 | subObject.set("resourceID", queryMap.get("id")); 26 | subObject.set("quantity", queryMap.get("quantity")); 27 | object.set("digitalResources", subObject.toString()); 28 | } 29 | 30 | @Override 31 | public String getUrl() { 32 | return "https://music.163.com/api/ordering/web/digital"; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DigitalAlbumPurchased.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 我的数字专辑 14 | */ 15 | @Service 16 | public class DigitalAlbumPurchased implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | object.set("total", true); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/api/digitalAlbum/purchased"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjBanner.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台banner 13 | */ 14 | @Service 15 | public class DjBanner implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | cookies.put("os", "pc"); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/weapi/djradio/banner/get"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjCategoryExcludehot.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台非热门类型 13 | */ 14 | @Service 15 | public class DjCategoryExcludehot implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/weapi/djradio/category/excludehot"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjCategoryRecommend.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台推荐类型 13 | */ 14 | @Service 15 | public class DjCategoryRecommend implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/weapi/djradio/home/category/recommend"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjCatelist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台分类列表 13 | */ 14 | @Service 15 | public class DjCatelist implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/weapi/djradio/category/get"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台详情 13 | */ 14 | @Service 15 | public class DjDetail implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("rid")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/djradio/v2/get"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjHot.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 热门电台 14 | */ 15 | @Service 16 | public class DjHot implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/weapi/djradio/hot/v1"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjPaygift.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 付费电台 14 | */ 15 | @Service 16 | public class DjPaygift implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjPersonalizeRecommend.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台个性推荐 14 | */ 15 | @Service 16 | public class DjPersonalizeRecommend implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"6")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/djradio/personalize/rcmd"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjProgram.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台节目列表 14 | */ 15 | @Service 16 | public class DjProgram implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | object.set("radioId", queryMap.get("rid")); 24 | object.set("asc", queryMap.get("asc")); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/weapi/dj/program/byradio"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjProgramDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 电台节目详情 13 | */ 14 | @Service 15 | public class DjProgramDetail implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("id")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/dj/program/detail"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjProgramToplist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台节目榜 14 | */ 15 | @Service 16 | public class DjProgramToplist implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/api/program/toplist/v1"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjProgramToplistHours.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台24小时节目榜 14 | */ 15 | @Service 16 | public class DjProgramToplistHours implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/djprogram/toplist/hours"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjRadioHot.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 类别热门电台 14 | */ 15 | @Service 16 | public class DjRadioHot implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | object.set("cateId", queryMap.get("cateId")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/api/djradio/hot"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjRecommend.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 精选电台 13 | */ 14 | @Service 15 | public class DjRecommend implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/weapi/djradio/recommend/v1"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjRecommendType.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 精选电台分类 13 | * 有声书 10001 14 | * 知识技能 453050 15 | * 商业财经 453051 16 | * 人文历史 11 17 | * 外语世界 13 18 | * 亲子宝贝 14 19 | * 创作|翻唱 2001 20 | * 音乐故事 2 21 | * 3D|电子 10002 22 | * 相声曲艺 8 23 | * 情感调频 3 24 | * 美文读物 6 25 | * 脱口秀 5 26 | * 广播剧 7 27 | * 二次元 3001 28 | * 明星做主播 1 29 | * 娱乐|影视 4 30 | * 科技科学 453052 31 | * 校园|教育 4001 32 | * 旅途|城市 12 33 | */ 34 | @Service 35 | public class DjRecommendType implements BaseModuleWeApi { 36 | 37 | 38 | @Override 39 | public void execute(JSONObject object, Map queryMap, Map cookies) { 40 | object.set("cateId", queryMap.get("type")); 41 | } 42 | 43 | @Override 44 | public String getUrl() { 45 | return "https://music.163.com/weapi/djradio/recommend"; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjSub.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 订阅与取消电台 13 | */ 14 | @Service 15 | public class DjSub implements BaseModuleWeApi { 16 | 17 | private String url; 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("rid")); 21 | this.url = "1".equals(queryMap.get("t")) ? "sub" : "unsub"; 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/weapi/djradio/" + this.url; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjSublist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 订阅电台列表 14 | */ 15 | @Service 16 | public class DjSublist implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"30")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | object.set("total", true); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/djradio/get/subed"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjSubscriber.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台详情 14 | */ 15 | @Service 16 | public class DjSubscriber implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 22 | object.set("time", StrUtil.nullToDefault(queryMap.get("time"),"-1")); 23 | object.set("total", true); 24 | object.set("id", queryMap.get("id")); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/api/djradio/subscriber"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjTodayPerfered.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台今日优选 14 | */ 15 | @Service 16 | public class DjTodayPerfered implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("page", StrUtil.nullToDefault(queryMap.get("page"),"0")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/weapi/djradio/home/today/perfered"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjToplist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 新晋电台榜/热门电台榜 14 | */ 15 | @Service 16 | public class DjToplist implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | if (StrUtil.isEmpty(queryMap.get("type"))) { 24 | object.set("type", queryMap.get("0")); 25 | }else { 26 | if ("new".equals(queryMap.get("type"))) { 27 | object.set("type", queryMap.get("0")); 28 | }else if ("hot".equals(queryMap.get("type"))) { 29 | object.set("type", queryMap.get("1")); 30 | }else { 31 | object.set("type", queryMap.get("0")); 32 | } 33 | } 34 | } 35 | 36 | @Override 37 | public String getUrl() { 38 | return "https://music.163.com/api/djradio/toplist"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjToplistHours.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台24小时主播榜 14 | */ 15 | @Service 16 | public class DjToplistHours implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/dj/toplist/hours"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjToplistNewcomer.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台新人榜 14 | */ 15 | @Service 16 | public class DjToplistNewcomer implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/api/dj/toplist/newcomer"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjToplistPay.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 付费精品 14 | */ 15 | @Service 16 | public class DjToplistPay implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/djradio/toplist/pay"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/DjToplistPopular.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 电台最热主播榜 todo 14 | */ 15 | @Service 16 | public class DjToplistPopular implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"100")); 22 | } 23 | 24 | @Override 25 | public String getUrl() { 26 | return "https://music.163.com/api/dj/toplist/popular"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Event.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 动态 14 | */ 15 | @Service 16 | public class Event implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | object.set("pagesize", StrUtil.nullToDefault(queryMap.get("pagesize"),"20")); 22 | object.set("lasttime", StrUtil.nullToDefault(queryMap.get("lasttime"),"-1")); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/weapi/v1/event/get"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/EventDel.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 删除动态 13 | */ 14 | @Service 15 | public class EventDel implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | object.set("id", queryMap.get("evId")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/eapi/event/delete"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/EventForward.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 转发动态 13 | */ 14 | @Service 15 | public class EventForward implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | cookies.put("os","pc"); 21 | object.set("forwards", queryMap.get("forwards")); 22 | object.set("id", queryMap.get("evId")); 23 | object.set("eventUserId", queryMap.get("uid")); 24 | } 25 | 26 | @Override 27 | public String getUrl() { 28 | return "https://music.163.com/weapi/event/forward"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/FmTrash.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 垃圾桶 14 | */ 15 | @Service 16 | public class FmTrash implements BaseModuleWeApi { 17 | 18 | private String id; 19 | private String time; 20 | 21 | @Override 22 | public void execute(JSONObject object, Map queryMap, Map cookies) { 23 | this.id = queryMap.get("id"); 24 | this.time = StrUtil.nullToDefault(queryMap.get("time") , "25"); 25 | object.set("songId", queryMap.get("id")); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/weapi/radio/trash/add?alg=RT&songId=" + this.id + "&time=" + this.time; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Follow.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 关注与取消关注用户 14 | */ 15 | @Service 16 | public class Follow implements BaseModuleWeApi { 17 | 18 | private String t; 19 | private String id; 20 | 21 | @Override 22 | public void execute(JSONObject object, Map queryMap, Map cookies) { 23 | this.id = queryMap.get("id"); 24 | this.t = "1".equals(queryMap.get("t")) ? "follow" : "delfollow"; 25 | cookies.put("os","pc"); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/weapi/user/" + this.t + "/" + this.id; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/HistoryRecommendSongs.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author wjning 11 | * @date 2021/6/8 9:24 12 | * @description 历史每日推荐歌曲 13 | */ 14 | @Service 15 | public class HistoryRecommendSongs implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | cookies.put("os","ios"); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/discovery/recommend/songs/history/recent"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/HistoryRecommendSongsDetail.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author wjning 12 | * @date 2021/6/8 9:24 13 | * @description 历史每日推荐歌曲详情 14 | */ 15 | @Service 16 | public class HistoryRecommendSongsDetail implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","ios"); 22 | object.set("data", StrUtil.nullToEmpty(queryMap.get("date"))); 23 | } 24 | 25 | @Override 26 | public String getUrl() { 27 | return "https://music.163.com/api/discovery/recommend/songs/history/detail"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/HomepageBlockPage.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * // 首页-发现 block page 12 | * // 这个接口为移动端接口,首页-发现页,数据结构可以参考 https://github.com/hcanyz/flutter-netease-music-api/blob/master/lib/src/api/uncategorized/bean.dart#L259 HomeBlockPageWrap 13 | * // query.refresh 是否刷新数据 14 | */ 15 | @Service 16 | public class HomepageBlockPage implements BaseModuleWeApi { 17 | 18 | 19 | @Override 20 | public void execute(JSONObject object, Map queryMap, Map cookies) { 21 | cookies.put("os","ios"); 22 | cookies.put("appver","8.1.20"); 23 | object.set("cursor", queryMap.get("cursor")); 24 | object.set("refresh", StrUtil.nullToDefault(queryMap.get("refresh"),"false")); 25 | } 26 | 27 | @Override 28 | public String getUrl() { 29 | return "https://music.163.com/api/homepage/block/page"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/HotTopic.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 热门话题 12 | */ 13 | @Service 14 | public class HotTopic implements BaseModuleWeApi { 15 | 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | object.set("limit", StrUtil.nullToDefault(queryMap.get("limit"),"20")); 20 | object.set("offset", StrUtil.nullToDefault(queryMap.get("offset"),"0")); 21 | } 22 | 23 | @Override 24 | public String getUrl() { 25 | return "https://music.163.com/api/act/hot"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Like.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * 红心与取消红心歌曲 12 | */ 13 | @Service 14 | public class Like implements BaseModuleWeApi { 15 | 16 | 17 | @Override 18 | public void execute(JSONObject object, Map queryMap, Map cookies) { 19 | cookies.put("os","pc"); 20 | cookies.put("appver","2.7.1.198277"); 21 | String like = "false".equals(queryMap.get("like")) ? "false" : "true"; 22 | object.set("alg", "itembased"); 23 | object.set("trackId", queryMap.get("id")); 24 | object.set("time", "3"); 25 | object.set("like", like); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/api/radio/like"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Likelist.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 喜欢的歌曲(无序) 11 | */ 12 | @Service 13 | public class Likelist implements BaseModuleWeApi { 14 | 15 | 16 | @Override 17 | public void execute(JSONObject object, Map queryMap, Map cookies) { 18 | object.set("uid", queryMap.get("uid")); 19 | } 20 | 21 | @Override 22 | public String getUrl() { 23 | return "https://music.163.com/weapi/song/like/get"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/ListenTogetherStatus.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import com.music.module.base.BaseModuleWeApi; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * 一起听状态 11 | */ 12 | @Service 13 | public class ListenTogetherStatus implements BaseModuleWeApi { 14 | 15 | 16 | @Override 17 | public void execute(JSONObject object, Map queryMap, Map cookies) { 18 | } 19 | 20 | @Override 21 | public String getUrl() { 22 | return "https://music.163.com/api/listen/together/status/get"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/Login.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import com.music.util.CryptoUtil; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * 邮箱登录 13 | */ 14 | @Service 15 | public class Login implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | 21 | cookies.put("os","pc"); 22 | object.set("username",queryMap.get("email")); 23 | String password = StrUtil.nullToDefault(queryMap.get("md5_password"), CryptoUtil.getMd5(queryMap.get("password"))); 24 | object.set("rememberLogin",true); 25 | object.set("password",password); 26 | } 27 | 28 | @Override 29 | public String getUrl() { 30 | return "https://music.163.com/weapi/login"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/LoginCellphone.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import com.music.util.CryptoUtil; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * 手机登录 13 | */ 14 | @Service 15 | public class LoginCellphone implements BaseModuleWeApi { 16 | 17 | 18 | @Override 19 | public void execute(JSONObject object, Map queryMap, Map cookies) { 20 | 21 | cookies.put("os","pc"); 22 | object.set("phone",queryMap.get("phone")); 23 | object.set("countrycode",StrUtil.nullToDefault(queryMap.get("countrycode"),"86")); 24 | String password = StrUtil.nullToDefault(queryMap.get("md5_password"), CryptoUtil.getMd5(queryMap.get("password"))); 25 | object.set("rememberLogin",true); 26 | object.set("password",password); 27 | } 28 | 29 | @Override 30 | public String getUrl() { 31 | return "https://music.163.com/weapi/login/cellphone"; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/music/module/weapi/LoginQrCheck.java: -------------------------------------------------------------------------------- 1 | package com.music.module.weapi; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.BaseModuleWeApi; 6 | import com.music.util.CryptoUtil; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | @Service 12 | public class LoginQrCheck implements BaseModuleWeApi { 13 | 14 | 15 | @Override 16 | public void execute(JSONObject object, Map queryMap, Map cookies) { 17 | 18 | object.set("key",queryMap.get("key")); 19 | object.set("type",1); 20 | } 21 | 22 | @Override 23 | public String getUrl() { 24 | return "https://music.163.com/weapi/login/qrcode/client/login"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/music/service/BaseService.java: -------------------------------------------------------------------------------- 1 | package com.music.service; 2 | 3 | import org.springframework.http.ResponseEntity; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | 7 | public interface BaseService { 8 | 9 | ResponseEntity getMusicData(HttpServletRequest request); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/music/service/impl/BaseServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.music.service.impl; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.json.JSONObject; 5 | import com.music.module.base.*; 6 | import com.music.service.BaseService; 7 | import com.music.util.CookieUtil; 8 | import com.music.util.CryptoUtil; 9 | import com.music.util.RestTemplateUtil; 10 | import lombok.AllArgsConstructor; 11 | import lombok.extern.slf4j.Slf4j; 12 | import org.springframework.http.ResponseEntity; 13 | import org.springframework.stereotype.Service; 14 | import org.springframework.web.client.RestTemplate; 15 | 16 | import javax.servlet.http.HttpServletRequest; 17 | import java.util.Map; 18 | import java.util.concurrent.ConcurrentHashMap; 19 | 20 | @Slf4j 21 | @Service 22 | @AllArgsConstructor 23 | public class BaseServiceImpl implements BaseService { 24 | 25 | private final RestTemplate restTemplate; 26 | private final InitModule initModule; 27 | private final CookieUtil cookieUtil; 28 | 29 | @Override 30 | public ResponseEntity getMusicData(HttpServletRequest request) { 31 | Map cookies = cookieUtil.getCookies(request); 32 | Map queryMap = new ConcurrentHashMap<>(); 33 | if (StrUtil.isNotEmpty(request.getQueryString())) { 34 | String[] queryArray = request.getQueryString().split("&"); 35 | for (String query : queryArray) { 36 | if (query.contains("=")) { 37 | String[] split = query.split("="); 38 | queryMap.put(split[0],split[1]); 39 | } 40 | } 41 | } 42 | String key = request.getRequestURI() 43 | .replaceAll("music","") 44 | .replaceAll("/", ""); 45 | 46 | JSONObject object = new JSONObject(); 47 | object.set("csrf_token", cookies.get("__csrf")); 48 | BaseModule baseModule = initModule.getService(key); 49 | baseModule.execute(object,queryMap,cookies); 50 | 51 | if (baseModule instanceof BaseModuleApi) { 52 | 53 | return RestTemplateUtil.postApi(object, baseModule.getUrl(), cookies, restTemplate); 54 | } 55 | if (baseModule instanceof BaseModuleEApi) { 56 | 57 | final String param = CryptoUtil.eapiEncrypt(baseModule.getOptionsUrl(), object.toString()); 58 | return RestTemplateUtil.postEApi(param, 59 | baseModule.getUrl().replaceAll("api",baseModule.getOptionsUrl()), 60 | cookies, 61 | restTemplate); 62 | } 63 | if (baseModule instanceof BaseModuleWeApi) { 64 | 65 | String[] encrypt = CryptoUtil.weapiEncrypt(object.toString()); 66 | return RestTemplateUtil.postWeApi(encrypt[0], 67 | encrypt[1], 68 | baseModule.getUrl().replaceAll("/api","/" + baseModule.getType()) +"?csrf_token=", 69 | cookies, 70 | restTemplate); 71 | } 72 | 73 | if (baseModule instanceof BaseModuleGetType) { 74 | return RestTemplateUtil.get(baseModule.getUrl(),cookies,restTemplate); 75 | } 76 | return RestTemplateUtil.post(object, baseModule.getUrl(),cookies,restTemplate); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/music/util/CookieUtil.java: -------------------------------------------------------------------------------- 1 | package com.music.util; 2 | 3 | import cn.hutool.core.util.RandomUtil; 4 | import cn.hutool.core.util.StrUtil; 5 | import org.springframework.cache.annotation.CacheConfig; 6 | import org.springframework.cache.annotation.Cacheable; 7 | import org.springframework.http.HttpHeaders; 8 | import org.springframework.stereotype.Component; 9 | 10 | import javax.servlet.http.Cookie; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | 17 | @Component 18 | @CacheConfig(cacheNames = "cookies") 19 | public class CookieUtil { 20 | 21 | /** 22 | * 获取request中的Cookie对象Map 23 | */ 24 | @Cacheable(key = "#request.getSession().getId()") 25 | public Map getCookies(HttpServletRequest request) { 26 | 27 | Map cookieMap; 28 | 29 | Cookie[] cookies = request.getCookies(); 30 | cookieMap = new HashMap<>(); 31 | if (cookies != null) { 32 | for (Cookie cookie : cookies) { 33 | cookieMap.put(cookie.getName(), cookie.getValue()); 34 | } 35 | } 36 | /* 特殊处理__csrf */ 37 | cookieMap.putIfAbsent("__csrf", RandomUtil.randomStringUpper(10)); 38 | return cookieMap; 39 | } 40 | 41 | /** 42 | * 写入Cookie到response 43 | */ 44 | public static void setCookie(HttpHeaders httpHeaders, HttpServletResponse response) { 45 | List setCookie = httpHeaders.get("SET-COOKIE"); 46 | 47 | if (setCookie != null) { 48 | for (String string : setCookie) { 49 | String[] entry = StrUtil.split(string, ";"); 50 | if (entry.length > 0) { 51 | String[] ck = StrUtil.split(entry[0].trim(), "="); 52 | if (ck.length == 2) { 53 | if (StrUtil.isNotBlank(ck[1].trim())) { 54 | Cookie cookie = new Cookie(ck[0].trim(), ck[1].trim()); 55 | cookie.setPath("/"); 56 | cookie.setMaxAge(14 * 24 * 60 * 60); 57 | response.addCookie(cookie); 58 | } 59 | } 60 | } 61 | 62 | } 63 | } 64 | } 65 | 66 | 67 | 68 | } -------------------------------------------------------------------------------- /src/main/java/com/music/util/CryptoUtil.java: -------------------------------------------------------------------------------- 1 | package com.music.util; 2 | 3 | import com.music.enums.AesEncryptEnum; 4 | import lombok.NonNull; 5 | import org.apache.tomcat.util.buf.HexUtils; 6 | import org.springframework.util.DigestUtils; 7 | 8 | import javax.crypto.Cipher; 9 | import javax.crypto.spec.IvParameterSpec; 10 | import javax.crypto.spec.SecretKeySpec; 11 | import java.math.BigInteger; 12 | import java.nio.charset.StandardCharsets; 13 | import java.util.Base64; 14 | 15 | /** 16 | * api 三种模式加密解密 17 | */ 18 | public class CryptoUtil { 19 | 20 | private static final String presetKey = "0CoJUm6Qyw8W8jud"; 21 | private static final String pubKey = "010001"; 22 | private static final String modulus = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"; 23 | private static final String iv = "0102030405060708"; 24 | private static final String eapiKey = "e82ckenh8dichen8"; 25 | 26 | 27 | /** 28 | * 产生16位的随机字符串 29 | */ 30 | public static String createSecretKey() { 31 | 32 | String keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 33 | StringBuilder key = new StringBuilder(); 34 | for (int i = 0; i < 16; i++) { 35 | double index = Math.floor(Math.random() * keys.length()); 36 | key.append(keys.charAt((int) index)); 37 | } 38 | return key.toString(); 39 | } 40 | 41 | /** 42 | * aes加密 43 | * 44 | */ 45 | private static String aesEncrypt(@NonNull String content,@NonNull String key, AesEncryptEnum aesEncryptEnum, String iv) { 46 | 47 | String result = null; 48 | try { 49 | Cipher cipher = Cipher.getInstance("AES/" + aesEncryptEnum.getType() + "/PKCS5Padding"); 50 | byte[] bytes; 51 | 52 | switch (aesEncryptEnum) { 53 | case CBC -> { 54 | cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"), 55 | new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8))); 56 | bytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)); 57 | result = Base64.getEncoder().encodeToString(bytes); 58 | } 59 | case ECB -> { 60 | cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES")); 61 | bytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)); 62 | result = HexUtils.toHexString(bytes); 63 | } 64 | } 65 | 66 | } catch (Exception e) { 67 | e.printStackTrace(); 68 | } 69 | return result; 70 | 71 | } 72 | 73 | /** 74 | * 长度不够前面补充0 75 | */ 76 | private static String zFill(String str) { 77 | StringBuilder strBuilder = new StringBuilder(str); 78 | while (strBuilder.length() < 256) { 79 | strBuilder.insert(0, "0"); 80 | } 81 | str = strBuilder.toString(); 82 | return str; 83 | } 84 | 85 | /** 86 | * rsa加密 87 | */ 88 | private static String rsaEncrypt(String text) { 89 | 90 | // 反转字符串 91 | text = new StringBuffer(text).reverse().toString(); 92 | 93 | BigInteger biText = new BigInteger(strToHex(text), 16); 94 | BigInteger biEx = new BigInteger(CryptoUtil.pubKey, 16); 95 | BigInteger biMod = new BigInteger(CryptoUtil.modulus, 16); 96 | BigInteger biRet = biText.modPow(biEx, biMod); 97 | 98 | return zFill(biRet.toString(16)); 99 | 100 | } 101 | 102 | /** 103 | * 字符串转成16进制字符串 104 | */ 105 | public static String strToHex(String s) { 106 | StringBuilder str = new StringBuilder(); 107 | for (int i = 0; i < s.length(); i++) { 108 | int ch = s.charAt(i); 109 | String s4 = Integer.toHexString(ch); 110 | str.append(s4); 111 | } 112 | return str.toString(); 113 | } 114 | 115 | /** 116 | * 5 加密方法 117 | */ 118 | public static String eapiEncrypt(String url,String content) { 119 | 120 | String message = "nobody" + url + "use" + content + "md5forencrypt"; 121 | String digest = getMd5(message); 122 | String data = url + "-36cd479b6b5-" + content + "-36cd479b6b5-" + digest; 123 | return aesEncrypt(data, eapiKey, AesEncryptEnum.ECB, "").toUpperCase(); 124 | } 125 | 126 | /** 127 | * 5 加密方法 128 | */ 129 | public static String[] weapiEncrypt(String content) { 130 | String[] result = new String[2]; 131 | String key = createSecretKey(); 132 | 133 | String encText = aesEncrypt(aesEncrypt(content, presetKey, AesEncryptEnum.CBC, iv), key, AesEncryptEnum.CBC, 134 | iv); 135 | String encSecKey = rsaEncrypt(key); 136 | result[0] = encText; 137 | result[1] = encSecKey; 138 | return result; 139 | } 140 | 141 | /** 142 | * MD5加密 143 | * 144 | */ 145 | public static String getMd5(String content) { 146 | String result = null; 147 | try { 148 | result = DigestUtils.md5DigestAsHex(content.getBytes(StandardCharsets.UTF_8)); 149 | } catch (Exception e) { 150 | e.printStackTrace(); 151 | } 152 | return result; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/main/java/com/music/util/RestTemplateUtil.java: -------------------------------------------------------------------------------- 1 | package com.music.util; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import org.springframework.http.HttpEntity; 5 | import org.springframework.http.HttpHeaders; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.util.LinkedMultiValueMap; 8 | import org.springframework.util.MultiValueMap; 9 | import org.springframework.web.client.RestTemplate; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | public class RestTemplateUtil { 16 | 17 | /** 18 | * 产生随机的User Agent 19 | */ 20 | public static String getUserAgent() { 21 | String[] userAgentList = new String[] 22 | { 23 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", 24 | "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1", 25 | "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1", 26 | "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", 27 | "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", 28 | "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", 29 | "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89;GameHelper", 30 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4", 31 | "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1", 32 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", 33 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0", 34 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0", 35 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", 36 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", 37 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", 38 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)", 39 | "Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko", 40 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586", 41 | "Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1" 42 | }; 43 | 44 | double index = Math.floor(Math.random() * userAgentList.length); 45 | return userAgentList[(int) index]; 46 | } 47 | 48 | /** 49 | * 设置Headers 50 | */ 51 | public static HttpHeaders setHeaders(List cookies) { 52 | HttpHeaders headers = new HttpHeaders(); 53 | 54 | headers.add(HttpHeaders.ACCEPT, "*/*"); 55 | headers.add(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4"); 56 | headers.add(HttpHeaders.CONNECTION, "keep-alive"); 57 | headers.add(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); 58 | headers.add(HttpHeaders.REFERER, "https://music.163.com"); 59 | headers.add(HttpHeaders.HOST, "music.163.com"); 60 | headers.put(HttpHeaders.COOKIE, cookies); 61 | headers.add(HttpHeaders.USER_AGENT, getUserAgent()); 62 | return headers; 63 | } 64 | 65 | /** 66 | * 发送Post请求 67 | */ 68 | public static ResponseEntity post(JSONObject object, String url, Map cookies, RestTemplate restTemplate) { 69 | return postApi(object, url, cookies, restTemplate); 70 | } 71 | 72 | /** 73 | * 发送weapi Post请求 74 | */ 75 | public static ResponseEntity postWeApi(String params, String encSecKey, String url, Map cookies, RestTemplate restTemplate) { 76 | MultiValueMap map = new LinkedMultiValueMap<>(); 77 | map.add("params", params); 78 | map.add("encSecKey", encSecKey); 79 | List list = setCookies(cookies); 80 | HttpEntity> entity = new HttpEntity<>(map, setHeaders(list)); 81 | return restTemplate.postForEntity(url, entity, String.class); 82 | } 83 | 84 | /** 85 | * 针对eapi类型的接口请求 86 | */ 87 | public static ResponseEntity postEApi(String params,String url, Map cookies, RestTemplate restTemplate) { 88 | MultiValueMap map = new LinkedMultiValueMap<>(); 89 | map.add("params", params); 90 | List list = setCookies(cookies); 91 | HttpEntity> entity = new HttpEntity<>(map, setHeaders(list)); 92 | return restTemplate.postForEntity(url, entity, String.class); 93 | } 94 | 95 | /** 96 | * 针对api类型的接口请求 97 | */ 98 | public static ResponseEntity postApi(JSONObject object, String url, Map cookies, RestTemplate restTemplate) { 99 | MultiValueMap map = new LinkedMultiValueMap<>(); 100 | object.forEach(map::add); 101 | List list = setCookies(cookies); 102 | HttpEntity> entity = new HttpEntity<>(map, setHeaders(list)); 103 | return restTemplate.postForEntity(url, entity, String.class); 104 | } 105 | 106 | public static List setCookies(Map cookies){ 107 | List list = new ArrayList<>(); 108 | if (cookies != null) { 109 | cookies.forEach((k, v) -> list.add(k + "=" + v)); 110 | } 111 | return list; 112 | } 113 | 114 | /** 115 | * get请求 116 | */ 117 | public static ResponseEntity get(String url, Map cookies, RestTemplate restTemplate) { 118 | return restTemplate.getForEntity(url, String.class); 119 | } 120 | } -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/test/java/com/music/MusicJavaApiApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.music; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class MusicJavaApiApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | --------------------------------------------------------------------------------