網絡爬蟲-破解京東滑塊驗證碼

最近一直在研究滑塊驗證碼這一塊,接連破解了極驗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

最後獻上破解京東滑塊的運行圖~

在這裏插入圖片描述

大家也可以優化一下這個算法,提高成功率!
歡迎留言,以及探討驗證碼的算法問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章