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

爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验

此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理

Akamai 3.0反爬分析与sensor-data算法逆向经验

  • Akamai
  • 开始正题前须知
  • 站点信息
  • 接口分析反爬点
    • 反爬点定位
    • _abck
    • 定位结果
  • 逆向前准备工作
    • sensor_data生成位置
    • 本地替换文件
  • 请求体sensor_data逆向分析
    • qtx五次赋值分析
      • 第一次赋值
      • 第二次赋值
      • 第三次赋值
      • 第四次赋值
      • 第五次赋值
  • 请求测试
  • 结尾

Akamai

Akamai是啥就不多说了,这在爬虫圈可是有名的反爬产品。Akamai 3.0以前的产品我没有研究过,不过在扣Akamai 3.0 sensor-data算法时也看了其他博主的分享,感觉逆向流程差不多的,只不过Akamai 3.0现在每个一两天就会变换js文件,然后js文件每隔十分钟又会变换代码(不同站点规则可能不一样)

严重怀疑变换js文件后相当于变更了算法,而同一份js文件的更新则是对参数的重新混淆和打乱大数组长度与取值

开始正题前须知

我是2024年12月份开始研究的,期间一直是拿保存到本地js文件去跟流程扣算法的,然后到2025年1月份破解算法还能拿到成功数据。

这里要着重说一下:大家研究时代码肯定跟我的不一样了,所以不要抱着能一一跟学的想法,这篇博客重点是提供给大家扣算法思路和一些处理经验。

我尽可能写详细,有点难写hhh…

站点信息

  • 网站:https://www.dhl.com/cn-zh/home/tracking/tracking-supply-chain.html?submit=1&tacking-id=1232343
  • 接口:https://www.dhl.com/utapi?trackingNumber=1232343&language=zh&requesterCountryCode=CN&source=tt

接口分析反爬点

反爬点定位

复制utapi接口的发包内容,然后将其转成python requests请求格式,拿到本地python环境下执行看看结果。
在这里插入图片描述

Akamai有tls指纹检测,所以需要用curl_cffi这个库来请求。
可以看到这里是可以直接请求拿到数据的,然后观察请求头和请求连接并没有反爬点,这时可以推测cookies存在反爬点。
在这里插入图片描述

当然不可能全部cookie都是反爬点,这里可以用排除法来确定真正的反爬点。
这里试出来确定请求必须携带_abck cookie,不然请求响应码是428
在这里插入图片描述
在这里插入图片描述

既然知道cookie _abck是反爬点,那我们就得知道它从哪里生成的。
看cookie列表这个参数的Secure是勾上的,说明它是服务器响应返回的,这就好找了,用fiddler抓包搜一下就知道。
在这里插入图片描述

打开fiddler然后清空浏览器数据,刷新页面,并搜索一下接口,拿到最新的 _abck,拿到fiddler,快捷键Ctrl F打开搜索框搜索,匹配到的包就会标为黄色,找到第一次出现的包就是了。
在这里插入图片描述
在这里插入图片描述

拿到目标链接后,在开发者工具那搜一下,发现这个接口请求了两次,第一次是GET请求,第二次是POST请求,而第二次请求响应结果返回了需要的cookie _abck
在这里插入图片描述
在这里插入图片描述

这两次请求是啥关系呢:第一个GET请求返回的是JS代码,然后这些JS代码会生成得到请求体sensor_data,用来第二次POST请求。
在这里插入图片描述

那这个接口链接又是在哪里得到的呢,我们继续在fiddler搜一下这个接口,发现它第一次出现在网站链接响应内容里
在这里插入图片描述
在这里插入图片描述

_abck

这个cookie其实在首页就有返回,包括后面的请求有些接口也会返回,但是这里它的中间值都是~-1~,而对于Akamai来说,它的中间值需要是~0~才有效。
在这里插入图片描述

定位结果

  • 请求首页链接拿到JS代码接口
  • 通过接口返回的JS代码生成得到请求体sensor_data
  • 使用POST请求接口,并带上请求体sensor_data,得到需要的cookie _abck
  • _abck中间内容为~0~说明cookie有效,反之cookie无效

逆向前准备工作

sensor_data生成位置

