【python+selenium】極驗(yàn)滑動(dòng)驗(yàn)證碼的實(shí)現(xiàn)

效果gif

前言

在上次做完圖形驗(yàn)證碼后工窍,發(fā)現(xiàn)識別率不盡人意粉私,可以說是很不滿意汰蓉,稍微有點(diǎn)更多的干擾,打印出來的字符一塌糊涂蹋宦!這次轉(zhuǎn)手對極驗(yàn)的滑動(dòng)驗(yàn)證碼進(jìn)行識別。咒锻。冷冗。

  • 目前市面上越來越多的網(wǎng)站的注冊登錄用滑動(dòng)驗(yàn)證碼進(jìn)行驗(yàn)證,與人互動(dòng)的形式來判定你是不是人類操作惑艇,所以說蒿辙,我們要進(jìn)行破解,就是模仿人體操作進(jìn)行識別與通過驗(yàn)證滨巴!
  • 還有一些注意問題后面說思灌,通常也是識別不成功的關(guān)鍵!
  • 識別率估摸著有90%以上了恭取!

正序

  • 要用到的:selenium泰偿、PIL、io秽荤、Chrome瀏覽器甜奄、還有驅(qū)動(dòng)瀏覽器的插件chromediver
流程邏輯
  1. 打開網(wǎng)頁柠横,進(jìn)入驗(yàn)證頁面
  2. 點(diǎn)擊驗(yàn)證按鈕,獲取完整圖片與帶缺口的圖片進(jìn)行比對(現(xiàn)在的極驗(yàn)驗(yàn)證碼已經(jīng)不能直接獲取完整圖片了课兄。牍氛。。)
  3. 計(jì)算偏移量
  4. selenium控制滑塊填補(bǔ)空缺烟阐,驗(yàn)證完成搬俊!

  • 封裝類,多個(gè)方法實(shí)現(xiàn)功能
  • 初始化值蜒茄,打開網(wǎng)頁唉擂,程序完成自動(dòng)結(jié)束!
class CrackGeetest():
    def __init__(self):
        self.url = 'https://www.geetest.com/type/'
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser, 20)

    # 程序完成檀葛,自動(dòng)結(jié)束程序
    def __del__(self):
        self.browser.close()

    def open(self):
        """
        打開網(wǎng)頁
        :return: None
        """
        self.browser.get(self.url)
  • 進(jìn)入驗(yàn)證頁面玩祟,獲取驗(yàn)證按鈕與驗(yàn)證碼的位置
    def get_geetest_button(self):
        """
        獲取初始驗(yàn)證按鈕
        :return:
        """
        # 驗(yàn)證按鈕
        button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
        return button

    def get_position(self):
        """
        獲取驗(yàn)證碼位置
        :return: 驗(yàn)證碼位置元組
        """
        img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
        print('img')
        location = img.location
        size = img.size
        top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
            'width']
        return (top, bottom, left, right)
  • 這個(gè)時(shí)候,就可以看到帶缺口圖片驗(yàn)證的界面
  • 之前的極驗(yàn)驗(yàn)證碼是會(huì)出現(xiàn)完整圖片∮炝現(xiàn)在直接就顯示了帶缺口圖片的驗(yàn)證空扎,通過搜羅網(wǎng)上的一些解決方法,發(fā)現(xiàn)有一個(gè)study隱藏屬性:

    如果把這個(gè)屬性刪除就會(huì)出現(xiàn)完整圖片:

    通過對CSS的更改润讥,所以這樣我們就能獲取完整圖片
  • 同時(shí)獲取帶缺口的圖片加入帶缺口圖片進(jìn)行對比转锈,獲取偏移量!(PIL)
    def get_screenshot(self):
        """
        獲取網(wǎng)頁截圖
        :return: 截圖對象
        """
        screenshot = self.browser.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot
    def get_geetest_image(self, name='captcha.png'):
        """
        獲取驗(yàn)證碼圖片
        :return: 圖片對象
        """
        top, bottom, left, right = self.get_position()
        print('驗(yàn)證碼位置', top, bottom, left, right)
        screenshot = self.get_screenshot()
        captcha = screenshot.crop((left, top, right, bottom))
        captcha.save(name)
        return captcha
    def delete_style(self):
        '''
        執(zhí)行js腳本楚殿,獲取無滑塊圖
        :return None
        '''
        js = 'document.querySelectorAll("canvas")[2].style=""'
        self.browser.execute_script(js)
    def get_gap(self, image1, image2):
        """
        獲取缺口偏移量
        :param image1: 帶缺口圖片
        :param image2: 不帶缺口圖片
        :return:
        """
        left = 60
        print(image1.size[0])
        print(image1.size[1])
        for i in range(left, image1.size[0]):
            for j in range(image1.size[1]):
                if not self.is_pixel_equal(image1, image2, i, j):
                    left = i
                    return left
        return left

    def is_pixel_equal(self, image1, image2, x, y):
        """
        判斷兩個(gè)像素是否相同
        :param image1: 圖片1
        :param image2: 圖片2
        :param x: 位置x
        :param y: 位置y
        :return: 像素是否相同
        """
        # 取兩個(gè)圖片的像素點(diǎn)
        pixel1 = image1.load()[x, y]
        pixel2 = image2.load()[x, y]
        threshold = 60
        if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
                pixel1[2] - pixel2[2]) < threshold:
            return True
        else:
            return False
  • 然后我們根據(jù)偏移量獲取移動(dòng)軌跡撮慨,控制滑塊,填補(bǔ)缺口脆粥!
  • 由于驗(yàn)證碼的特殊性砌溺,我們是不能控制滑塊勻速滑過去的(人類是做不到的),極驗(yàn)在此也是做了驗(yàn)證的冠绢!所以我們按照人操作抚吠,先加速后減速做個(gè)優(yōu)化!
    def get_track(self, distance):
        """
        根據(jù)偏移量獲取移動(dòng)軌跡
        :param distance: 偏移量
        :return: 移動(dòng)軌跡
        """
        # 移動(dòng)軌跡
        track = []
        # 當(dāng)前位移
        current = 0
        # 減速閾值
        mid = distance * 4 / 5
        # 計(jì)算間隔
        t = 0.2
        # 初速度
        v = 0
        while current < distance:
            if current < mid:
                # 加速度為正2
                a = 2
            else:
                # 加速度為負(fù)3
                a = -1
            # 初速度v0
            v0 = v
            # 當(dāng)前速度v = v0 + at
            v = v0 + a * t
            # 移動(dòng)距離x = v0t + 1/2 * a * t^2
            move = v0 * t + 1 / 2 * a * t * t
            # 當(dāng)前位移
            current += move
            # 加入軌跡
            track.append(round(move))
        return track

    def move_to_gap(self, slider, track):
        """
        拖動(dòng)滑塊到缺口處
        :param slider: 滑塊
        :param track: 軌跡
        :return:
        """
        ActionChains(self.browser).click_and_hold(slider).perform()
        for x in track:
            ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
        time.sleep(0.5)
        ActionChains(self.browser).release().perform()
  • 到這里弟胀,我們已經(jīng)實(shí)現(xiàn)了整個(gè)驗(yàn)證過程的邏輯操作!
  • 完整代碼:G碼云Github

