暗号:aHR0cHM6Ly9tYXRjaC55dWFucmVueHVlLmNuL21hdGNoLzg=
该题为图文点选识别,点击对应的文字后,点击指定的页面,才能获取到对应的数据:
首先进行抓包分析,验证码请求接口一共返回了5个重要的数据:
所以先编写代码访问端口,将image 和 验证码id保存下来
接下来就是最重要的文字识别,我这里是使用easyocr库进行的文字识别,但是识别效率较低,有时候9个字只能够识别出8个
附上代码:
from PIL import Image
import easyocr
import numpy as np # 新增:需要转numpy数组
# 初始化 OCR(只加载中文,速度快)
reader = easyocr.Reader(['ch_sim'], gpu=True)
# --------------- 改成你的图片路径 ----------------
image_path = "更改为你的图片名字"
img = Image.open(image_path)
w, h = img.size
# 自动切 3x3 格子
hz = []
cell_w = w//3
cell_h = h//3
print("开始识别 9 个格子文字...\n")
for row in range(3):
for col in range(3):
x1 = col * cell_w
y1 = row * cell_h
x2 = x1 + cell_w
y2 = y1 + cell_h
# 裁剪格子
cell = img.crop((x1, y1, x2, y2))
# 修复:PIL Image 转 numpy 数组,再传给 easyocr
cell_np = np.array(cell)
# 识别
result = reader.readtext(cell_np, detail=0)
text = result[0] if result else ""
hz.append(text.strip())
print(hz)
上面说到,这个文字识别库识别效率比较低,所以我使用了死循环,如果识别后要点击的4个字都在识别的文字列表里面,才结束循环:
点击坐标识别我是模拟了九个点的坐标,并且使用列表来完成:
from random import randint as r
zb=\[\[51+r(-5,5),54+r(-5,5)],\[140+r(-5,5),50+r(-5,5)],\[255+r(-5,5),50+r(-5,5)],\[54+r(-5,5),158+r(-5,5)],\[157+r(-5,5),140+r(-5,5)],\[270+r(-5,5),140+r(-5,5)],\[57+r(-5,5),280+r(-5,5)],\[157+r(-5,5),253+r(-5,5)],\[252+r(-5,5),258+r(-5,5)]]
之后再看验证接口,参数一共需要带两个,这里没有使用到任何加密:
这里有一个小坑!!!
接口中clicks参数中的x和y是由双引号引起来的,所以访问的时候也要使用双引号,可使用 str.replace("'", """) 将单引号改为双引号,如果传入的是单引号,会导致验证失败
之后就能正确获取到数据: