-
Python简单二十五行代码纯代码逻辑完成滑动验证
查看某慈善网站时,想获取慈善组织名单,结果手动打开时首次也会触发滑动验证,懒人不想动手,找了点代码自动处理一下。
http://cszg.mca.gov.cn/biz/ma/csmh/a/csmhaDoSort.html
通常来说,处理这种验证,大概分成几步,首先找图片,然后使用超牛的图片处理opencv库进行模板匹配,最后读取匹配结果,完成。
首先找图片,使用模拟操作的话可能找三张图片,背景,小图,滑动条,使用代码逻辑的话找背景和小图就行了。
F12在网络面板找一下很容易发现请求验证码的ajax请求是:https://cszg.mca.gov.cn/biz/ma/csmh/filter/getSlideCaptcha.html ,返回的json中包含了背景图和小图的base64编码,同时还有图片的大小,小图Y轴位置等信息,不重要,用不上。
图片找到了,就导入opencv进行模板匹配,匹配前进行图片灰度处理一下,提高识别率。
最后读取opencv模板匹配的值,进行验证请求,返回{"toPath":"","status":"success"}就表示成功了,接下来就使用之前的cookie愉快地访问吧。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
def sliderCrack(cookies): url = "https://cszg.mca.gov.cn/biz/ma/csmh/filter/getSlideCaptcha.html?_=" + str (time.time()) r = requests.get(url, cookies = cookies) cookies = r.cookies captcha = json.loads(r.text) cutImage = base64.b64decode(captcha[ 'c' ][ 'cutImage' ], '-_' ) oriImage = base64.b64decode(captcha[ 'c' ][ 'oriImage' ], '-_' ) img_array = np.fromstring(cutImage, np.uint8) cutImage_raw = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR) img_array = np.fromstring(oriImage, np.uint8) oriImage_raw = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR) cutImage_gray = cv2.cvtColor(cutImage_raw,cv2.COLOR_BGR2GRAY) oriImage_gray = cv2.cvtColor(oriImage_raw,cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(oriImage_gray,cutImage_gray,cv2.TM_CCOEFF_NORMED) value = cv2.minMaxLoc(res) value = value[ 3 ][ 0 ] url = "https://cszg.mca.gov.cn/biz/ma/csmh/filter/slideCaptchaCheck.html?slidevalue=" + str (base64.b64encode( str (value).encode( 'ascii' )),encoding = 'utf8' ) + "&_=" + str (time.time()) r = requests.get(url, cookies = cookies) cookies = r.cookies print (r.text) |
代码很简单,没什么好说的,就和前方讲的大概操作流程一样:找图片,opencv模板匹配cv2.matchTemplate,最后输出结果cv2.minMaxLoc。
最后吐槽一下,首次手动访问也会直接跳出来滑动验证,这样的做法太缺乏人性关怀了吧?然后搞了个滑动验证也很容易就滑过去了,这样也不能防爬虫,那么这样操作的意义何在,只能伤及无辜,无端给上网不方便的人士造成障碍,最次也搞个操作频率检测如何?希望程序员多讲讲武德,当然客户是上帝,愿世界和平!
版权属于:月萌API www.moonapi.com,转载请注明出处
本文链接:https://www.moonapi.com/news/45.html