赞
踩
京东这个滑块验证码的最大的坑就在于 大量的模拟人为的轨迹方程都被封了 比如过极验2 极验3的轨迹,都无法在京东的滑块上面使用,并且原图也是无法找到的,只会在页面上给你有缺口的base64图片。
经过反复试验,发现京东的滑块验证码,共10张图片,现在就是下载京东图片的时候了,然后用PIL分割拼接,制作成我下面的这种图片。
前面的那一部分可以不用考虑,因为滑块的开始地方就是这个滑块的右方,比如这张图的大小是281 x 109,缺口图的大小是38 x 38,那么对比的地方则是 (281 - 38) * 109
对比的方式以及下载原图缺口图,找出距离的地方就不再累赘,做过滑块验证码的童鞋应该都知道,都是那一套方案反复使用。代码如下:
def is_pixel_equal(self, img1, img2, x, y): """ 判断两个像素是否相同 :param image1: 图片1 :param image2: 图片2 :param x: 位置x :param y: 位置y :return: 像素是否相同 """ # 取两个图片的像素点 pix1 = img1.load()[x, y] pix2 = img2.load()[x, y] threshold = 60 if (abs(pix1[0] - pix2[0] < threshold) and abs(pix1[1] - pix2[1] < threshold) and abs( pix1[2] - pix2[2] < threshold)): return True else: return False def get_gap(self, img1, img2): """ 获取缺口偏移量 :param img1: 不带缺口图片 :param img2: 带缺口图片 :return: """ left = 45 for i in range(left, img1.size[0]): for j in range(img1.size[1]): if not self.is_pixel_equal(img1, img2, i, j): left = i return left return left
def get_track7(self, distance): """ 根据偏移量和手动操作模拟计算移动轨迹 :param distance: 偏移量 :return: 移动轨迹 """ # 移动轨迹 tracks = [] # 当前位移 current = 0 # 减速阈值 mid = distance * 4 / 5 # 时间间隔 t = 0.2 # 初始速度 v = 0 while current < distance: if current < mid: a = random.uniform(2, 5) else: a = -(random.uniform(12.5, 13.5)) v0 = v v = v0 + a * t x = v0 * t + 1 / 2 * a * t * t current += x if 0.6 < current - distance < 1: x = x - 0.53 tracks.append(round(x, 2)) elif 1 < current - distance < 1.5: x = x - 1.4 tracks.append(round(x, 2)) elif 1.5 < current - distance < 3: x = x - 1.8 tracks.append(round(x, 2)) else: tracks.append(round(x, 2)) print(tracks, sum(tracks)) return tracks
OK
最后献上破解京东滑块的运行图~
大家也可以优化一下这个算法,提高成功率!
欢迎留言,以及探讨验证码的算法问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。