把JS接口加入xhr断点捕捉,这个能在接口发包时断住,我这里这个接口结尾是BHBSM,大家按自己的来,然后清空浏览器数据,刷新页面。
在这里插入图片描述

看到没,OIY的值就是我们想要的请求体sensor_data,理论上只要逆向出OIY的生成算法就能实现破解了。
在这里插入图片描述

本地替换文件

一开始我就说了Akamai同一份js文件的代码会不定时更新,所以我们需要将首页链接和JS接口GET链接保存到本地并进行替换。
在这里插入图片描述
在这里插入图片描述

这样就替换成功了,后续刷新就不会再变更代码或者文件了
在这里插入图片描述

请求体sensor_data逆向分析

承接上文,这里我们开始分析请求体sensor_data生成算法,由于JS代码太多太乱,所以我们选择逆向推理,从结果推理过程。
再次强调,本文所演示的代码肯定跟大家实操时不一致,大家重点学历逆向思路

上文我们已经找到了请求体sensor_data的生成位置,这里是RmX,我们看下图右边,发现pUXRmX有关联,我们先创建个空白js文件,将它俩的赋值代码扣过去。
在这里插入图片描述

大家看下pUX的赋值:Yx[Sm()[vd(dd)](Vd, Ym)][Fn()[ft(Y9)](cE, sO)](qtX);,看着是很复杂,但是打印一下发现其实就是某些方法的混淆。看下图,这就是Akamai另一个比较恶心的地方了,如果会AST的可以尝试去解混淆,这里就手动解混淆了
在这里插入图片描述

后面不会在这一块讲解太多,大家自己来…
在这里插入图片描述

通过上图我们需要找一下qtX的生成位置,直接在代码那搜索qtX = ,发现有五个位置,这里把五个位置全部打上断点并把代码全部扣下来,然后刷新页面,这样后面才能解混淆。
在这里插入图片描述

老样子,先手动解混淆,然后补未定义的参数,如果不知道哪些未定义的可以执行一下脚本,按报错的内容补也行。
在这里插入图片描述

qtx五次赋值分析

题外话大家往下看会发现很多参数都是写死的,这里原因有两个:

  1. 参数属于Akamai 3.0核心部分,后续再详细讲解;
  2. 参数属于常量,是在js文件执行时就生成固定了,我们只要知道它怎么取值就行;

言归正传,对于这五个赋值我们这里选择从前往后推。

第一次赋值

var qtX = ‘’;

第二次赋值

qtX = JSON['stringify'](MUX);中的MUX先写死,复制浏览器的值就行,这是Akamai 3.0核心部分大字典,后面再细究

第三次赋值

qtX = qO(45, [qtX, xQX[1]]);
看下xQXvar xQX = h9X || bb(); -> bb();所以咱直接处理bb();就行,把它代码拿下来
bb方法需要用到cookie bm_sz
在这里插入图片描述

然后看下q0,这里跟进入拿代码
q0方法本身是一个switch控制流,但是这里它不会执行很多次,只会进入LQ这一步,拿下这一步的代码即可,打上断点,执行到这里。
在这里插入图片描述

q0方法解混淆后
在这里插入图片描述

搞定后我们打印一下执行结果然后跟浏览器对比一下,没问题。
在这里插入图片描述
在这里插入图片描述

第四次赋值

qtX = hDX(qtX, xQX[0]);看下hDX方法,直接把它扣下来解混淆
在这里插入图片描述

搞定后我们打印一下执行结果然后跟浏览器对比一下,没问题。
在这里插入图片描述
在这里插入图片描述

第五次赋值

qtX = ''['concat'](CqX, ';')['concat'](kQX, ';')['concat'](qtX);看下CqXkQX,往上找就行
在这里插入图片描述

先看看var kQX = ''['concat'](WV() - MmX, ',')['concat'](0, ',')['concat'](0, ',')['concat'](ZOX, ',')['concat'](xBX, ',')['concat'](0);

WV:直接复制js文件提供的方法,或者返回当前时间
在这里插入图片描述
MmXZOXxBXWV有关,且它们是在qtX多次赋值操作前后
在这里插入图片描述

再看var CqX = InX(xQX);,直接拿下InX方法解混淆
在这里插入图片描述

