破解滑動驗證碼


步驟一:點擊按鈕,彈出沒有缺口的圖片

#步驟二:獲取步驟一的圖片

#步驟三:點擊滑動按鈕,彈出帶缺口的圖片

#步驟四:獲取帶缺口的圖片

#步驟五:對比兩張圖片的所有RBG像素點,得到不一樣像素點的x值,即要移動的距離

#步驟六:模擬人的行為習慣(先勻加速拖動后勻減速拖動),把需要拖動的總距離分成一段一段小的軌跡

#步驟七:按照軌跡拖動,完全驗證

#步驟八:完成登錄
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import time


def get_snap(driver):

    driver.save_screenshot('full_snap.png')
    page_snap_obj = Image.open('full_snap.png')
    return page_snap_obj


def get_image(driver):

    img = driver.find_element_by_class_name('geetest_canvas_img')
    time.sleep(2)
    # 獲取圖片元素坐標
    location = img.location
    # 獲取圖片大小
    size = img.size

    left = location['x']
    top = location['y']
    right = left+size['width']
    bottom = top+size['height']

    # 獲取截屏圖片對象
    page_snap_obj = get_snap(driver)
    # crop處理裁剪后的圖片-->獲取裁剪后的圖片對象
    image_obj = page_snap_obj.crop((left, top, right, bottom))
    # image_obj.show()
    return image_obj


def get_distance(image1, image2):

    start = 57
    threhold = 60

    for i in range(start, image1.size[0]):
        for j in range(image1.size[1]):
            rgb1 = image1.load()[i, j]
            rgb2 = image2.load()[i, j]
            res1 = abs(rgb1[0]-rgb2[0])
            res2 = abs(rgb1[1]-rgb2[1])
            res3 = abs(rgb1[2]-rgb2[2])
            # print(res1,res2,res3)
            if not (res1 < threhold and res2 < threhold and res3 < threhold):
                return i-7
    return i-7


def get_tracks(distance):

    distance += 20 #先滑過一點,最后再反着滑動回來
    v = 0
    t = 0.2
    forward_tracks = []

    current = 0
    mid = distance*3/5
    while current < distance:
        if current < mid:
            a = 2
        else:
            a = -3

        s = v*t+0.5*a*(t**2)
        v = v+a*t
        current += s
        forward_tracks.append(round(s))

    #反着滑動到准確位置
    back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1] #總共等於-20

    return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}


def crack(driver):  # 破解滑動認證

    # 1、點擊按鈕,得到沒有缺口的圖片
    button = driver.find_element_by_class_name('geetest_radar_tip')
    button.click()

    # 2、獲取沒有缺口的圖片
    image1 = get_image(driver)

    # 3、點擊滑動按鈕,得到有缺口的圖片
    button = driver.find_element_by_class_name('geetest_slider_button')
    button.click()

    # 4、獲取有缺口的圖片
    image2 = get_image(driver)

    # 5、對比兩種圖片的像素點,找出位移
    distance = get_distance(image1, image2)

    # 6、模擬人的行為習慣,根據總位移得到行為軌跡
    tracks = get_tracks(distance)
    print(tracks)

    # 7、按照行動軌跡先正向滑動,后反滑動
    button = driver.find_element_by_class_name('geetest_slider_button')
    ActionChains(driver).click_and_hold(button).perform()

    # 正向滑動
    for track in tracks['forward_tracks']:
        ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()

    # 開始反向滑動
    time.sleep(0.5)
    for back_track in tracks['back_tracks']:
        ActionChains(driver).move_by_offset(xoffset=back_track, yoffset=0).perform()

    # 小范圍震盪一下,進一步迷惑極驗后台,這一步可以極大地提高成功率
    ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()
    ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()

    # 成功后,然后松開手
    time.sleep(0.5)
    ActionChains(driver).release().perform()


def login_cnblogs(username, password):

    driver = webdriver.Chrome(executable_path=r'E:\chenwei\learning\爬蟲\chromedriver_win32\chromedriver.exe')
    try:
        # 1、輸入賬號密碼回車
        driver.implicitly_wait(3)
        driver.get('https://passport.cnblogs.com/user/signin')

        input_username = driver.find_element_by_id('input1')
        input_pwd = driver.find_element_by_id('input2')
        signin = driver.find_element_by_id('signin')

        input_username.send_keys(username)
        input_pwd.send_keys(password)
        signin.click()
        button = driver.find_element_by_class_name('close')
        button.click()
        # 2、破解滑動認證
        crack(driver)

        time.sleep(10)  # 睡時間長一點,確定登錄成功
    finally:
        driver.close()

if __name__ == '__main__':
    login_cnblogs(username='xxxxx',password='xxxx')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM