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

http://cszg.mca.gov.cn/biz/ma/csmh/a/csmhaDoSort.html


通常来说,处理这种验证,大概分成几步,首先找图片,然后使用超牛的图片处理opencv库进行模板匹配,最后读取匹配结果,完成。

首先找图片,使用模拟操作的话可能找三张图片,背景,小图,滑动条,使用代码逻辑的话找背景和小图就行了。

captcha.jpg

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。

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