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

【python爬虫】酷狗音乐爬取练习

注意:本次爬取的音乐仅有1分钟试听,仅作学习爬虫的原理,完整音乐需要自行下载客户端。

一、 初步分析

登陆酷狗音乐后随机选取一首歌,在请求里发现一段mp3文件,复制网址,确实是我们需要的url。

复制音频的名字,搜索找到发起请求的网址,发现是在songinfo里

查看参数和请求头,刷新一次,查看是否有哪些参数是变化的。可以发现图中两次请求的这些参数都不同,接下来就寻找这些参数的生成方式,参数clienttime为时间戳,那么就只需要找到signature的生成方式就可以了:

二、分析参数signature

1. 分析过程

搜索参数signature,并在可能生成的位置打上断点,然后刷新网页

网页断在了此处,可以看见参数signature跟函数d与数组s有关。

补充:如果s的长度不为13,需要放行一下,点击这个按钮

查看函数d的定义

发现函数内部没有wordsToBytes函数和函数i的相关定义,那么打下断点,查看具体函数的位置

获得wordsToBytes函数的具体定义

获得i函数的具体定义

i函数里没有r.stringToBytes(t)的相关定义,继续打下断点

找到r.stringToBytes(t)的相关定义

接着查看s的内容:在console里查看s的内容,发现s的值跟之前请求的参数类似。而且下标为0和下标为12的值跟u的值相同

往上查找u的定义,发现u的值是固定的

2. 代码实现