到这里理论上已经拿到了请求体sensor-data的结果了,后面我们需要测试一下能够成功拿到数据。
在这里插入图片描述

请求测试

这是根据Akamai反爬流程开发的python请求代码

import reimport execjs
from bs4 import BeautifulSoup
from curl_cffi import requestsclass DhlAkamai:index_url = 'https://www.dhl.com/cn-zh/home/tracking/tracking-supply-chain.html?submit=1&tacking-id=1232343'data_api = 'https://www.dhl.com/utapi?trackingNumber=1232343&language=zh&requesterCountryCode=CN&source=tt'def __init__(self):self.session = requests.Session()self.session.headers.update({'accept': '*/*','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','content-type': 'text/plain;charset=UTF-8','dnt': '1','origin': 'https://www.dhl.com','priority': 'u=1, i','referer': 'https://www.dhl.com/cn-zh/home/tracking/tracking-supply-chain.html?submit=1&tacking-id=1232343','user-agent': 'user-agent'})self.session.cookies.set('cookieDisclaimer', 'seen')def get_crack_url(self):resp = self.session.get(self.index_url)de_url = re.search('type="text/javascript" {2}src="(.*?)">', resp.text).group(1)return 'https://www.dhl.com' + de_urldef get_js_data(self, js_url):self.session.get(js_url)  # 代码可以不拿,但是要得到返回的cookiedef post_js_data(self, js_url):with open('crack_00.js', 'r', encoding='utf8') as js_file:js_text = js_file.read()js = execjs.compile(js_text)sensor_data = js.call('gen_sensor_data', self.session.cookies.get('bm_sz'))print('sensor_data: ', sensor_data)resp = self.session.post(js_url, data=sensor_data)return respdef get_data(self):resp = self.session.get(self.data_api)return respdef str_cookie(self):return '; '.join([f'{k}={v}' for k, v in dict(self.session.cookies).items()])def run(self):js_url = self.get_crack_url()print(js_url)print('index _abck: ', dict(self.session.cookies)['_abck'])self.get_js_data(js_url)print('getJs _abck: ', dict(self.session.cookies)['_abck'])p_resp = self.post_js_data(js_url)print('posJs _abck: ', dict(self.session.cookies)['_abck'])print(p_resp.status_code, p_resp.text)d_resp = self.get_data()print('gData _abck: ', dict(self.session.cookies)['_abck'])print(d_resp.status_code, d_resp.text)if __name__ == '__main__':dhl_akamai = DhlAkamai()dhl_akamai.run()

crack_00.js文件就是扣出来的js代码文件,只不过需要封装出来一个gen_sensor_data方法。

执行后发现是可以成功拿到数据的。
在这里插入图片描述

结尾

这篇先写到这,主要是介绍了Akamai的反爬内容和破解入口,以及对请求体sensor_data的逆向分析,至于核心部分写死那块我们后面再出博客讲解。

其实最后能拿到数据也是网站风控没那么严格,细心的朋友会发现代码写死了三个位置,而那三个位置其实是很重要的,但凡你随便改了一个都无法请求成功。

我研究过一段时间,虽然能扣出它们的生成算法,但是这个算法只能适用当前JS文件提供的代码(或者一部分),已更新JS文件就不适用了,归根结底我觉得是每个JS文件会生成一个大数组,这三个位置的生成都需要用到它,而每个JS文件的大数组长度和每次取值都不一定相同,也就导致无规律性了。

估计是还没研究透,后续有时间再战…

相关文章:

爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验

此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理 Akamai 3.0反爬分析与sensor-data算法逆向经验 Akamai开始正题前须知站点信息接口分析反爬点反爬点定位_abck定位结果 逆向前准备工作sensor_data生成位置本地替换文件 请求体sensor…...

java项目启动时,执行某方法

1. J2EE项目 在Servlet类中重写init()方法,这个方法会在Servlet实例化时调用,即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...

学会使用开源软件jclasslib 字节码文件的组成 详解

应用场景 1 应用场景 2 学习路线 以正确的姿势打开文件 字节码文件的组成 玩转字节码常用工具 以正确的姿势打开文件 开源软件 jclasslib github 地址 https://github.com/ingokegel/jclasslib 工具使用 字节码文件的组成 基本信息 常量池 字段 方法 属性 详解 魔数 主副版…...

