爬虫逆向实战小记——解决captcha滑动验证码
- 创业
- 2025-09-10 22:51:01

注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!!
IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw==
第一步: 分析请求网址和响应内容(1)通过观察,滑块滑动到指定位置即认为验证成功 (2)验证码请求网址和参数。ts 是毫秒级时间戳,clientUid和captchaType固定 (3)请求验证码的响应内容,可以看到有2张图片编码形式的字段originalImageBase64和jigsawImageBase64(一张原始图,一张滑块图), secretKey和token (4)滑动滑块后无论是否成功,会存在一个check验证码 的网址和参数。可以看出pointJson 是加密的,token对应get验证码请求的响应内容(如果不太懂,自己请求一下即可明白) (5) check验证码响应内容如上图所示即为成功,否则均为失败
第二步:解决参数加密(逆向)(1) 在XHR处添加 /captcha/check, 重新请求,可以看到会在 标蓝 处停住,通过堆栈查看,能够看到在end处,为pointJson的加密生成。 (2) 去掉XHR的勾选,在(1)中找到的end中,var r 打断点,重新请求。此处猜测r 为滑块的位移值(r 比真实位移值大需要将真实位置+一个数值区间, 可将浏览器请求的图片放在本地进行对比,在此不在赘述),同时pointJson 生成调用了a 并传入了转为JSON字符串的{x,y}坐标 (3)a 函数可以看出是AES加密ECB模式PKcs7。参数t 是 secretKey(这个可以再实战操作时验证)
第三步: 验证滑块是否成功浏览器上check 验证码响应成功展示
第四步: 部分代码展示JS 加密部分
// 加密部分 CryptoJS = require('crypto-js') function H(e, t) { var i = CryptoJS.enc.Utf8.parse(t) , n = CryptoJS.enc.Utf8.parse(e) , r = CryptoJS.AES.encrypt(n, i, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return r.toString() }python 请求部分
# -*- coding:utf-8 -*- # @Time : 2025/2/18 14:31 # @Author: 水兵没月 # @File : captcha_滑块验证码.py # @Software: PyCharm import base64 import random import time import execjs import requests from fake_useragent import UserAgent from shuibingmeiyue import req_payload # 可以写成requests.post(url, body=json.dumps(data), headers=headers) s = requests.Session() headers = { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Length": "106", "Content-Type": "application/json; charset=UTF-8", "Host": "captcha.ruijie ", "Origin": " captcha.ruijie ", "Pragma": "no-cache", "Referer": " captcha.ruijie /", "User-Agent": UserAgent().Chrome, } # 此处忽略一些非重点代码 # 此处忽略一些非重点代码 # 此处忽略一些非重点代码 def get_slide(target_bytes, background_bytes): '''获取滑块位移值''' import ddddocr # 关闭广告显示 ocr = ddddocr.DdddOcr(show_ad=False, det=False, ocr=False, ) res = ocr.slide_match(target_bytes, background_bytes, simple_target=True) print(res) target_json = float(res["target"][0] + float( '{}'.format(random.choice([15.5, 16.5])))) # target_json = res["target"][0] return target_json def get_AES(): '''获取AES的JS源码''' with open('./captche_AES.js', 'r', encoding="utf-8")as f: AES_source = f.read() f.close() return AES_source def get_image_Base64(img_json): '''获取图片编码以及其他参数''' img_repData = img_json.get("repData") secretKey = img_repData.get("secretKey") originalImageBase64 = img_repData.get("originalImageBase64") jigsawImageBase64 = img_repData.get("jigsawImageBase64") token = img_repData.get("token") # origin_Base64和jigsaw_Base64 已被忽略。作用保存图片 origin_Base64(originalImageBase64) jigsaw_Base64(jigsawImageBase64) # 读取滑块图片和背景图片的二进制数据 # read_origin和read_jigsaw 已被忽略。 作用读取图片 target_bytes = read_origin() background_bytes = read_jigsaw() # 得到滑块位移 target_json = get_slide(target_bytes, background_bytes) return secretKey, target_json, token def get_pic(): '''请求验证码网址''' url = " captcha.ruijie /captcha/get" data = {"captchaType":"blockPuzzle","clientUid":"slider-9d5611b7-e5a0-40a2-a813-a18ecf0ccaf9","ts":int(time.time()*1000)} res = req_payload(s, url, headers, data) res_json = res.json() secretKey, target_json, token = get_image_Base64(res_json) return secretKey, target_json, token def check_captcha(secretKey, target_json, token): '''检测验证码是否成功''' print(target_json) i = int(target_json) i = 310 * i / int(330) e = '{"x":' + str(i) + ',"y":5}' AES_source = get_AES() AES_ctx = execjs pile(AES_source) get_AES = AES_ctx.call("H", e, secretKey) print('get_AES--', get_AES, len(get_AES)) # url = " captcha.ruijie /captcha/check" pointJson = get_AES data = {"captchaType":"blockPuzzle","pointJson":pointJson,"token":token} print(data) res = req_payload(s, url, headers, data) print(res.text) secretKey, target_json, token = get_pic() check_captcha(secretKey, target_json, token) 仅作为笔记记录,如有问题请各位大佬来指导爬虫逆向实战小记——解决captcha滑动验证码由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“爬虫逆向实战小记——解决captcha滑动验证码”