网络爬虫-某水利建设市场平台(滑块验证码破解)

刚过完端午节! 节后回归一波,发一波之前的库存~
直接进入主题 目标站 水利建设市场监管平台

触发验证码 --> 首页 --> 从业人员 --> 随便点个人名的链接,如图
在这里插入图片描述

可以看到就是很普通的滑块验证码,我们今天不用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 --> 验参通过
在这里插入图片描述


Ending

Github传送门

持续更新ing (欢迎各种star与fork)

联系方式: 442891187(QQ)

如有权益问题可以发私信联系我删除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章