注意問題

  • 不管是電腦設(shè)置還是瀏覽器設(shè)置的縮放都要改成100%?Α!7趸А萧朝!


    設(shè)置

    瀏覽器

    否則就會(huì)影響圖片的截取與偏移量的錯(cuò)誤計(jì)算,總的來說就是識別會(huì)失斚目蕖<旒怼!!(話說我就因?yàn)橄到y(tǒng)設(shè)置沒改何址,栽在這有段時(shí)間了里逆。。用爪。)

  • 其他的問題原押,無非就是插件版本不對、編寫代碼等問題偎血。

嗶哩嗶哩登錄:

嗶哩嗶哩登錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诸衔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颇玷,更是在濱河造成了極大的恐慌笨农,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帖渠,死亡現(xiàn)場離奇詭異谒亦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)空郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門诊霹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渣淳,你說我怎么就攤上這事“槁幔” “怎么了入愧?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗤谚。 經(jīng)常有香客問我棺蛛,道長,這世上最難降的妖魔是什么巩步? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任旁赊,我火速辦了婚禮,結(jié)果婚禮上椅野,老公的妹妹穿的比我還像新娘终畅。我一直安慰自己,他們只是感情好竟闪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布离福。 她就那樣靜靜地躺著,像睡著了一般炼蛤。 火紅的嫁衣襯著肌膚如雪妖爷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天理朋,我揣著相機(jī)與錄音絮识,去河邊找鬼绿聘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛次舌,可吹牛的內(nèi)容都是我干的熄攘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼垃它,長吁一口氣:“原來是場噩夢啊……” “哼鲜屏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起国拇,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤洛史,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酱吝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也殖,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年务热,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忆嗜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崎岂,死狀恐怖捆毫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冲甘,我是刑警寧澤绩卤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站江醇,受9級特大地震影響濒憋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陶夜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一凛驮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧条辟,春花似錦黔夭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厂僧,卻和暖如春扣草,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工辰妙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰祸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓密浑,卻偏偏與公主長得像蛙婴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子尔破,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 驗(yàn)證碼識別成為了對抗反爬蟲的必修課之一街图,看了崔慶才著的《python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》后受益匪淺,本專題將...
    興華的mark閱讀 4,310評論 14 18
  • 今天學(xué)習(xí)了《高效閱讀》第3課絮姆,來回看了兩遍,因?yàn)樾畔⒘枯^大秩霍,所以學(xué)完一遍后又重新看了一遍篙悯,然后朋友圈三個(gè)知識點(diǎn)總結(jié)...
    紙鳶Crystal閱讀 270評論 1 1
  • 2019年三月做一次早起的刻意練習(xí):做早起時(shí)間記錄。 《奇特的一生》里面的柳比歇夫用時(shí)間記錄的方式把自己的一生記錄...
    浴火鳳凰死而復(fù)燃閱讀 204評論 0 0
  • 時(shí)空的變幻铃绒,歷史的更迭鸽照,都將使一部分人名留史冊,并將在千百年后颠悬,當(dāng)人們再次提及的時(shí)候移宅,總會(huì)令人感動(dòng),令人震顫椿疗,在心...
    悄然Edward閱讀 358評論 0 6