当前位置: 首页 > news >正文

springboot 整合酷狗获取MV视频最高画质(使用自己账户)

在此声明,本内容仅供个人学习、研究或娱乐之用,严禁任何形式的商业用途。若您发现本内容被用于商业目的,请立即删除,及时与小编联系,我们将删除原代码。

请根据上一篇文章使用该代码:SpringBoot 整合酷狗获取下载音乐(需要自己账户)-CSDN博客

1.KuGouUtil 工具类

    /*** mv搜索验签 (源码)*/public static String mvMd5SignSearch(String timestamp,KuGouHand hand) {String[] signatureList = {"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid="+hand.getAppid(),"clienttime="+timestamp,"clientver=20000","dfid="+hand.getDfid(),"mid="+hand.getMid(),"mvid="+hand.getMvid(),"srcappid="+hand.getSrcappid(),"userid="+hand.getUserid(),"uuid="+hand.getUuid(),"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"};StringBuilder stringBuilder = new StringBuilder();for (String s : signatureList) {stringBuilder.append(s);}String string = stringBuilder.toString();return getMD5(string);}/*** 获取Mv信息 (源码)*/public static List<KuGoMv> getKuGouMvList(Headers headers,long timestamp, KuGouHand hand) throws IOException {List<KuGoMv> kuGoMvList = new ArrayList<>();String sign = mvMd5SignSearch(String.valueOf(timestamp),hand);LinkedHashMap<String, String> param = new LinkedHashMap<>();param.put("srcappid", hand.getSrcappid());param.put("clientver", "20000");param.put("clienttime", String.valueOf(timestamp));param.put("mid", hand.getMid());param.put("uuid", hand.getUuid());param.put("dfid",hand.getDfid());param.put("appid", hand.getAppid());param.put("mvid", hand.getMvid());param.put("userid", hand.getUserid());param.put("signature", sign);OkHttpClient client = new OkHttpClient();String url = "https://gateway.kugou.com/mixedvideo/v1/relatedVideo/list" + GetParams(param);Request request = new Request.Builder().url(url).headers(headers).build();Response response = client.newCall(request).execute();String responseBody = response.body().string();if (response.isSuccessful()) {Gson gson = new Gson();Type type = new TypeToken<Map<String, Object>>() {}.getType();Map<String, Object> map = gson.fromJson(responseBody, type);if (String.valueOf(map.get("errcode")) =="0.0" || String.valueOf(map.get("errcode"))=="0"){kuGoMvList = JSON.parseArray(JSON.toJSONString(map.get("data")), KuGoMv.class);for (KuGoMv item:kuGoMvList){item.setPlayDuration(getSeconds(item.getDuration()/1000));}return kuGoMvList;}}return kuGoMvList;}/*** 获取MV 播放地址的MD5验签 (源码)*/public static String setMvMd5Sign(long timestamp,KuGouHand hand) {String[] signatureList = {"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid="+hand.getAppid(),"clienttime="+timestamp,"clientver=1000","dfid="+hand.getDfid(),"id="+hand.getMvid(),"mid="+hand.getMid(),"srcappid="+hand.getSrcappid(),"uuid="+hand.getUuid(),"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"};StringBuilder stringBuilder = new StringBuilder();for (String s : signatureList) {stringBuilder.append(s);}String string = stringBuilder.toString();return getMD5(string);}/*** 获取酷狗音乐播放地址MV (源码)*/public static KuGoMv getKuGouMvMp4(Headers headers,long timestamp,KuGouHand hand,KuGoMv kuGoMv) throws IOException {String sign = setMvMd5Sign(timestamp,hand);LinkedHashMap<String, String> param = new LinkedHashMap<>();param.put("srcappid", hand.getSrcappid());param.put("clientver", "1000");param.put("clienttime", String.valueOf(timestamp));param.put("mid", hand.getMid());param.put("uuid", hand.getUuid());param.put("dfid",hand.getDfid());param.put("appid", hand.getAppid());param.put("id", hand.getMvid());param.put("signature", sign);OkHttpClient client = new OkHttpClient();String url = "https://wwwapi.kugou.com/play/mv" + GetParams(param);Request request = new Request.Builder().url(url).headers(headers).build();Response response = client.newCall(request).execute();String responseBody = response.body().string();if (response.isSuccessful()) {Gson gson = new Gson();Type type = new TypeToken<Map<String, Object>>() {}.getType();Map<String, Object> map = gson.fromJson(responseBody, type);String code = map.get("status").toString().replace(".0","");if (code.equals("1")){Map<String, Object> map2 = gson.fromJson(JSON.toJSONString(map.get("data")), type);Type type2 = new TypeToken<Map<String, Map<String,Object>>>() {}.getType();HashMap<String,Map<String,Object>> privileges = JSON.parseObject(JSON.toJSONString(map2.get("privilege")), type2);HashMap<String,Map<String,Object>> plays = JSON.parseObject(JSON.toJSONString(map2.get("play")), type2);if (privileges.size()>=1 && plays.size()>=1){Integer level = 0;String hashName = "";for (Map.Entry<String, Map<String, Object>> entry : privileges.entrySet()) {Map<String, Object> value = entry.getValue();Integer innerValue = Integer.parseInt(String.valueOf(value.get("level")).replace(".0",""));if (innerValue >=level){level=innerValue;hashName = entry.getKey();String[] mvList = String.valueOf(value.get("name")).split("-");kuGoMv.setMvName(mvList[1]);kuGoMv.setSingerName(String.valueOf(value.get("singer_name")));kuGoMv.setLevel(innerValue);}}for (Map.Entry<String, Map<String, Object>> entry : plays.entrySet()) {Map<String, Object> value = entry.getValue();if (entry.getKey().equals(hashName)){kuGoMv.setDownUrl(String.valueOf(value.get("downurl")));kuGoMv.setPlayUrl(value.get("backupdownurl"));}}return kuGoMv;}}}return kuGoMv;}

 2.ToolUtil

   /*** duration 时长转分秒*/public static String getSeconds(Integer num){try {long totalSeconds = Duration.ofSeconds(num).getSeconds();long minutes = totalSeconds / 60;long seconds = totalSeconds % 60;return String.format("%d:%02d", minutes, seconds);}catch (Exception e){return String.valueOf(num);}}/*** 参数装换GET*/public static String GetParams(Map<String, String> params) {StringBuilder result = new StringBuilder();for (Map.Entry<String, String> entry : params.entrySet()) {if (result.length() > 0) {result.append("&");}result.append(entry.getKey()).append("=").append(entry.getValue());}return "?"+result.toString();}/*** 获取所有请求头信息* type true 代表开启条件设置*/public static Headers getHeaders(HttpServletRequest request,String[] strings,Boolean type ) {Headers.Builder headersBuilder = new Headers.Builder();Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String headerName = headerNames.nextElement();if (type){if (strings.toString().contains(headerName)) {Enumeration<String> v = request.getHeaders(headerName);while (v.hasMoreElements()) {String value = v.nextElement();headersBuilder.add(headerName, value);}}}else {Enumeration<String> v = request.getHeaders(headerName);while (v.hasMoreElements()) {String value = v.nextElement();headersBuilder.add(headerName, value);}}}return headersBuilder.build();}