Flask表单处理与验证

Flask是一个轻量级的Python框架,它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库,用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑,使得表单处理更为简洁和优雅。下面,我们…...

如何通俗易懂的理解 html js css

HTML、CSS 和 JavaScript 是构建网页的三大核心技术。为了通俗易懂地理解它们,我们可以用一个简单的比喻:**盖房子**。 --- ### 1. **HTML:房子的结构** HTML(HyperText Markup Language)就像房子的**骨架**。它定义…...

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日,深交所官网显示,浙江信凯科技集团股份有限公司(以下简称“信凯科技”)主板IPO提交注册。 自2022年递交上市申请,信凯科技的IPO之路已走过两年光景,尽管提交注册&#xff0…...

蓝牙BT04-A的使用与相关AT指令

一、AT指令没有返回的问题及解决方案 检查指令格式: 确认指令格式是否正确,包括特定的命令和结尾的回车换行符(n)。 检查TX/RX连接: 确认TX(发送)和RX(接收)线是否连接正…...

新手如何练习SQL?|掌握

对于新手想要练习SQL语句,可以从以下几个方面入手: 1. 建立理论基础 首先深入理解数据库的核心组件,包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型(如字符串、整型、日期等),以及数据库…...

JavaScript宝典下

小哆啦闭关修炼已久,潜心攻读专业秘技,方才下山考研本欲大展宏图,怎奈山河虽壮志难酬,终是觉察考研无望。思来想去,不若弃考研之念,重拾敲代码之道,复盘前端奇术,以备闯荡职场江湖。…...

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具(QEMU、Libvirt等) 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…...

Spring Boot 动态表操作服务实现

Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…...

62_Redis服务器集群优化

Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运…...

Nacos: 一个动态服务发现与配置管理平台

Nacos: 一个动态服务发现与配置管理平台 引言 在微服务架构日益普及的今天,服务之间的调用和配置管理变得越来越复杂。为了简化这一过程并提高开发效率,阿里巴巴推出了Nacos——一个易于使用的动态服务发现、配置管理和服务管理平台。 Nacos是什么&am…...

SpringBoot + 事务钩子函数

一、案例背景 拿支付系统相关的业务来举例。在支付系统中,我们需要记录每个账户的资金流水(记录用户A因为哪个操作扣了钱,因为哪个操作加了钱),这样我们才能对每个账户的账做到心中有数,对于支付系统而言&…...

OpenCV相机标定与3D重建(56)估计物体姿态(即旋转和平移)的函数solvePnPRansac()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用RANSAC方案从3D-2D点对应关系中找到物体的姿态。 cv::solvePnPRansac 是 OpenCV 中用于估计物体姿态(即旋转和平移)的…...

【JVM中的三色标记法是什么?】

JVM中的三色标记法是什么? 一、基本概念二、标记过程三、优势与问题四、漏标与多标的解决方案三色标记法(Tri-color Marking Algorithm)是Java虚拟机(JVM)中一种用于追踪对象存活状态的垃圾回收算法。 它基于William D. Hana和Mark S. McCulleghan在1976年提出的两色标记法…...

从0开始学习搭网站第二天

前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...

43.Textbox的数据绑定 C#例子 WPF例子

固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 box和block绑定属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 属性双触发,其中一个更新block的属性 block>指向box的属性 从Textbo…...

钉钉实现第三方登录示例(重复回调问题解析)

钉钉作为专门为企业打造的沟通协助平台,包含的功能很多,考勤打卡,审批,日记,钉盘,钉邮等。基本满足了一些中小企业的大部分工作需求。因此对接钉钉的一些功能模块业务需求在开发中也是比较常见的。钉钉的开…...

Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、安装Element-UI 四、代码实现 4.1、添加一个点 4.2、删除所有点 4.3、根据经纬度删除点 4.4、给点添加点击事件 4.5、完整代码 五、Gitee源码 一、案例截图 可以新增/删除标记点,点击标记点可以获取到当前标…...

算法妙妙屋-------2..回溯的奇妙律动

回溯算法是一种用于系统性地搜索和解决问题的算法,它以深度优先搜索(DFS)为基础,用来探索所有可能的解决方案。通过递归地尝试候选解并在必要时回退(即“回溯”),它能够高效地解决许多涉及组合、…...

