刚过完端午节! 节后回归一波,发一波之前的库存~
直接进入主题 目标站 水利建设市场监管平台
触发验证码 --> 首页 --> 从业人员 --> 随便点个人名的链接,如图
可以看到就是很普通的滑块验证码,我们今天不用selenium的方式去解决了,换个思路,用js的方式去解决,主要是这个网站的验证码简单,拿来当demo也比较适用。
ok 万事先抓包 我们先看看未通过的是怎么样的包 如图
ok 很明显 可以看见post的数值就只有3个
xpos显然是缺口位置
capcode显然是时间戳
modelObjId则是ip地址
都是显而易见的
然后再看返回 失败返回code=2 成功则返回yzmCode 这个应该是后面验参需要用到的东西了。
好了 分析完了 这个验证码实际上没有其他任何js加密 也用不到逆向相关的东西 我们就直接找找如何下载到原图缺口图 然后用算法算出缺口位置 就完事了。
ok 熟练地打开chrome无痕模式 输入网址 抓包 … 实际上点刷新按钮抓包也行 如图
可以看到这个接口给我们返回了backImage和slideImage 的base64,我们把这个接口弄下来,下载几张图片看看
可以看到是这样一组的图片 通过这两张图片 我们就可以用算法去找出缺口位置了!
在这里开源一个效果一般般的算法吧 有更好的算法可以自己写或者优化 也可以去其他地方找一找
# -*- coding: utf-8 -*-
# Author:[email protected]
# Date :2020/4/2 23:07
# Tool :PyCharm
import cv2
import numpy as np
def show(name):
cv2.imshow('test', name)
cv2.waitKey(0)
cv2.destroyAllWindows()
def find_distance(front_img: str, bg_img: str):
front = cv2.imread(front_img)
front_gray = cv2.cvtColor(front, cv2.COLOR_BGR2GRAY)
cv2.imwrite(f'gray_{front_img}', front_gray)
# 滑块的长宽
width, height = front.shape[:2]
bg = cv2.imread(bg_img)
gray_bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
cv2.imwrite(f'gray_{bg_img}', gray_bg)
gray_bg = abs(255 - gray_bg)
cv2.imwrite(f'gray_sub_{bg_img}', gray_bg)
# 匹配图像算法, 第三个参数是精度控制, 以下是精度最高的
res = cv2.matchTemplate(gray_bg, front_gray, cv2.TM_CCOEFF_NORMED)
# 注意opencv中的横轴是y, 纵轴是x
x, y = np.unravel_index(np.argmax(res), res.shape)
print(x, y)
cv2.rectangle(bg, (y, x), (y + width, x + height), (0, 0, 255), 2)
cv2.imwrite('bg_rectangle.png', bg)
return y - 33
if __name__ == '__main__':
find_distance('./slide.jpg', './back.jpg')
识别效果如下图~
然后把代码块整理一下 合并起来就可以了。
整体思路: 进入目标站 --> 拿到验证码背景图+滑块图 --> 识别缺口距离 --> post必要参数进行验证码 --> 拿到valid即此站的yzmcode --> 验参通过