相关文章:

springboot 整合酷狗获取MV视频最高画质(使用自己账户)

在此声明&#xff0c;本内容仅供个人学习、研究或娱乐之用&#xff0c;严禁任何形式的商业用途。若您发现本内容被用于商业目的&#xff0c;请立即删除&#xff0c;及时与小编联系&#xff0c;我们将删除原代码。 请根据上一篇文章使用该代码&#xff1a;SpringBoot 整合酷狗获…...

数字孪生平台,助力制造设备迈入超感知与智控新时代!

痛点剖析 当前&#xff0c;制造业面临系统分散导致的数据孤岛问题&#xff0c;严重阻碍了有效监管与统计分析&#xff1b;同时&#xff0c;设备多样化且兼容性不足&#xff0c;增加了管理难度&#xff1b;台账记录方式混乱&#xff0c;工单审批流程繁琐且效率低下&#xff1b;…...

音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…...

pycirclize python包画circos环形图

pycirclize python包画circos环形图 很多小伙伴都有画环形图的需求&#xff0c;网上也有很多画环形图的教程&#xff0c;讲解circos软件和circlize R包的比较多&#xff0c;本文介绍一款python包:pyCirclize。适合喜欢python且希望更灵活作图的小伙伴。 pyCirclize包实际上也…...

Redis Sorted Set 跳表的实现原理和分析

跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;基于有序链表&#xff0c;通过在链表上增加多级索引来提高数据的查找效率。它是由 William Pugh 在 1990 年提出的。 为什么 Redis 中的 Sorted Set 使用跳跃表 Redis 的有序集合&#xff08;Sorted …...

新手教学系列——在MySQL分表中批量调整表结构的实践与优化

在当今的互联网业务中,随着数据量的不断增长,单个数据库的处理能力往往难以满足高并发、高性能的要求。因此,分库分表已经成为解决数据库扩展性问题的主流方案之一。然而,分表虽然能有效提升数据库的读写性能,但也带来了一个新的挑战:当业务需求变化时,需要对大量分表进…...

解决事务提交延迟问题:Spring中的事务绑定事件监听机制解析

