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

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片

  

c54099cd75c88a72da72f835d472799a    fa7fee46

 一.伪造请求获取验证码图片

    image

    image

  可以看到请求中主要的两个参数ctxid和request,所以我们只需要找到这两个参数的生成逻辑并进行请求就可以获取到验证码图片

image

   根据谷歌浏览器关键字搜索便可以找到相关字段的生成逻辑,我们只需要仿照着他的逻辑进行生成即可,值得注意的是request参数进行了双重加密,base64Encode中嵌套一个encrypt。这块我们不需要关注他具体是怎么加密的,我们只需要找到他对应的js方法,通过python直接调用即可

function a() {for (var n, e = "6_11_7_10_4_12_3_1_0_5_2_9_8".split("_"), t = [], r = 0; r < 52; r++)n = 2 * parseInt(e[parseInt(r % 26 / 2)]) + r % 2,parseInt(r / 2) % 2 || (n += r % 2 ? -1 : 1),n += r < 26 ? 26 : 0,t.push(n);return t}
function base64Encode(n) {var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");return function(n) {var t, r, i, o, a, s, c;for (r = i = 0,o = n.length,s = (o -= a = o % 3) / 3 << 2,a > 0 && (s += 4),t = new Array(s); r < o; )c = n.charCodeAt(r++) << 16 | n.charCodeAt(r++) << 8 | n.charCodeAt(r++),t[i++] = e[c >> 18] + e[c >> 12 & 63] + e[c >> 6 & 63] + e[63 & c];return 1 == a ? (c = n.charCodeAt(r++),t[i++] = e[c >> 2] + e[(3 & c) << 4] + "==") : 2 == a && (c = n.charCodeAt(r++) << 8 | n.charCodeAt(r++),t[i++] = e[c >> 10] + e[c >> 4 & 63] + e[(15 & c) << 2] + "="),t.join("")}(n)}function encrypt(n) {var e, t = "e98ae8878c264a7e";function r(n) {if (/^[\x00-\x7f]*$/.test(n))return n;for (var e = [], t = n.length, r = 0, i = 0; r < t; ++r,++i) {var o = n.charCodeAt(r);if (o < 128)e[i] = n.charAt(r);else if (o < 2048)e[i] = String.fromCharCode(192 | o >> 6, 128 | 63 & o);else {if (!(o < 55296 || o > 57343)) {if (r + 1 < t) {var a = n.charCodeAt(r + 1);if (o < 56320 && 56320 <= a && a <= 57343) {var s = 65536 + ((1023 & o) << 10 | 1023 & a);e[i] = String.fromCharCode(240 | s >> 18 & 63, 128 | s >> 12 & 63, 128 | s >> 6 & 63, 128 | 63 & s),++r;continue}}throw new Error("Malformed string")}e[i] = String.fromCharCode(224 | o >> 12, 128 | o >> 6 & 63, 128 | 63 & o)}}return e.join("")}function i(n) {return 4294967295 & n}function o(n, e, t, r, i, o) {return (t >>> 5 ^ e << 2) + (e >>> 3 ^ t << 4) ^ (n ^ e) + (o[3 & r ^ i] ^ t)}function a(n, e) {var t, r = n.length, i = r >> 2;0 != (3 & r) && ++i,e ? (t = new Array(i + 1))[i] = r : t = new Array(i);for (var o = 0; o < r; ++o)t[o >> 2] |= n.charCodeAt(o) << ((3 & o) << 3);return t}return null == n || 0 === n.length ? n : (n = r(n),t = r(t),function(n, e) {var t = n.length, r = t << 2;if (e) {var i = n[t - 1];if (i < (r -= 4) - 3 || i > r)return null;r = i}for (var o = 0; o < t; o++)n[o] = String.fromCharCode(255 & n[o], n[o] >>> 8 & 255, n[o] >>> 16 & 255, n[o] >>> 24 & 255);var a = n.join("");return e ? a.substring(0, r) : a}(function(n, e) {var t, r, a, s, c, l, d = n.length, u = d - 1;for (r = n[u],a = 0,l = 0 | Math.floor(6 + 52 / d); l > 0; --l) {for (s = (a = i(a + 2654435769)) >>> 2 & 3,c = 0; c < u; ++c)t = n[c + 1],r = n[c] = i(n[c] + o(a, t, r, c, s, e));t = n[0],r = n[u] = i(n[u] + o(a, t, r, u, s, e))}return n}(a(n, !0), ((e = a(t, !1)).length < 4 && (e.length = 4),e)), !1))}
mainJs = execjs.compile(open(r"./Utils/main.js",encoding="utf-8").read())def getCaptcha(contextid):o = "appid=202503141611|ctxid=" + contextid+ "|a=quoteapi|p=|r=" + str(random.random())oEncrypt=mainJs.call('encrypt',o)# 对字符串进行URL编码reqStr=quote(mainJs.call('base64Encode',oEncrypt))print(reqStr)url='api/captcha/get?callback=&ctxid='+contextid+'&request='+reqStr+'&_='+str(int(time.time()*1000))print(url)initResponse = http.request('GET', url)print('initResponse:')print(initResponse.data)initResult = initResponse.data.decode('UTF-8')initData = json.loads(initResult)if initData["ReturnCode"]=="0" and initData["Data"]["CaptchaType"]=="init":slideResponse = http.request('GET', url)print('slideResponse:')print(slideResponse.data)slideResult = slideResponse.data.decode('UTF-8')slideData = json.loads(slideResult)print(slideData)if slideData["ReturnCode"]=="0" and slideData["Data"]["CaptchaType"]=="slide":print("getCaptcha slide success")captchaInfo={}captchaInfoObj=json.loads(slideData["Data"]['CaptchaInfo'])captchaInfo["bg"]="https://"+captchaInfoObj['static_servers'][0]+captchaInfoObj['bg']captchaInfo["fullbg"]="https://"+captchaInfoObj['static_servers'][0]+captchaInfoObj['fullbg']captchaInfo["slice"]="https://"+captchaInfoObj['static_servers'][0]+captchaInfoObj['slice']return captchaInfoelse:print("getCaptcha slide error")return Noneelse:print("getCaptcha init error")return None

 二.重新拼接验证码图片

image  image

 

通过上边的操作,我们就能获得一张顺序错乱的验证码,接下来我们就需要重新复原这张图片。接口返回一张错乱的验证码图片,但页面上为什么显示正常呢?那肯定是前端js逻辑把这块给处理了一下,页面就得到了一张正常的验证码图片,那么我们就需要找一下他前端js的处理逻辑了,只要按照他的逻辑处理,我们同样也能复原这张错乱验证码

image

 

def get_image(image_url):e = "6_11_7_10_4_12_3_1_0_5_2_9_8".split("_")location_list = []for r in range(52):location = {}# 计算索引index = int(r % 26 / 2)n = 2 * int(e[index]) + (r % 2)# 条件判断if (int(r / 2) % 2) == 0:n += -1 if (r % 2) else 1# 添加偏移量if r < 26:n += 26location['x'] = n % 26 * 12 + 1location['y'] = (0 - 160)/ 2 if n <= 25 else 0location_list.append(location)print('==================================')image_result = requests.get(image_url).contentimage_file = BytesIO(image_result) image = merge_image(image_file,location_list)return image

 三.获取缺口距离

def get_distance(url1,url2):'''拿到滑动验证码需要移动的距离:param image1:没有缺口的图片对象:param image2:带缺口的图片对象:return:需要移动的距离'''# print('size', image1.size)#print(type(image1))len=0threshold = 50image1=get_image(url1)image2=get_image(url2)# 创建绘图对象draw = ImageDraw.Draw(image2)for i in range(0,image1.size[0]):  # 260for j in range(0,image1.size[1]):  # 160pixel1 = image1.getpixel((i,j))pixel2 = image2.getpixel((i,j))res_R = abs(pixel1[0]-pixel2[0]) # 计算RGB差res_G = abs(pixel1[1] - pixel2[1])  # 计算RGB差res_B = abs(pixel1[2] - pixel2[2])  # 计算RGB差if res_R > threshold and res_G > threshold and res_B > threshold:len=i  #
                print(f'{len}-({res_R},{res_G},{res_B})')# 绘制一条线draw.line((130, 0, len, 20), fill="red", width=3)break image2.show()#image2.save('./Image/code.jpg')return len

 三.根据缺口距离生成滑动轨迹

def generate_sliding_track(x):# 初始化轨迹列表slide_track = [[random.randint(-50, -20), random.randint(-200, -100), 0],[0, 0, 0],]if x < 100:move_section = 1 #如果移动距离小于100 那么move次数为x加上 7到20之间的数else:move_section = 2 #如果移动距离小于100 那么move次数为x加上 2乘 7到20之间的数
up_down = random.randint(0, 1) #确定一个方向 x大于0或x小于0y = 0  #数组的y值time = random.randint(100,180)  #初始时间 即为第二个数组的时间  后续时间累加操作就可以了count = 0flag = 0repetition = int(x/4)  #重复x出现的个数frist_count = random.randint(6,10) #前面y为0的数组个数for i in range(x*random.randint(move_section*7,move_section*21)): #move_section 在这里起作用if i+1 > x: #如果i+1要等于x 或者小于x 但这里基本上都是等于xbreakif up_down == 0:  #up_down如果大于0 那么这个轨迹就是y增轨迹if i >frist_count:if count==0:y += random.randint(0, 1)count +=1if flag>random.randint(8,10):count = 0flag = 0if i + 1 > int(x / 5)*4:time += random.randint(20, 70)elif i+1 > x-3:time += random.randint(80, 180)else:time += random.randint(0,5)slide_track.append([i+1,y,time])flag+=1if random.randint(0,1):if repetition:slide_track.append([i + 1, y, time+random.randint(0,3)])flag += 1repetition -= 1else:  #前面几个数组y都为0time += random.randint(0, 5)slide_track.append([i + 1, y, time])if random.randint(0,1):if repetition:slide_track.append([i + 1, y, time+random.randint(0,3)])repetition -= 1if up_down == 1:  #up_down如果小于0 那么这个轨迹就是y减轨迹if i > frist_count:if count==0:y -= random.randint(0, 1)count +=1if flag>random.randint(8,10):count = 0flag = 0if i + 1 > int(x / 5)*4:time += random.randint(7, 40)elif i+1 > x-3:time += random.randint(80, 180)else:time += random.randint(0, 5)slide_track.append([i+1,y,time])flag +=1if random.randint(0,1):if repetition:slide_track.append([i + 1, y, time+random.randint(0,3)])flag += 1repetition -= 1else:time += random.randint(0, 5)slide_track.append([i + 1, y, time])if random.randint(0,1):if repetition:slide_track.append([i + 1, y, time+random.randint(0,3)])repetition -= 1return slide_track

 四.提交验证

image

 通过逆向网站js,我们可以查看到他提交时的逻辑,其中userresponse为缺口距离,data便是轨迹数据,我们只需要根据他的逻辑来实现我们的python逻辑即可

def validate(ctxid,l):try:tracks=generate_sliding_track(l)# # tn={"appid":"202503141611","ctxid":"","type":"slide","userresponse":0,"data":"","account":"quoteapi","password":"","t":0,"random":random.random()}n['ctxid']=ctxidn['userresponse']=ln['data']=format_tracks(tracks)n['t']=tracks[-1][2]o = "appid=" + n['appid'] + "|ctxid=" + n['ctxid'] + "|type=" + n['type'] + "|u=" + str(n['userresponse']) + "|d=" + n['data'] + "|a=" + n['account'] + "|p=" + n['password'] + "|t=" + str(n['t']) + "|r=" + str(n['random'])oEncrypt=mainJs.call('encrypt',o)# 对字符串进行URL编码reqStr=quote(mainJs.call('base64Encode',oEncrypt))print(reqStr)url='/api/captcha/Validate?callback=&ctxid='+ctxid+'&request='+reqStr+'&_=1756106181125'print(url)header['Referer']=''response = http.request('GET', url, headers=header)print(response.data)result = response.data.decode('UTF-8')jsonData = json.loads(result)print(jsonData)if jsonData["ReturnCode"]=="0":print("validate success")return json.loads(jsonData["Data"]['Result'])['validate']else:print("validate error")return Noneexcept Exception as e:print(e)return None

 

相关文章:

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片一.伪造请求获取验证码图片可以看到请求中主要的两个参数ctxid和request,所以我们只需要找到这两个参数的…...

解决 pandas.to_csv 乱码、丢失行和自动换行问题 时间转换

解决 pandas.to_csv 乱码、丢失行和自动换行问题-百度开发者中心 https://developer.baidu.com/article/details/2792989 在使用 pandas.to_csv 函数时,可能会遇到一些问题,如乱码、丢失行和自动换行等。这些问题通常是由于编码格式、数据类型或文件写入方式不当引起的。下面…...

JavaDay7

数组 数组的定义数组是相同类型数据的有序集合。 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组…...

前端场景题笔记

先说背景再说方案 1. js超过number最大值的数怎么处理? 换数据类型。 2. 如何解决页面请求接口大规模并发问题? 请求队列,Push,shift。防抖节流。 3. 大文件上传? 前端切片,标记唯一值,后端整合。 4. 前端怎么实现截图? Canvas(基于html的绘图工具)(…...

P3934 [Ynoi Easy Round 2016] 炸脖龙 I 做题记录

欧拉函数前置芝士:扩展欧拉定理 题目大意 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作:区间 \([l,r]\) 加 \(x\); 对于区间 \([l,r]\),查询:\[{a_l}^{{a_{l+1}}^{{a_{l+2}}^{{\dots} ^{a{r}}}}} \mod p \]思路 首先我们有: \[a^k\equiv \left\{\begin{matrix}a^k, …...

【CompletableFuture 核心操作全解】详细注释版

一、任务创建操作 1. runAsync() - 执行无返回值的异步任务 /*** 创建并执行无返回值的异步任务* * @param runnable 要执行的任务逻辑(无返回值)* @return CompletableFuture<Void> 表示任务执行状态的Future对象* * 特点:* - 任务在ForkJoinPool.commonPool()中执行…...

关于学术不端的一些思考

前言 由图书馆性骚扰事件,牵扯出学术不端行为,最后撤销硕士学位。正应了那句“来说是非者,便是是非人”。学术不端 中华人民共和国学术不端问题包括论文抄袭、洗稿、代写、造假、买卖、学历学位认证失信行为、掠夺性开放获取出版、批量引进海外“速成博士”等。 国际上一般指…...

python基础-字典

字典:以键值对的方式存储 { key: value, key2:value2} 初始化空字典: dict2 = {} 或者dict3 = dict() 字典的常见操作:1.增加 dict1[id] = 1101 如果key = id不存在,则新增key和value对应的键值对; 如果key = id的已存在,则修改覆盖key = id对应的value的值2.删除del …...

pod 内nslookup请求时常异常

pod 内nslookup请求时常异常 现象原因 装机模板中在 /etc/resolv.conf 添加了 search tbsite.net 。 kubelet clusterfist 会自动将宿主机的 search 追加到 search default.svc.cluster.local svc.cluster.local 之后。 解决方式 清理 node 上的 search 记录。业务 pod 需要重启…...

单调队列优化DP

董晓一系列都可以做下来 https://www.bilibili.com/video/BV19X4y1m7Sb dp题单 https://www.luogu.com.cn/training/853282...

4.5.11版本闪亮登场~快来看看有哪些新功能

产品更新概览 功能修复: 修复检测更新失败问题; 修复iframe组件存放文件夹无法打开问题; 修复二维地图部分场景加载失败问题; 修复项目发布后无法获取数据问题; 修复访客免验证登录校验问题。 功能优化: 优化数据刷新逻辑; 鲸孪生标记性能优化; 图标组件性能优化; 优化…...

教你数分钟内创建并运行一个 DolphinScheduler Workflow!

本文就主要探讨如何在 ApacheDolphinScheduler 上更好地玩转 Workflow, 以帮助大家更好地管理数据处理任务。Workflow是什么? 对于数仓场景和数据湖场景来说,最显著的特点就是数据处理的长流程和高复杂度任务依赖关系,从源数据采集到最终报表数据的生成,中间可能经历上百个…...

AT_agc065_b [AGC065B] Erase and Insert

倒过来看,每次将 \(p\) 中 \(i\) 随便放到一个位置,那么在放 \(i\) 之前,你需要保证 \(1 \sim i - 1\) 的相对顺序递增,然后就可以 DP 了。 另外一种做法是题解区第一篇。...

《大模型时代——智能体的崛起与应用实践(微课视频版)》

在人类技术演进的长河中,人工智能(Artificial Intelligence,AI)无疑是最具革命性的篇章之一。随着科技的飞速发展,人类迎来了一个全新的纪元—大模型时代。本章旨在深入剖析这一时代的内涵,从大模型的基本概念出发,探索其发展历程,关键技术要素,核心价值,以及支撑其发…...

第三节:GoLangChain提示词(Prompts)处理详解

在使用大语言模型(LLM)时,提示词(Prompt)是与模型交互的关键。良好的提示词设计能够显著提升模型输出的质量。本文将基于langchaingo库,详细介绍Go语言中处理提示词的几种主要方式。 1. 引言在与大语言模型交互时,提示词的设计至关重要。LangChain框架提供了一套完整的提示词…...

rhel8 中vdo 邏輯卷的邏輯擴容

物理盤 = 500G vdo size = 2000G 擴容到5000Gumount /home/repo vdo stop --name=vdo01 vdo growLogical --name=vdo01 --vdoLogicalSize=5000Gdf --human-readable /home/repoxfs_growfs /dev/mapper/vdodf --human-readable /home/repovdostats --human...

Codeforces Round 1051 (Div. 2) 部分题解

D E F 题解Codeforces Round 1051 (Div. 2) 部分题解 D - Inversion Graph Coloring 理解成二分图,图中没有奇环,等价于序列不存在 \(i<j<k\) 使得 \(a_i>a_j>a_k\) 。 设 \(f_{i,x,y}\) 表示前 \(i\) 个数,当前序列最大值为 \(x\) ,下一个不能取小于 \(y\) 的…...

kingbase金仓数据库的密码有效期和密码复杂度

Kingbase金仓数据库提供了密码有效期和复杂度配置功能,可以通过以下方式进行设置: 一. 密码有效期配置 插件identity_pwdexp identity_pwdexp是KingbaseES的一个扩展插件,用于设置口令有效期。 KingbaseES的用户管理中含有口令有效期这一属性,用户密码过期检查就是通过设置…...

HDF5文件

掌握HDF5文件:先理解核心结构(打基础),再学C#读写库(搭环境),最后实战读写操作(练手)。 全程结合代码示例,确保新手能跟上。 阶段1:先搞懂HDF5文件的核心结构(必须先理解!) HDF5(Hierarchical Data Format 5)是一种分层结构的二进制文件格式,专门用于存储和管…...

Error encountered when performing Introspect the Portion of idea Introspect using JDBC metadata在哪设置

Error encountered when performing Introspect the Portion of 最新解决方案&新版本idea Introspect using JDBC metadata在哪设置?前言 使用idea2025专业版(MAC)连接mySQL后无法显示表结构,并且报错 Error encountered when performing Introspect the Portion of 1 …...

核桃 CSP-S 模拟

核桃 CSP-S 模拟 T3 题意: 给定一个 \(01\) 串,选定一个操作序列,每次从原串中删除一个数,保持原串中相对顺序不变,把形成的新字符串加入答案字符串,求出本质不同答案字符串总数。 其中 \(n\le 400\) 思路: 我们不妨把题意转化一下,对于每一个节点赋值 \(t_i\) 表示 \(…...

正确输入连字号、连接号、破折号和负号

转载:Pigman - 博客园: 正确输入连字号、连接号、破折号和负号论文书写和报告编制中,经常出现连字号、连接号、破折号和负号的混淆使用,既不符合规范也影响文档美观。下面对这组符号进行区分,并给出word下正确输入方法。连字号 (Hyphen),[-] 1) 英语中的复合词,…...

9 月记录

P13644 K-LCA 给出树和 \(k\),每次询问给出区间 \([l,r]\),找到选择 \(k\) 个区间内的点使得 LCA 深度最大。 \(n,q\le 10^5,1<k\le n\)。考虑回滚莫队,每次加入一个点,二分最深的子树个数 \(\ge k\) 的祖先,可以做到两个 \(\log\)。 考虑树链剖分,标号是先标号轻儿子…...

python基础-元组

元组: 一个元组可以存储多个数据,切元组内的数据是不可更改 t1 = (10,20,30)t2 = (10,)t3 = 10, 元组操作:元组不支持修改,只支持查找tuple.index()访问:下标访问: tuple[index]统计某项元素出现的次数: tuple.count(item)元组的长度: length = len(tuple)目标元素的位置…...

.net core中获得程序集以及注入框架的方法总结

虚方法public class Animal { // 虚方法 public virtual void MakeSound() { Console.WriteLine("动物发出声音"); } }public class Dog : Animal { // 重写虚方法 public override void MakeSound() { Console.WriteLine("汪汪汪!"); } }var sss = Assem…...

python基础篇-list(列表)

list:列表中可以一次性存储多个数据,且数据项的类型可以不同 常见操作:1.查找下标访问,查找某个位置的数据项: list[index]查找某个数据项首次出现的下标: list.index[item, 开始位置下标, 结束位置下标];如果存在则返回出现位置下标,如果不存在,则报错出现的次数: li…...

vscode使用powershell中文乱码

VSCode使用终端中文乱码 原因: vscode编辑文本默认使用utf-8,但是windows的终端默认使用gbk(简体中文)编码。utf-8采用1-4位记录一个字符,其中中文采用3位。gbk采用两位记录一个中文字符。所以中文显示乱码。 解决方案:先确认终端是中文编码,在终端输入chcp,若输出936表…...

关于如何读懂 P11832 [省选联考 2025] 图排列?

题面太形式化了! 我!根!本!读!不!懂! 这题想要拿分必须转化题面。 初步转化 他只给了我们 \((p_{a_i},p_{b_i})\),然后让我们去找最小的 \(p\)? 没给我 \(a_i,b_i\)?\(a_i,b_i\) 不用刻意构造出来,我们只需要时刻保证 \(a_i,b_i\) 的限制就可以了。 假设我们拿到了最…...

Untitled

Untitled展开思考过程 Hinted 3/5 似乎没有性质,因此考虑做一步转化。 考虑一个点若被同种边通过大于 2 次,那么 必然有一次没有用,考虑每条边可以是区间 +1 或者是区间 -k(k 足够大),要求最终每个点 <0 并且绝对值不是 k 的倍数 让我想到同余最短路,但是我们可以考虑…...

敏感性分析

什么是敏感性分析? 数学模型只是实际问题的一个粗略的抽象,最优解也只是针对某一特定的数学模型。管理者要对未来做各种假设,在这些假设下,测试可能产生的结果,通过对各种结果深入分析来指导决策。通常,在取得最初版本模型的最优解之后,进行分析 才能取得对问题深入的认…...

完整教程:论园区电气安全管理系统的重要性

完整教程:论园区电气安全管理系统的重要性pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

基于CSU8RP1186芯片的握力器解决方案

握力器方案采用高精度传感器、ADC芯片和先进的数据处理技术,可将物体的重量以千克和磅为单位进行准确测量和记录,其原理是通过在称重时,握力器传感器的金属构架受力形变,贴片上的金属丝也随着被拉长或缩短,金属丝电阻因此改变,通过测量金属丝的电阻变化,得到所称重物的数…...

亮相2025年服贸会,天翼云打造高质量算力服务新生态!

近日,2025年中国国际服务贸易交易会(简称服贸会)在北京隆重举行。本届服贸会以“数智领航,服贸焕新”作为年度主题,顺应服务贸易数字化、智能化、绿色化趋势,聚焦人工智能、医疗健康、智慧物流、商旅文体健融合发展等专业领域,展示多个国家和地区的创新发展成果。天翼云…...

易路薪酬专家Agent:基于10亿级数据与AI的智能薪酬解决方案

导读: 在AI深度赋能人力资源管理的趋势下,薪酬模块的智能化已成为企业提升人效与战略决策的关键。本文深度解析易路人力资源科技公司最新推出的人才薪酬专家Agent,重点介绍其基于10亿级动态市场数据与多智能体协同(市场数据Agent、薪酬诊断Agent、竞品招聘动态Agent)的核心…...

有点意思!Java8后最有用新特性排行榜!

相信这两天看了 JDK 25 新特性的同学已经彻底对 Oracle 失望了,这那是挤牙膏啊?是连牙膏都懒得挤了。 所以,大家都在评论区喊话,如果你(Oracle)实在不想发可以不发,但不要糊弄大家。 那么,今天呢。我也把从 JDK 8 之后的长期支持版:JDK11、JDK17、JDK21、JDK25 的新特…...

数据结构 Trick 之:KDT 求 k 近/远 点

注意,此 Trick 的时间复杂度是错的,但是貌似目前没人能卡满。 能够解决的问题\(O(n \sqrt n)\) 可过。 维护二维平面。 每次求到一个点的 \(k\) 近或 \(k\) 远点。 \(k\) 很小(\(20\) 左右)思路 二维空间想到 KDTree(TreeKevin Durant Tree)。 众所周知,动态维护 \(k\) …...

.NET 8程序配置版本及产品信息

一、给主程序单独添加配置 1、双击主程序,会打开主程序的.csproj文件,在PropertyGroup下添加 <Company>Your Company</Company><Product>Your Product</Product><Version>1.2.3</Version><FileVersion>1.2.3.0</FileVersion…...

C语言第二讲:进制转化

C语言中进制转化的符号表示进制 数据类型 赋值格式二进制 %0b a=0b1010八进制 %o a=03344十进制 %d a=1234十六进制 %x/%X a=0x34a5 / 0X43D6输出时转化: int a=100; printf("%o",a); 赋值时转化: int a; a=03355//赋值为八进制数...

XXL-JOB(4)

XXL-JOB(4)分片任务 分片任务能更好的利用集群的能力,可以同时调度多个机器并行运行任务。分片任务的实现原理包括以下几个核心步骤:1、任务分配当一个分片任务被触发时,调度器会根据任务的分片参数决定需要多少个执行器参与任务。每个执行器或执行线程会接收到一个分片索…...

QOJ #10485. Peculiar Protocol 题解

Description 你有一个序列 \(a_1, a_2, \dots, a_n\),以及两个参数 \(d, r\)。 你可以做如下操作若干次:每次选择一段区间,使得他们的和可以被表示成 \(k \times d + r\) 的形式,其中 \(k\) 是一个非负整数。 你把 \(k\) 加入分数中,然后在序列中删去这一段,剩下的序列合…...

C++ 常用关键字

1. static 控制作用域、生命周期或类成员归属 // 1. 全局/命名空间:仅当前文件可见(避免跨文件重定义) static int global_static = 10; // 其他文件无法通过 extern 访问// 2. 局部变量:生命周期延长至程序结束(仅初始化1次) void counter() {static int cnt = 0; cnt++…...

【AP出版】第四届数理统计与经济分析国际学术会议 (MSEA 2025)

第四届数理统计与经济分析国际学术会议 (MSEA 2025)将于2025年12月05-07日在中国广州召开。【高录用快见刊:最快一周内即可录用,会后3-4个月见刊】 【征稿范围:数理统计、经济分析大方向主题均可收稿】 第四届数理统计与经济分析国际学术会议 (MSEA 2025) 2025 4th Internat…...

数据结构 Trick 之:区间子区间计数

能够解决的问题\(O(n \log n)\) 可过。 维护数列,无修改,每次查询一个区间的所有子区间。 离线思路 看到一个区间的所有子区间这种查询,直接做显然是做不了的。 考虑离线,那么将询问区间进行右端点排序,然后就可以扫描线搞掉一维。 我们从左往右枚举 \(r\) 维护线段树 \(t…...

mapstruct.Mapper|Mapping详解

------------------------------------------------------------------------------------------ org.mapstruct.Mapper 和 org.mapstruct.Mapping 是 MapStruct 框架中的核心注解,用于实现 Java 对象之间的自动映射。MapStruct 是一个代码生成器,通过注解配置生成类型安全、…...

抽象代数-学习笔记

主要积累一些遇到的例子、题目。不定时更新。 运算有结合律的运算:普通/复数/矩阵/模意义下加法、乘法,映射复合,与或异或/集合相关, min/max。 仅仅满足部分群公理:\(\mathbb{N}^*, \mathbb{N}\)。\(\{0,1,2\}\) 上可构造有单位元、有逆元但无结合律的运算。 域的性质仅仅…...

如何在保证质量的前提下,快速完成一份 PPT?

这是一个非常经典且普遍的问题,尤其对于产品经理、咨询顾问等角色来说,PPT既是生产力工具,也是时间吞噬黑洞。你能意识到这个问题并寻求解决方案,已经领先了很多人。 在保证质量的前提下快速完成PPT,绝非单纯追求“手速”,而是一套系统工程,涉及工作流程、工具链、方法论…...

Source Code Summarization in the Era of Large Language Models 论文笔记

介绍 (1) 发表:ICSE25 (2) 背景 之前的研究表明,与传统的代码摘要模型相比,LLM 生成的摘要在表达方式上与参考摘要有很大不同,并且倾向于描述更多的细节。因此,传统的评估方法是否适合评估 LLM 生成摘要的质量仍然未知 (3) 贡献 受到 NLP 工作的启发,本文对使用 LLM 本身…...

线性回归-入门案例

使用公开的房价数据集进行预测,数据包含8个特征1个目标值 特征最多使用2次幂代码示例 import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing from sklearn.linear_model import LinearRegression from sklearn.metrics import mean…...

XXL-JOB(3)

XXL-JOB(3)开发Bean模式(基于方法)Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。优点:每个任务只需要开发一个方法,并添加”@Xxl…...

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 - 若

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 前言 ClickHouse 作为高性能的列式数据库,其表引擎设计是其核心优势之一。ReplacingMergeTree 是处理重复数据的利器,而 PARTITION、PRIMARY KEY、ORDER BY 等配置直接影响查询性能和…...