那么就开始实现生成signature的代码(以下为JavaScript代码

function bytesToWords(t) {for (var n = [], r = 0, e = 0; r < t.length; r++,e += 8)n[e >>> 5] |= t[r] << 24 - e % 32;return n
}function rotl(t, n) {return t << n | t >>> 32 - n
}function endian(t) {if (t.constructor == Number)return 16711935 & rotl(t, 8) | 4278255360 & rotl(t, 24);for (var n = 0; n < t.length; n++)t[n] = endian(t[n]);return t
}function i(t, c) {var l = {utf8: {stringToBytes: function (t) {return l.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString: function (t) {return decodeURIComponent(escape(l.bin.bytesToString(t)))}},bin: {stringToBytes: function (t) {for (var n = [], r = 0; r < t.length; r++)n.push(255 & t.charCodeAt(r));return n},bytesToString: function (t) {for (var n = [], r = 0; r < t.length; r++)n.push(String.fromCharCode(t[r]));return n.join("")}}};i._ff = function (t, n, r, e, o, i, c) {var s = t + (n & r | ~n & e) + (o >>> 0) + c;return (s << i | s >>> 32 - i) + n},i._gg = function (t, n, r, e, o, i, c) {var s = t + (n & e | r & ~e) + (o >>> 0) + c;return (s << i | s >>> 32 - i) + n},i._hh = function (t, n, r, e, o, i, c) {var s = t + (n ^ r ^ e) + (o >>> 0) + c;return (s << i | s >>> 32 - i) + n},i._ii = function (t, n, r, e, o, i, c) {var s = t + (r ^ (n | ~e)) + (o >>> 0) + c;return (s << i | s >>> 32 - i) + n};t.constructor == String ? t = c && "binary" === c.encoding ? o.stringToBytes(t) : l.utf8.stringToBytes(t) : e(t) ? t = Array.prototype.slice.call(t, 0) : Array.isArray(t) || (t = t.toString());for (var s = bytesToWords(t), a = 8 * t.length, l = 1732584193, u = -271733879, f = -1732584194, d = 271733878, g = 0; g < s.length; g++)s[g] = 16711935 & (s[g] << 8 | s[g] >>> 24) | 4278255360 & (s[g] << 24 | s[g] >>> 8);s[a >>> 5] |= 128 << a % 32,s[14 + (a + 64 >>> 9 << 4)] = a;for (var b = i._ff, p = i._gg, h = i._hh, m = i._ii, g = 0; g < s.length; g += 16) {var y = l, j = u, S = f, v = d;u = m(u = m(u = m(u = m(u = h(u = h(u = h(u = h(u = p(u = p(u = p(u = p(u = b(u = b(u = b(u = b(u, f = b(f, d = b(d, l = b(l, u, f, d, s[g + 0], 7, -680876936), u, f, s[g + 1], 12, -389564586), l, u, s[g + 2], 17, 606105819), d, l, s[g + 3], 22, -1044525330), f = b(f, d = b(d, l = b(l, u, f, d, s[g + 4], 7, -176418897), u, f, s[g + 5], 12, 1200080426), l, u, s[g + 6], 17, -1473231341), d, l, s[g + 7], 22, -45705983), f = b(f, d = b(d, l = b(l, u, f, d, s[g + 8], 7, 1770035416), u, f, s[g + 9], 12, -1958414417), l, u, s[g + 10], 17, -42063), d, l, s[g + 11], 22, -1990404162), f = b(f, d = b(d, l = b(l, u, f, d, s[g + 12], 7, 1804603682), u, f, s[g + 13], 12, -40341101), l, u, s[g + 14], 17, -1502002290), d, l, s[g + 15], 22, 1236535329), f = p(f, d = p(d, l = p(l, u, f, d, s[g + 1], 5, -165796510), u, f, s[g + 6], 9, -1069501632), l, u, s[g + 11], 14, 643717713), d, l, s[g + 0], 20, -373897302), f = p(f, d = p(d, l = p(l, u, f, d, s[g + 5], 5, -701558691), u, f, s[g + 10], 9, 38016083), l, u, s[g + 15], 14, -660478335), d, l, s[g + 4], 20, -405537848), f = p(f, d = p(d, l = p(l, u, f, d, s[g + 9], 5, 568446438), u, f, s[g + 14], 9, -1019803690), l, u, s[g + 3], 14, -187363961), d, l, s[g + 8], 20, 1163531501), f = p(f, d = p(d, l = p(l, u, f, d, s[g + 13], 5, -1444681467), u, f, s[g + 2], 9, -51403784), l, u, s[g + 7], 14, 1735328473), d, l, s[g + 12], 20, -1926607734), f = h(f, d = h(d, l = h(l, u, f, d, s[g + 5], 4, -378558), u, f, s[g + 8], 11, -2022574463), l, u, s[g + 11], 16, 1839030562), d, l, s[g + 14], 23, -35309556), f = h(f, d = h(d, l = h(l, u, f, d, s[g + 1], 4, -1530992060), u, f, s[g + 4], 11, 1272893353), l, u, s[g + 7], 16, -155497632), d, l, s[g + 10], 23, -1094730640), f = h(f, d = h(d, l = h(l, u, f, d, s[g + 13], 4, 681279174), u, f, s[g + 0], 11, -358537222), l, u, s[g + 3], 16, -722521979), d, l, s[g + 6], 23, 76029189), f = h(f, d = h(d, l = h(l, u, f, d, s[g + 9], 4, -640364487), u, f, s[g + 12], 11, -421815835), l, u, s[g + 15], 16, 530742520), d, l, s[g + 2], 23, -995338651), f = m(f, d = m(d, l = m(l, u, f, d, s[g + 0], 6, -198630844), u, f, s[g + 7], 10, 1126891415), l, u, s[g + 14], 15, -1416354905), d, l, s[g + 5], 21, -57434055), f = m(f, d = m(d, l = m(l, u, f, d, s[g + 12], 6, 1700485571), u, f, s[g + 3], 10, -1894986606), l, u, s[g + 10], 15, -1051523), d, l, s[g + 1], 21, -2054922799), f = m(f, d = m(d, l = m(l, u, f, d, s[g + 8], 6, 1873313359), u, f, s[g + 15], 10, -30611744), l, u, s[g + 6], 15, -1560198380), d, l, s[g + 13], 21, 1309151649), f = m(f, d = m(d, l = m(l, u, f, d, s[g + 4], 6, -145523070), u, f, s[g + 11], 10, -1120210379), l, u, s[g + 2], 15, 718787259), d, l, s[g + 9], 21, -343485551),l = l + y >>> 0,u = u + j >>> 0,f = f + S >>> 0,d = d + v >>> 0}return endian([l, u, f, d])
}function wordsToBytes(t) {for (var n = [], r = 0; r < 32 * t.length; r += 8)n.push(t[r >>> 5] >>> 24 - r % 32 & 255);return n
}function bytesToHex(t) {for (var n = [], r = 0; r < t.length; r++)n.push((t[r] >>> 4).toString(16)),n.push((15 & t[r]).toString(16));return n.join("")
}function d(t, r) {if (void 0 === t || null === t)throw new Error("Illegal argument " + t);var e = wordsToBytes(i(t, r));return r && r.asBytes ? e : r && r.asString ? o.bytesToString(e) : bytesToHex(e)
}function getsianature() {var s = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014","clienttime=1741411989613","clientver=20000","dfid=3Mm61k0WDxvm033Epz2worRG","encode_album_audio_id=j410q60","mid=70789bebe63fb74c52e4a911853f5450","platid=4","srcappid=2919","token=cbfe2e174e4b97fd6aca35682cdba3d2b431c4ed95e2dbd1779e37a7975b672c","userid=2307902397","uuid=70789bebe63fb74c52e4a911853f5450","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"];return d(s.join(""))
}console.log(getsianature());

经过一系列调试,可以发现生成的结果与浏览器生成的值一样,那么生成signature的代码就没问题了。

将一些会变的值改为变量,可以看到参数s的值里只有clienttime的值是会变的,因此修改上述代码中getsianature函数,将参数s的值放在python代码中,getsianature函数改完如下图所示:

function getsianature(s) {return d(s.join(""))
}

三、获取多首歌

1. 分析过程

点击不同的歌,可以发现每首歌的参数encode_album_audio_id都不同,因此需要获取encode_album_audio_id

搜索歌名,找到歌曲的id

接着查看请求参数,同样有一个signature参数,刷新多次网页发现signature参数会变化,那么重复之前分析signature的步骤

打下断点,查看中断的位置,参数s有所变化

打印s,查看s的内容,除此之外没有变化,那么就沿用先前的代码

2. 代码实现

完整代码如下,注意这里调用了JavaScript代码,需要安装PyExecJS模块:pip install PyExecJS -i https://pypi.tuna.tsinghua.edu.cn/simple。

本代码中JavaScript文件名为kugou.js,JavaScript代码在参数signature的分析中有写到,以下为python代码:

import json
import re
import time
import requests
import execjsclass kugou_music:def __init__(self):self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36','Referer': 'https://www.kugou.com/',}def get_signature(self, s):with open("kugou.js", "r", encoding="utf-8") as f:js = f.read()ctx = execjs.compile(js)signature = ctx.call("getsianature", s)return signaturedef get_one_song_url(self, audio_id):timestamp = str(int(time.time() * 1000))s = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014",f"clienttime={timestamp}","clientver=20000","dfid=3Mm61k0WDxvm033Epz2worRG",f"encode_album_audio_id={audio_id}","mid=70789bebe63fb74c52e4a911853f5450","platid=4","srcappid=2919","token=cbfe2e174e4b97fd6aca35682cdba3d2b431c4ed95e2dbd1779e37a7975b672c","userid=2307902397","uuid=70789bebe63fb74c52e4a911853f5450","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]signature = self.get_signature(s)params = {'srcappid': '2919','clientver': '20000','clienttime': timestamp,'mid': '70789bebe63fb74c52e4a911853f5450','uuid': '70789bebe63fb74c52e4a911853f5450','dfid': '3Mm61k0WDxvm033Epz2worRG','appid': '1014','platid': '4','encode_album_audio_id': audio_id,'token': 'cbfe2e174e4b97fd6aca35682cdba3d2b431c4ed95e2dbd1779e37a7975b672c','userid': '2307902397','signature': signature}one_song_url = 'https://wwwapi.kugou.com/play/songinfo'response = requests.get(one_song_url, headers=self.headers, params=params)song_url = response.json()['data']['play_url']return song_urldef get_signal_music(self, audio_id, audio_name):song_url = self.get_one_song_url(audio_id)response = requests.get(song_url, headers=self.headers)with open(f'{audio_name}.mp3', 'wb') as f:f.write(response.content)print(f'{audio_name}.mp3下载完成')def get_song_id(self,keyword):timestamp = str(int(time.time() * 1000))s = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014","bitrate=0","callback=callback123",f"clienttime={timestamp}","clientver=1000","dfid=3Mm61k0WDxvm033Epz2worRG","filter=10","inputtype=0","iscorrection=1","isfuzzy=0",f"keyword={keyword}","mid=70789bebe63fb74c52e4a911853f5450","page=1","pagesize=30","platform=WebFilter","privilege_filter=0","srcappid=2919","token=cbfe2e174e4b97fd6aca35682cdba3d2b431c4ed95e2dbd1779e37a7975b672c","userid=2307902397","uuid=70789bebe63fb74c52e4a911853f5450","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]signature = self.get_signature(s)params = {'callback': 'callback123','srcappid': '2919','clientver': '1000','clienttime': timestamp,'mid': '70789bebe63fb74c52e4a911853f5450','uuid': '70789bebe63fb74c52e4a911853f5450','dfid': '3Mm61k0WDxvm033Epz2worRG','keyword': keyword,'page': '1','pagesize': '30','bitrate': '0','isfuzzy': '0','inputtype': '0','platform': 'WebFilter','userid': '2307902397','iscorrection': '1','privilege_filter': '0','filter': '10','token': 'cbfe2e174e4b97fd6aca35682cdba3d2b431c4ed95e2dbd1779e37a7975b672c','appid': '1014','signature': signature}song_id_url = 'https://complexsearchretry.kugou.com/v2/search/song'response = requests.get(song_id_url, headers=self.headers, params=params, verify=False)temp = re.findall(r'callback123(.*)', response.text)[0][1:-1]temp = json.loads(temp)song = temp['data']['lists']return songdef get_all_song(self,keyword):song = self.get_song_id(keyword)for i in song:song_id = i.get('EMixSongID')song_name = i.get('FileName')# print(song_name, song_id)try:self.get_signal_music(song_id, song_name)except Exception as e:print(f'{song_name}下载失败:', e)if __name__ == '__main__':kugou = kugou_music()# kugou.get_signal_music('j410q60')keyword='周杰伦'kugou.get_all_song(keyword)

相关文章:

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…...

电路的一些设计经验

这个C37在这里位于AMS1117-3.3稳压器的输入端。这个是作为输入滤波电容&#xff0c;有助于平滑输入电压&#xff0c;减少输入电压的纹波和噪声&#xff0c;从而提高稳压器LDO的稳定性。 电容器储存电荷&#xff0c;当输入电压出现小的拨动或者纹波时&#xff0c;电容器可以释放…...

Windows编译环境搭建(MSYS2\MinGW\cmake)

我的音视频/流媒体开源项目(github) 一、基础环境搭建 1.1 MSYS2\MinGW 参考&#xff1a;1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C开发环境_msys2使用mingw64编译 在Widndows系统上&#xff0c;使用gcc工具链&#xff08;g&#xff09;进行C程序开发&#xff1f;可以的&a…...

Vue 框架深度解析:源码分析与实现原理详解

文章目录 一、Vue 核心架构设计1.1 整体架构流程图1.2 模块职责划分 二、响应式系统源码解析2.1 核心类关系图2.2 核心源码分析2.2.1 数据劫持实现2.2.2 依赖收集过程 三、虚拟DOM与Diff算法实现3.1 Diff算法流程图3.2 核心Diff源码 四、模板编译全流程剖析4.1 编译流程图4.2 编…...

前端 | CORS 跨域问题解决

问题&#xff1a;Access to fetch at http://localhost:3000/save from origin http://localhost:5174 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the request…...

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…...

【AI】AI开源IDE:CLine源码分析报告

1. 源码位置&#xff1a; CLine 是一个开源的 VSCode 插件&#xff0c;其完整源码托管在 GitHub 的 cline/cline 仓库中。这个仓库包含 CLine 的核心逻辑&#xff08;TypeScript 编写&#xff09;&#xff0c;包括与 LLM 的对话控制、工具调用接口&#xff0c;以及 VSCode 插件…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?

1.缓存更新策略 1.1. 缓存旁路模式&#xff08;Cache Aside&#xff09; 在应用里负责管理缓存&#xff0c;读取时先查缓存&#xff0c;如果命中了则返回缓存&#xff0c;如果未命中就查询数据库&#xff0c;然后返回缓存&#xff0c;返回缓存的同时把数据给写入缓存中。更新…...

docker compose 以redis为例

常见docker compose 命令 》》注意这个是旧版本的&#xff0c;新版本 docker 与compose 之间没有 - 新版本的 docker compose 把 version 取消了 &#xff0c;redis 默认是没有配置文件的 &#xff0c;nginx&#xff0c;mysql 默认是有的 services:redis:image: redis:lat…...

基于Kubernetes部署MySQL主从集群

以下是一个基于Kubernetes部署MySQL主从集群的详细YAML示例&#xff0c;包含StatefulSet、Service、ConfigMap和Secret等关键配置。MySQL主从集群需要至少1个主节点和多个从节点&#xff0c;这里使用 StatefulSet 初始化脚本 实现主从自动配置。 1. 创建 Namespace (可选) ap…...

VMware中安装配置Ubuntu(2024最新版 超详细)

目录 一、安装虚拟机软件 二、VMware虚拟机 三、 Ubuntu 下载 &#xff08;1&#xff09;官网下载 &#xff08;2&#xff09;清华镜像网站下载 四、创建虚拟机 五、Ubuntu 系统安装过程的配置 六、更换国内镜像源 七、环境搭建完毕 全篇较长&#xff0c;请慢慢观看 一…...

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机&#xff1a; 1、理解&#xff1a; 2、内核态与用户态&#xff1a; 1、概念&#xff1a; 2、重谈地址空间&#xff1a; 3、处理时机&#xff1a; 补充知识&#xff1a; 1、sigaction&#xff1a; 2、函数重入&#xff1a; 3、volatile&…...

如何在rust中解析 windows 的 lnk文件(快捷方式)

一、从标题二开始看&#x1f601; 这些天在使用rust写一个pc端应用程序&#xff0c;需要解析lnk文件获取lnk的图标以及原程序地址&#xff0c;之前并没有过pc端应用程序开发的经验&#xff0c; 所以在广大的互联网上游荡了两天。额&#x1f97a; 今天找到了这个库 lnk_parse很…...

大模型系列课程学习-基于Vllm/Ollama/Ktransformers完成Deepseek推理服务部署

1.机器配置及实验说明 基于前期搭建的双卡机器装机教程&#xff0c;配置如下&#xff1a; 硬件名称参数备注CPUE5-2680V42 *2&#xff08;线程28个&#xff09;无GPU2080TI-22G 双卡魔改卡系统WSL Unbuntu 22.04.5 LTS虚拟机 本轮实验目的&#xff1a;基于VLLM/Ollama/ktran…...

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…...

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…...

【Recon】CTF Web类题目主要类型

CTF Web类题目主要类型 1. 信息搜集类2. 注入类漏洞3. 文件处理漏洞4. 身份验证与会话漏洞5. 服务端漏洞6. 客户端漏洞7. 代码审计与PHP特性8. 业务逻辑漏洞总结 CTF&#xff08;Capture The Flag&#xff09;竞赛中的Web类题目主要考察参赛者对Web应用漏洞的识别与利用能力&am…...

comfyui(python)下载insightface失败

使用comfyui时&#xff0c;安装插件zenid、instantid、ip-adapter等换脸插件时&#xff0c;因为依赖insightface安装失败&#xff0c;导致插件中的节点无法正常使用&#xff0c;需要单独安装insightface。 下载insightface到本地&#xff0c;下载地址 选择与自己python版本一致…...

《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》

在数字化浪潮汹涌澎湃的当下&#xff0c;大数据已然成为推动各行业发展的核心动力。身处这一时代洪流&#xff0c;企业对数据的处理与分析能力&#xff0c;直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作&#xff0c;凭借强大的数据处理与分析能力&…...

Docker小游戏 | 使用Docker部署DOS游戏合集

Docker小游戏 | 使用Docker部署DOS游戏合集 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署dos-games网页小游戏下载镜像创建容器检查容器状态检查服务端口检查容器日志安全设置四、访问DOS游戏网页五、进阶玩法下载游戏拷贝…...

【redis】慢查询分析与优化

慢查询指在Redis中执行时间超过预设阈值的命令&#xff0c;其日志记录是排查性能瓶颈的核心工具。Redis采用单线程模型&#xff0c;任何耗时操作都可能阻塞后续请求&#xff0c;导致整体性能下降。 命令的执行流程 根据Redis的核心机制&#xff0c;命令执行流程可分为以下步骤…...

ThinkPHP框架

在电脑C磁盘中安装composer 命令 在电脑的D盘中创建cd文件夹 切换磁盘 创建tp框架 创建一个aa的网站&#xff0c;更换路径到上一步下载的tp框架路径 在管理中修改路径 下载压缩包public和view 将前面代码中的public和view文件替换 在PHPStom 中打开文件 运行指定路径 修改demo…...

从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践

在现代企业级数据库管理中,手动配置 MySQL 已无法满足高效、稳定和可扩展的需求。本文从 MySQL 配置管理的核心原理 出发,深入剖析 自动化配置工具的架构设计、关键技术实现,并结合 企业级落地方案,帮助读者构建一套 高可用、智能化的 MySQL 自动化配置系统。无论是 DevOps…...

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…...

开启mysql远程登录

目录 前言开启步骤 前言 为了安全考虑&#xff0c;mysql默认不允许远程登录&#xff0c;需要我们自己开启。当然在远程登录之前mysql的端口也要开放。下面是mysql开启远程登录的步骤。 开启步骤 本地登录mysql mysql -u root -p然后输入登录密码 给登录账号授权 GRANT AL…...

中级网络工程师面试题参考示例(5)

企业园区网络设计 问题&#xff1a; 请描述一下如何设计一个企业园区网络&#xff0c;包括核心层、汇聚层和接入层的功能及其关键技术。 解答&#xff1a; 核心层&#xff1a;负责高速数据交换&#xff0c;通常使用高性能的三层交换机&#xff0c;支持高带宽和低延迟。关键技…...

【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域

1、HarmonyOS TextInput或TextArea如何自动获取焦点&#xff1f; 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点&#xff0c;具体可以参考文档&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…...

Git学习笔记(二)

Git学习笔记&#xff08;二&#xff09; 下载VSCode创建本地仓库推送远程仓库界面功能 使用 VSCode 进行Git仓库的项目管理 这篇文章是我学完使用 命令行终端 管理Git仓库额外学习的 文章主要用于巩固和方便后续复习 下载VSCode 可以看我这篇文章下载VSCode 创建本地仓库 …...

UDP协议和报文格式

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c;UDP协议1&#xff0…...

Java TCP 通信:实现简单的 Echo 服务器与客户端

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议。与 UDP 不同&#xff0c;TCP 保证了数据的顺序、可靠性和完整性&#xff0c;适用于需要可靠传输的应用场景&#xff0c;如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…...

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错&#xff0c;大概率是因为选择了替换安装&#xff0c;本地配置文件出错 找到本地当前版本的配置文件&#xff0c;删掉&#xff0c;重启studio就好了&#xff1a; 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …...

hom_mat2d_to_affine_par 的c#实现

hom_mat2d_to_affine_par 的c#实现 背景&#xff1a;为课室贡献一个通用函数&#xff0c;实现halcon算子的同等效果&#xff0c;查询csdn未果&#xff0c;deepseek二哥与chtgpt大哥给不了最终程序&#xff0c;在大哥与二哥帮助下&#xff0c;最终实现同等效果。 踩坑&#xf…...

#9 【code】实现扩散模型的一个jupyter notebook

今天以一个简单的notebook入手,学习一下扩散模型的运行流程。有点困难不要紧,一个人吃了六个馒头才饱,他是吃第一个饱的,还是第六个饱的呢?始终坚信,现在的技术积累,终会成为未来高楼大厦的根基! import torch import torchvision import matplotlib.pyplot as pltdef …...

三星首款三折叠手机被曝外屏6.49英寸:折叠屏领域的新突破

在智能手机的发展历程中,折叠屏手机的出现无疑是一次具有里程碑意义的创新。它打破了传统手机屏幕尺寸的限制,为用户带来了更加多元和便捷的使用体验。而三星,作为手机行业的巨头,一直以来都在折叠屏技术领域积极探索和创新。近日,三星首款三折叠手机的诸多细节被曝光,其…...

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 3. 请求调度…...

Python 中多种方式获取屏幕的 DPI值

在 Python 中&#xff0c;可以通过多种方式获取屏幕的 DPI&#xff08;每英寸点数&#xff09;。以下是几种常见的方法&#xff1a; 方法 1&#xff1a;使用 tkinter 模块 tkinter 是 Python 的标准 GUI 库&#xff0c;可以通过它获取屏幕的 DPI。 import tkinter as tkdef …...

linux安装Mariadb10.5并修改端口

首先配置yum源 进入下方的文件进行配置 vim /etc/yum.repos.d/MariaDB.repo填写下方内容 [mariadb]name MariaDBbaseurl https:///mirrors.aliyun.com/mariadb/yum/10.5/centos8-amd64/gpgkeyhttps:///mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDBmodule_hotfixes…...

Java EE 进阶:Spring IoCDI

IOC的简单介绍 什么是Spring&#xff1f;Spring是一个开源的框架&#xff0c;让我们的开发更加的简单&#xff0c;我们可以用一句更加具体的话来概括Spring&#xff0c;就是Spring是一个包含众多工具方法的IOC容器。 简单介绍一下IOC&#xff0c;我们之前说过通过ReqestContr…...

蓝桥杯备考:图论初解

1&#xff1a;图的定义 我们学了线性表和树的结构&#xff0c;那什么是图呢&#xff1f; 线性表是一个串一个是一对一的结构 树是一对多的&#xff0c;每个结点可以有多个孩子&#xff0c;但只能有一个父亲 而我们今天学的图&#xff01;就是多对多的结构了 V表示的是图的顶点集…...

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…...

《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》

”你没想过也许是这个镇子对你来说太小了吗&#xff1f; 对我而言&#xff0c;这个小镇容不下我的雄心壮志。 “ 什么是 Node.js&#xff1f; Node.js是一个跨平台JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序 作用&#xff1a;使用 Node.js 编写服务器端程序…...

关于Springboot 应配置外移和Maven个性化打包一些做法

期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内&#xff0c;更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法&#xff1a;在项目同级或者上级创建config文件夹放置配置文件&#xff0c;具体m…...

Lab18_ SQL injection with filter bypass via XML encoding

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 通关 XML 编码绕过过滤器的 SQL 注入 简介&#xff1a; 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回&#xff0c;因此您可以使用 UNION 攻击…...

网络空间安全(21)验证码安全

一、基本概念 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;全自动区分计算机和人类的图灵测试&#xff09;的缩写&#xff0c;是一种区分用户是计算机还是人的公共全自动程序。它通过…...

DMA在STM32中的应用

在STM32微控制器中,DMA(直接内存访问)是实现高效数据搬运的核心技术,能够显著减轻CPU负担并提升系统性能。以下是STM32中DMA的典型应用及配置方法: 1. STM32的DMA控制器架构 DMA控制器数量:不同系列配置不同,如STM32F1系列有1个DMA控制器(DMA1,7通道),F4系列有2个(…...

V8引擎中的垃圾回收机制如何工作?

V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明&#xff1a; V8 的垃圾回收机制基于以下核心设计原则&#xff1a; 1. 分代假设&#xff1a;大多数对象的生命周期很短&#xff0c;只有少数对象会存活较长时间&#xff1b;…...

汇编的伪指令

一、介绍 伪指令是用于对汇编过程进行控制的指令&#xff0c;该类指令并不是可执行指令&#xff0c;没有对应机器码&#xff0c;只用于汇编过程中为汇编程序提供汇编信息&#xff0c;帮助编译器编译。当汇编结束时&#xff0c;伪指令的使命也就结束了。伪操作可以实现如下功能…...

【TI】如何更改 CCS20.1.0 的 WORKSPACE 默认路径

参考链接&#xff1a; 如何更改 CCS Theia 中工作区的默认位置&#xff1f;- Code Composer Studio 论坛 - Code Composer Studio™︎ - TI E2E 支持论坛 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…...

GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)

运行效果(音频) 简介 上一个教程演示了GStreamer工具。本教程介绍视频播放控制。快进、反向播放和慢动作都是技术 统称为 Trick Modes&#xff0c;它们都有一个共同点 修改 Normal playback rate。本教程介绍如何实现 这些效果并在交易中添加了帧步进。特别是&#xff0c;它 显…...

推荐一款好用在线免费软件工具箱-传道软件箱

推荐一款好用在线免费软件工具箱-传道软件箱 传道软件箱 传道软件箱是一款在线免费软件工具箱&#xff0c;无需登录&#xff0c;无需费用&#xff0c;用完就走的软件工具&#xff0c;包有BMI计算、倒计时、单位转换、密码生成器、摩斯电码、代码编辑器、计算器、快递查询、二维…...