目录 一、背景二、事务绑定事件介绍三、事务绑定事件原理四、结语 一、背景 实际工作中碰到一个场景&#xff0c;现存系统有10w张卡需要进行换卡&#xff0c;简单来说就是为用户生成一张新卡&#xff0c;批量换卡申请需要进行审核&#xff0c;审核通过后异步进行处理。 为什么…...

Python 异步编程的秘密武器:Asyncio

python编程中&#xff0c;异步编程是一个重要概念。它允许我们在等待某些操作&#xff08;如网络请求或文件读写&#xff09;时&#xff0c;不阻塞程序的其他部分运行。 在 Python 中&#xff0c;asyncio 是实现异步编程的强大工具。今天&#xff0c;我们将一同探索 asyncio 的…...

10年计算机考研408-计算机网络

【题33】下列选项中&#xff0c;不属于网络体系结构所描述的内容是&#xff08;&#xff09; A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析&#xff1a; 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…...

深信服校招面试总结

许久没有更新博客&#xff0c;这两个月里发生的事情有些多。最近稍微稳定下来了&#xff0c;应该可以重新开始吧。 背景 首先感觉自己的笔试做的还行&#xff0c;除了第三个编程题没做出来&#xff0c;其他的应该都做出来了。当时忘记并查集的路径压缩怎么写了&#xff0c;加上…...

【LeetCode热题100】模拟

这篇博客记录了模拟相关的题目&#xff0c;也就是按照题目的描述写代码&#xff0c;很锻炼代码实现能力&#xff0c;包括了替换所有的问号、Z字形变换、外观数列、数青蛙4道题。 class Solution { public:string modifyString(string s) {int n s.size();for(int i 0 ; i <…...

如何在Chrome最新浏览器中调用ActiveX控件?

小编最近登陆工商银行网上银行&#xff0c;发现工商银行的个人网银网页&#xff0c;由于使用了ActiveX安全控件&#xff0c;导致不能用高版本Chrome浏览器打开&#xff0c;目前只有使用IE或基于IE内核的浏览器才能正常登录网上银行&#xff0c;而IE已经彻底停止更新了&#xff…...

一款好用的远程连接工具:MobaXterm

在日常工作中&#xff0c;作为开发者或运维人员&#xff0c;你是否经常需要远程连接服务器进行调试和管理&#xff1f;传统的SSH工具常常不够灵活&#xff0c;操作繁琐&#xff0c;无法满足日益复杂的工作需求。而MobaXterm的出现&#xff0c;带来了远程连接工具的全新体验。它…...

Spring Boot使用配置方式整合MyBatis

文章目录 一、实战目标二、步骤概览1. 创建部门映射器接口2. 创建映射器配置文件3. 配置全局映射器4. 测试映射器接口 三、详细步骤1、创建部门映射器接口2、创建映射器配置文件3、配置全局映射器4、测试映射器接口 四、结语 一、实战目标 在本实战课程中&#xff0c;我们将学…...

HarmonyOS第一课-应用程序框架基础习题答案

声明&#xff1a;本题库为最新的HarmonyOS第一课的学习题库&#xff0c;仅供参考学习&#xff01; 一、判断题 1. 在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。&#xff08;正确&#xff09; 正确(True) 错误(False) -…...

滚雪球学SpringCloud[10.2讲]:微服务项目的性能优化与调优

全文目录: 前言性能优化与调优概述性能优化的核心目标常见的性能瓶颈来源 性能瓶颈分析与调优策略1. 服务间通信优化优化策略&#xff1a; 2. 数据库优化优化策略&#xff1a; 3. 线程池优化优化策略&#xff1a; 4. 缓存优化优化策略&#xff1a; 常见问题的排查与解决1. 慢查…...

EasyExcel将数据库里面的数据生成excel文件

EasyExcel官方文档 1.在model模块导入依赖 <!-- 生成报表--> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency> 2.修饰实体类 package…...

【YOLO学习】YOLOv1详解

文章目录 1. 概述2. 算法流程3. 网络结构4. 损失函数 1. 概述 1. YOLO 的全称是 You Only Look Once: Unified, Real-Time Object Detection。YOLOv1 的核心思想就是利用整张图作为网络的输入&#xff0c;直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。简单…...

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于&#xff0c;UI开发拿来即用&#xff0c;提高开发效率 常量格式枚举enum格式正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果&#xff08;…...

python测试开发---前后端交互Axios

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;常用于浏览器和 Node.js 中发送 HTTP 请求。它封装了 XMLHttpRequest 和 Node.js 的 http 模块&#xff0c;使得处理网络请求更加简单和直观&#xff0c;尤其适合处理异步请求。以下是 Axios 的基础概念和使用方法&#xf…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...