pytest-instafail:让测试失败信息即时反馈

pytest-instafail:让测试失败信息即时反馈 前言一、简介二、优势三、安装与使用3.1 未安装时运行情况3.2 安装3.3 已安装时运行情况3.3 pytest.ini 配置选项 四、对比 总结 前言 当测试用例数量庞大时,定位测试失败的原因往往耗时费力。此时,…...

K8S--配置存活、就绪和启动探针

目录 1 本人基础环境2 目的3 存活、就绪和启动探针介绍3.1 存活探针3.2 就绪探针3.3 启动探针 4 探针使用场景4.1 存活探针4.2 就绪探针4.3 启动探针 5 配置存活、就绪和启动探针5.1 定义存活探针5.2 定义一个存活态 HTTP 请求接口5.3 定义 TCP 的就绪探针、存活探测5.4 定义 g…...

solidity基础 -- 枚举

在智能合约开发领域,Solidity语言因其简洁高效而被广泛使用。其中,枚举(enum)作为一种特殊的数据类型,为合约的状态管理提供了极大的便利。本文将通过一个具体的Solidity合约示例,深入探讨枚举的定义、使用…...

重回C语言之老兵重装上阵(六)枚举

1. 什么是枚举 (enum)? 枚举(enum)是 C 语言中的一种数据类型,用于定义一组具名的整数常量。它可以使代码更加可读,帮助程序员更容易理解程序中的常量值。通过枚举,程序员可以使用有意义的名称来代替数字&…...

python+playwright自动化测试(一):安装及简单使用,截图录屏

目录 基本使用 浏览器调用 启用浏览器 创建窗口对象 访问URL 页面的刷新、返回、前进 关闭 截图、录屏、保存pdf 截图 录屏 保存为pdf 设置窗口大小 调试模式 手机模式及new_context的更多参数 手机模式 new_context的其他参数 设置语言和时区 设置和修改位置…...

Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)

MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次,每个层次负责不同的功能模块。 MySQL的体系结构主要由以下几个部分组成&#…...

git merge 压缩提交

在 Git 中,执行 git merge 时可以通过一些操作来“压缩”提交,通常是指将合并过程中的多个提交压缩成一个单一的提交。这可以通过使用 --squash 选项来完成,或者在合并后进行交互式 rebase。以下是两种常见的方法: 方法 1&#x…...

Python脚本自动发送电子邮件

要编写一个Python脚本来自动发送电子邮件,你可以使用smtplib库来处理SMTP协议,以及email库来构建邮件内容。 安装必要的库 通常情况下,smtplib和email库是Python标准库的一部分,因此不需要额外安装。如果你使用的是较旧的Python版…...

uniapp中rpx和upx的区别

在 UniApp 中,rpx 和 upx 是两种不同的单位,它们的主要区别在于适用的场景和计算方式。 ### rpx(Responsive Pixel) - **适用场景**:rpx 是一种响应式单位,主要用于小程序和移动端的布局。 - **计算方式**…...

CentOS 9 Stream 中查看 Python 版本并升级 Python

CentOS 9 Stream 中查看 Python 版本并升级 Python 1. 查看当前 Python 版本2. 升级 Python 版本(1)安装开发工具(2)安装必要的依赖包(3)下载和安装新版本的 Python(4)验证安装 3. …...

可以用于分割字符串的方法(python)

一、str.split(sep,maxsplit)函数(返回列表) sep:分隔符 maxsplit:分割次数 a"Hello world" list1a.split(" ",1) print(list1) 结果: [Hello, world] 二、str.rsplit(sep,maxsplit)函数&…...

【Vue】全局/局部组件使用流程(Vue2为例)

全局组件和局部组件区别 如何使用 全局组件:全局注册后,可以在任意页面中直接使用。局部组件:在页面中需要先导入子组件路径,注册组件才能使用。 适用场景 全局组件:适用于高频使用的组件,如导航栏、业…...

virtual box虚拟机误删Python3.6后导致UBUNTU18.04开机无UI界面(进不了desktop)的解决方法

最近在解决一个python引起的问题的时候,作者心一狠,删了系统自带的python3.6, 顺便还删了python3。导致重启后ubuntu的virtual box虚拟机无法看到UI登录界面,只给我了孤零零的命令行。装了很多东西不可能重装,无奈只能…...

