文章目录
- 概要
- 整体架构流程
- 小结
概要
提示:仅供学习,不得用做商业交易,如有侵权请及时联系
逆向:360某某某心(滑块、语序文字验证)
URL:aHR0cHM6Ly9pLjM2MC5jbi9sb2dpbi8=
目的:滑块、语序文字验证
整体架构流程
提示:获取token---获取背景图片----验证
一、config接口获取token,url:aHR0cHM6Ly9jYXB0Y2hhLmJwZC4zNjAuY24vdjEvZ2V0Y29uZmln
url = "https://xxx/getconfig"
params = {
"appid": "xxx"
}
config = requests.get(url, headers=headers, params=params).json()
token = config["data"]['token']
logger.info(f"获取token: {token}")
return token
二、get接口,获取背景图片以及ftoken,url:aHR0cHM6Ly9jYXB0Y2hhLmJwZC4zNjAuY24vdjEvZ2V0
url = "https://xxx/get"
params = {
"appid": "xxx",
"token": token,
"ty": "1"
}
captcha = requests.get(url, headers=headers, params=params).json()
三、verify接口,验证接口,url:aHR0cHM6Ly9jYXB0Y2hhLmJwZC4zNjAuY24vdjEvdmVyaWZ5,先看加密参数:
经过观察,只有这个d参数是加密的,我们可以通过启动器断点去分析参数是怎么生成的:这里我们先分析***滑块的d***是什么生成
那么怎么获取滑块滑动距离呢直接用cv2:
import numpy as np,cv2
# 获取滑块距离
def identify_gap(bg, tp):
"""
bg: 背景图片
tp: 缺口图片
out: 输出图片
"""
# 读取背景图片和缺口图片
bg_img = cv2.imdecode(np.frombuffer(bg, np.uint8), cv2.IMREAD_GRAYSCALE)
tp_img = cv2.imdecode(np.frombuffer(tp, np.uint8), cv2.IMREAD_GRAYSCALE) # 缺口图片
yy = []
xx = []
for y in range(tp_img.shape[0]):
for x in range(tp_img.shape[1]):
r = tp_img[y, x]
if r < 200:
yy.append(y)
xx.append(x)
tp_img = tp_img[min(yy):max(yy), min(xx):max(xx)]
# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
# # 绘制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
cv2.imwrite('distinguish.jpg', bg_img) # 保存在本地
# 返回缺口的X坐标
return max_loc[0]
下面分析一下轨迹生成,通过浏览器的一组完整的轨迹,然后使用识别出来的距离做相似距离处理(自己去断点拿到trackList):
# 获取滑块轨迹
def guiji(distance):
trackList = [
{
"x": 1,
"y": 23.5067,
"my": 184.29998779296875,
"mx": 25.5999755859375,
"t": 1731651034502,
"type": "mousedown"
},...............]
# 检查value是否在轨迹的x值中
for trajectory in trackList:
if trajectory['x'] == distance:
# 如果找到,截取从轨迹开始到该点的子数组
result = [t for t in trackList if t['x'] <= distance]
result[-1]['type'] = "mouseup"
return result
# 如果value不在x值中,找到最接近value的x值
closest_x = None
min_diff = float('inf')
for trajectory in trackList:
if abs(trajectory['x'] - distance) < min_diff:
min_diff = abs(trajectory['x'] - distance)
closest_x = trajectory['x']
# 截取从轨迹开始到最接近的x值的子数组
result = [t for t in trackList if t['x'] <= closest_x]
result[-1]['x'] = distance
result[-1]['type'] = "mouseup"
return result
继续我们看下一***文字点选的d***怎么生成的:
至于语序文字的坐标识别我们可以使用:ddddocr/模型训练/打码平台
四、最后我们看效果
小结
提示:学习交流群:v:wzwzwz0613