├── .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 | [](https://github.com/jnwang95/music-java-api)
2 | [](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 |
--------------------------------------------------------------------------------