虚拟线程JDK与Spring Core Reactor

两种虚拟线程对比:JDK vs. Spring Core Reactor性能对比 1、基于 JDK 的虚拟线程实现: 摘自实际代码: public static void withFlatMapUsingJDK() { ... var virtualThreadExecutor Executors.newThreadPerTaskExecutor( Thread .ofVirtual…...

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析

一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言,以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具,仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…...

C++ NULL和nullptr

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码: #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 如上是条件编译的宏定义 确保在不同编程环境下正确处理NULL的定义 C中NULL可能被定义…...

算法日记1:洛谷p2678跳石头(二分答案)

1、题目 二、题解: 2.1解题思路: 1.题目要求求出最小值最大,明显的二分答案题目,所以我们可以二分可以跳跃距离int l-1,rL1; 2.此时我们思考lmid和rmid的处理,当我们的check(mid)为true时候 表明我们此时的mid是符合要求的, 那么…...

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析 目录 PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析1. 引言2. PID控制器的基本概念2.1 PID控制器的定义2.2 PID控制器的核心思想2.3 PID控制器的应用领域 3. PID控…...

Vue中nextTick实现原理

源码实现思路(面试高分回答) 面试官问我 Vue 的 nextTick 原理是怎么实现的,我这样回答: 在调用 this.$nextTick(cb) 之前: 存在一个 callbacks 数组,用于存放所有的 cb 回调函数。存在一个 flushCallbac…...

【MATLAB】subplot如何增加title

在 Matlab 中,使用 subplot 函数将图形窗口划分为多个子图,并使用 title 函数为每个子图添加标题。以下是一个示例: matlab % 生成示例数据 x 0:0.1:10; y1 sin(x); y2 cos(x); % 创建一个 2 行 1 列的子图布局,并选…...

vue3+ts的<img :src=““ >写法

vue3ts的<img :src"" >写法<img :src"datasetImage" alt"数据分布示意图" /><script setup lang"ts">const datasetImage ref();datasetImage.value new URL(../../../assets/images/login-background.jpg, impo…...

Vue+Echarts+百度地图 实现 路径规划

实现功能: 通过选择 相关调拨&#xff0c;系统自动规划 路径&#xff0c;并且以地图的形式呈现最佳路径 技术难点: 1. vue 结合使用 echarts 2.echarts 在 vue嵌入百度地图&#xff0c;并且做出路径 曲线 最终结果:...

uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?

前言 在开发微信小程序时&#xff0c;使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时&#xff0c;就遇到了两个非常令人头疼的问题&#xff1a; 层级穿透&#xff1a;由于 textarea 是原生组件&#xff0c;任何元素都无法遮盖住它。当其…...

IGP协议的双点双向注入(路由引入)

一、拓扑环境 二、单向注入 以上拓扑为例&#xff0c;单点注入存在路由回包问题 在AR5上注入直连路由 55.5.5.5 需求&#xff1a;AR1上的10.1.1.1 需访问AR5上的55.5.5.5 1、在AR2和AR3上查看注入的55.5.5.5的路由信息 2、现在边界设备以学习到目的网段的路由信息&#xff0…...

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想&#xff1a;数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架&#xff1a; create-react-app &#xff0c;目前使用它安装默认是19版本&#xff0c;我们这里降为18…...

“AI 自动化效能评估系统:开启企业高效发展新征程

在当今数字化飞速发展的时代&#xff0c;企业面临着日益激烈的市场竞争&#xff0c;如何提升效率、降低成本成为了企业生存与发展的关键。AI 自动化效能评估系统应运而生&#xff0c;它如同一把智能钥匙&#xff0c;为企业开启了高效发展的新征程。 AI 自动化效能评估系统&…...

免 root 开启 Pixel 手机 VoLTE 功能

部分运营商需要开启 VoLTE 功能才可以正常通话和接收短信&#xff0c;但是默认情况下&#xff0c;Pixel 是无法开启的&#xff0c;需要我们手动开启一下。经过网友的确认&#xff0c;这种方法还适用于荣耀 MAGIC 等其他品牌的手机。 具体流程如下&#xff1a; 1.打开开发者选…...