python之破解極限驗證登錄


1.注意將電腦的顯示比例調至100%

''''''
'''
破解極驗滑動驗證
破解極驗滑動驗證
博客園登錄url:
    https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F

代碼邏輯:
1、輸入用戶名與密碼,並點擊登錄
2、彈出滑動驗證,獲取有缺口與完整的圖片
3、通過像素點進行比對,獲取滑動位移距離
4、模擬人的行為軌跡
5、開始滑動
    
'''
from selenium import webdriver  # 用來驅動瀏覽器的
from selenium.webdriver import ActionChains  # 破解滑動驗證碼的時候用的 可以拖動圖片
import time
from PIL import Image  # pip3 install pillow
import random

# 截圖圖片函數
def cut_image(driver):
    # 獲取整個頁面圖片,圖片名字為'snap.png'
    driver.save_screenshot('snap.png')

    # 獲取滑動小畫圖
    image = driver.find_element_by_class_name('geetest_canvas_img')
    print(image.location)
    print(image.size)

    # 獲取小圖片的左上右下的位置
    left = image.location['x']
    top = image.location['y']
    right = left + image.size['width']
    buttom = top + image.size['height']
    print(left, top, right, buttom)

    # 調用open方法打開全屏圖片並賦值給image_obj對象
    image_obj = Image.open('snap.png')

    # 通過image_obj對象對小圖片進行截取
    # box: The crop rectangle, as a (left, upper, right, lower)-tuple.
    img = image_obj.crop((left, top, right, buttom))
    # 打開截取后的小圖片
    # img.show()
    return img

# 獲取完整圖片
def get_image1(driver):
    time.sleep(2)

    # 修改document文檔樹,把完整圖片的display屬性修改為block
    js_code = '''
        var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block";
    '''

    # 執行js代碼
    driver.execute_script(js_code)

    # 截取圖片
    image = cut_image(driver)

    return image

# 獲取有缺口圖片
def get_image2(driver):
    time.sleep(2)

    # 修改document文檔樹,把完整圖片的display屬性修改為block
    js_code = '''
        var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
    '''

    # 執行js代碼
    driver.execute_script(js_code)

    # 截取圖片
    image = cut_image(driver)

    return image

# 獲取滑塊滑動距離
def get_distance(image1, image2):
    # 小滑塊右側位置
    start = 60

    # 像素差
    num = 60
    print(image1.size)
    for x in range(start, image1.size[0]):
        for y in range(image1.size[1]):

            # 獲取image1完整圖片每一個坐標的像素點
            rgb1 = image1.load()[x, y]

            # 獲取image2缺口圖片每一個坐標的像素點
            rgb2 = image2.load()[x, y]
            # (60, 86, 40) (60, 86, 40) rgb
            print(rgb1, rgb2)

            # abs獲取絕對值, 像素點比較的值
            r = abs(rgb1[0] - rgb2[0])
            g = abs(rgb1[1] - rgb2[1])
            b = abs(rgb1[2] - rgb2[2])

            # 如果條件成立,則找到缺口位置
            if not (r < num and g < num and b < num):
                # 有誤差 - 7像素
                return x - 7

# 模擬人的滑動軌跡
def get_strck_move(distance):
    distance += 20

    '''
    滑動行為軌跡
    加速公式:
        v = v0 + a * t
        
    路程公式:
        s = v0 * t + 0.5 * a * (t ** 2)
    '''

    # 初速度
    v0 = 0

    # 時間
    t = 0.2

    # 位置
    s = 0

    # 滑動軌跡列表 向前滑動列表
    move_list = []

    # 中間值,作為加減速度的位置
    mid = distance / 5 * 3

    # 加減速度列表
    v_list = [1, 2, 3, 4]

    # 循環位移
    while s < distance:
        if s < mid:
            # 隨機獲取一個加速度
            a = v_list[random.randint(0, len(v_list) - 1)]

        else:
            # 隨機獲取一個減速度
            a = -v_list[random.randint(0, len(v_list) - 1)]

        '''
        勻加速\減速運行
        v = v0 + a * t

        位移:
        s = v * t + 0.5 * a * (t**2)
        '''
        # 獲取初始速度
        v = v0

        # 路程公式:
        s1 = v * t + 0.5 * a * (t ** 2)
        s1 = round(s1)  # 取整

        # 加速公式:
        # v = v0 + a * t
        m_v = v + a * t

        # 把當前加/減速度賦值給初始速度,以便下一次計算
        v0 = m_v

        # 把位移添加到滑動列表中
        move_list.append(s1)

        # 修改滑動初始距離
        s += s1

    # 后退列表, 自定義后退滑動軌跡,必須是負值
    back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1]

    return {'move_list': move_list, 'back_list': back_list}

def main():
    driver = webdriver.Chrome(r'F:\python學習\Scripts\chromedriver')
    driver.implicitly_wait(10)
    try:
        driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F')

        # 1、輸入用戶名與密碼,並點擊登錄
        user_input = driver.find_element_by_id('LoginName')
        user_input.send_keys('你的博客園賬號')
        time.sleep(0.2)

        pwd_input = driver.find_element_by_id('Password')
        pwd_input.send_keys('你的博客園密碼')
        time.sleep(2)

        login_submit = driver.find_element_by_id('submitBtn')
        login_submit.click()

        # 2、獲取完整的圖片
        image1 = get_image1(driver)

        # 3、獲取有缺口圖片
        image2 = get_image2(driver)

        # 4、比對兩張圖片,獲取滑動距離
        distance = get_distance(image1, image2)
        print(distance)

        # 5、模擬人的滑動軌跡
        move_dict = get_strck_move(distance)
        # 獲取前進滑動軌跡
        move_list = move_dict['move_list']
        # 獲取后退滑動軌跡
        back_list = move_dict['back_list']

        # 6、開始滑動
        move_tag = driver.find_element_by_class_name('geetest_slider_button')
        # 點擊摁住滑動按鈕
        ActionChains(driver).click_and_hold(move_tag).perform()

        # 向前滑動
        for move in move_list:
            ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform()
            time.sleep(0.1)

        time.sleep(0.1)

        # 向后滑動
        for back in back_list:
            ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform()
            time.sleep(0.1)

        # 制作微妙晃動
        ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
        ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()

        time.sleep(0.1)

        # 釋放滑動按鈕
        ActionChains(driver).release().perform()

        time.sleep(100)

    finally:
        driver.close()

if __name__ == '__main__':
    main()

 


免責聲明!

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



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