剛過完端午節! 節後迴歸一波,發一波之前的庫存~
直接進入主題 目標站 水利建設市場監管平臺
觸發驗證碼 --> 首頁 --> 從業人員 --> 隨便點個人名的鏈接,如圖
可以看到就是很普通的滑塊驗證碼,我們今天不用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 --> 驗參通過