查看某慈善网站时,想获取慈善组织名单,结果手动打开时首次也会触发滑动验证,懒人不想动手,找了点代码自动处理一下。

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愉快地访问吧。

代码如下:

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。

最后吐槽一下,首次手动访问也会直接跳出来滑动验证,这样的做法太缺乏人性关怀了吧?然后搞了个滑动验证也很容易就滑过去了,这样也不能防爬虫,那么这样操作的意义何在,只能伤及无辜,无端给上网不方便的人士造成障碍,最次也搞个操作频率检测如何?希望程序员多讲讲武德,当然客户是上帝,愿世界和平!