网络爬虫-破解京东滑块验证码

最近一直在研究滑块验证码这一块,接连破解了极验2.0,极验3.0以及淘宝滑块,当然了,只是使用selenium模拟过,拿到cookie后进行后续操作。

今天就讲讲京东这个滑块验证码,神坑,之前的轨迹方程全部不可用,需要自己慢慢调试,找到最佳参数,最大化模拟人为操作才能过,目前我过的几率为80%左右。

京东登陆页面

在这里插入图片描述

京东这个滑块验证码的最大的坑就在于 大量的模拟人为的轨迹方程都被封了 比如过极验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

最后献上破解京东滑块的运行图~

在这里插入图片描述

大家也可以优化一下这个算法,提高成功率!
欢迎留言,以及探讨验证码的算法问题。

猜你喜欢

转载自blog.csdn.net/qq_39802740/article/details/83584980
今日推荐