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()