破解滑块验证码(geetest极验)
破解滑块验证码(geetest极验) 最近写爬虫遇到极验(geetest)的滑块验证码,首先想到的是用Selenium模拟人拖动滑块,那么问题来了其实主要解决下面两个问题 拖动的距离是多少 怎么模拟出像人一样再滑动 滑动距离 先来解决第一个问题,我们怎么计算拖动距离,打开chrome的审查元素查看需要拖动的图片 <div class="geetest_canvas_img geetest_absolute" style="display: block;"> <div class="geetest_slicebg geetest_absolute"> <canvas class="geetest_canvas_bg geetest_absolute" height="160" width="260"></canvas> <canvas class="geetest_canvas_slice geetest_absolute" width="260" height="160"></canvas> </div> <canvas class="geetest_canvas_fullbg geetest_fade geetest_absolute" height="160" width="260" style="display: none;"></canvas> </div> 发现有三个canvas 对应三张图片大小都是 260* 160 ,我们使用selenium执行 js 转成 base64 后再转成图片都保存下来看一下,第一张 geetest_canvas_bg 是有缺口的图片 im_bg_b64 = driver.execute_script( 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");') # base64 encoded image im_bg_b64 = im_bg_b64.split(',')[-1] im_bg_bytes = base64.b64decode(im_bg_b64) with open('./temp_bg.png', 'wb') as f: f.write(im_bg_bytes) 然后第二张 geetest_canvas_slice 根据上面相同的方法保存到本地是这样的,就是一个滑块 第三张 geetest_canvas_fullbg 猜名称也能猜到是图片的全景 有上面三张图片,怎么计算滑动的距离呢,发现只要找到第一张缺口的位置坐标 x1 和第二张滑块的坐标 x2 那么 x1 - x2 就是我们要的距离,主要是找到 x1 的位置可以通过对比第一张和第三张得到,具体的方法是对比两张图像素点不同时即为 x1 的位置。因为 x2 的位置一直在左边差不多固定的位置假设离最左边为 10 个像素所以我们不需要计算 x2,以下是实现两张图片确定 x1 的代码,图片处理使用的是pillow库 ...