Learn python the seventh day
生活随笔
收集整理的這篇文章主要介紹了
Learn python the seventh day
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
# 破解極驗滑動驗證 '''
破解極驗滑動驗證
破解極驗滑動驗證
博客園登錄url:
https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
代碼邏輯:
1、輸入用戶名與密碼,并點擊登錄
2、彈出滑動驗證,獲取有缺口與完整的圖片
3、通過像素點進行比對,獲取滑動位移距離
4、模擬人的行為軌跡
5、開始滑動
'''
1 from selenium import webdriver # 用來驅動瀏覽器的 2 from selenium.webdriver import ActionChains # 破解滑動驗證碼的時候用的 可以拖動圖片 3 import time 4 from PIL import Image # pip3 install pillow 5 import random 6 7 # 截圖圖片函數 8 def cut_image(driver): 9 # 獲取整個頁面圖片,圖片名字為'snap.png' 10 driver.save_screenshot('snap.png') 11 12 # 獲取滑動小畫圖 13 image = driver.find_element_by_class_name('geetest_canvas_img') 14 print(image.location) 15 print(image.size) 16 17 # 獲取小圖片的左上右下的位置 18 left = image.location['x'] 19 top = image.location['y'] 20 right = left + image.size['width'] 21 buttom = top + image.size['height'] 22 print(left, top, right, buttom) 23 24 # 調用open方法打開全屏圖片并賦值給image_obj對象 25 image_obj = Image.open('snap.png') 26 27 # 通過image_obj對象對小圖片進行截取 28 # box: The crop rectangle, as a (left, upper, right, lower)-tuple. 29 img = image_obj.crop((left, top, right, buttom)) 30 # 打開截取后的小圖片 31 img.show() 32 return img 33 34 # 獲取完整圖片 35 def get_image1(driver): 36 time.sleep(2) 37 38 # 修改document文檔樹,把完整圖片的display屬性修改為block 39 js_code = ''' 40 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block"; 41 ''' 42 43 # 執行js代碼 44 driver.execute_script(js_code) 45 46 # 截取圖片 47 image = cut_image(driver) 48 49 return image 50 51 # 獲取有缺口圖片 52 def get_image2(driver): 53 time.sleep(2) 54 55 # 修改document文檔樹,把完整圖片的display屬性修改為block 56 js_code = ''' 57 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none"; 58 ''' 59 60 # 執行js代碼 61 driver.execute_script(js_code) 62 63 # 截取圖片 64 image = cut_image(driver) 65 66 return image 67 68 def main(): 69 driver = webdriver.Chrome(r'D:\chromedriver_win32\chromedriver.exe') 70 driver.implicitly_wait(10) 71 driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') 72 73 # 1、輸入用戶名與密碼,并點擊登錄 74 user_input = driver.find_element_by_id('LoginName') 75 user_input.send_keys('_tank_') 76 time.sleep(0.2) 77 78 pwd_input = driver.find_element_by_id('Password') 79 pwd_input.send_keys('k46709394.') 80 time.sleep(2) 81 82 login_submit = driver.find_element_by_id('submitBtn') 83 login_submit.click() 84 85 # 2、獲取完整的圖片 86 image1 = get_image1(driver) 87 88 # 3、獲取有缺口圖片 89 image2 = get_image2(driver) 90 91 time.sleep(100) 92 93 if __name__ == '__main__': 94 main() View Code
?
1 from selenium import webdriver # 用來驅動瀏覽器的 2 from selenium.webdriver import ActionChains # 破解滑動驗證碼的時候用的 可以拖動圖片 3 import time 4 from PIL import Image # pip3 install pillow 5 import random 6 7 8 # 截圖圖片函數 9 def cut_image(driver): 10 # 獲取整個頁面圖片,圖片名字為'snap.png' 11 driver.save_screenshot('snap.png') 12 13 # 獲取滑動小畫圖 14 image = driver.find_element_by_class_name('geetest_canvas_img') 15 print(image.location) 16 print(image.size) 17 18 # 獲取小圖片的左上右下的位置 19 left = image.location['x'] 20 top = image.location['y'] 21 right = left + image.size['width'] 22 buttom = top + image.size['height'] 23 print(left, top, right, buttom) 24 25 # 調用open方法打開全屏圖片并賦值給image_obj對象 26 image_obj = Image.open('snap.png') 27 28 # 通過image_obj對象對小圖片進行截取 29 # box: The crop rectangle, as a (left, upper, right, lower)-tuple. 30 img = image_obj.crop((left, top, right, buttom)) 31 # 打開截取后的小圖片 32 # img.show() 33 return img 34 35 36 # 獲取完整圖片 37 def get_image1(driver): 38 time.sleep(2) 39 40 # 修改document文檔樹,把完整圖片的display屬性修改為block 41 js_code = ''' 42 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block"; 43 ''' 44 45 # 執行js代碼 46 driver.execute_script(js_code) 47 48 # 截取圖片 49 image = cut_image(driver) 50 51 return image 52 53 54 # 獲取有缺口圖片 55 def get_image2(driver): 56 time.sleep(2) 57 58 # 修改document文檔樹,把完整圖片的display屬性修改為block 59 js_code = ''' 60 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none"; 61 ''' 62 63 # 執行js代碼 64 driver.execute_script(js_code) 65 66 # 截取圖片 67 image = cut_image(driver) 68 69 return image 70 71 72 # 獲取滑塊滑動距離 73 def get_distance(image1, image2): 74 # 小滑塊右側位置 75 start = 60 76 77 # 像素差 78 num = 60 79 print(image1.size) 80 for x in range(start, image1.size[0]): 81 for y in range(image1.size[1]): 82 83 # 獲取image1完整圖片每一個坐標的像素點 84 rgb1 = image1.load()[x, y] 85 86 # 獲取image2缺口圖片每一個坐標的像素點 87 rgb2 = image2.load()[x, y] 88 # (60, 86, 40) (60, 86, 40) rgb 89 print(rgb1, rgb2) 90 91 # abs獲取絕對值, 像素點比較的值 92 r = abs(rgb1[0] - rgb2[0]) 93 g = abs(rgb1[1] - rgb2[1]) 94 b = abs(rgb1[2] - rgb2[2]) 95 96 # 如果條件成立,則找到缺口位置 97 if not (r < num and g < num and b < num): 98 # 有誤差 - 7像素 99 return x - 7 100 101 102 # 模擬人的滑動軌跡 103 def get_strck_move(distance): 104 distance += 20 105 106 ''' 107 滑動行為軌跡 108 加速公式: 109 v = v0 + a * t 110 111 路程公式: 112 s = v0 * t + 0.5 * a * (t ** 2) 113 ''' 114 115 # 初速度 116 v0 = 0 117 118 # 時間 119 t = 0.2 120 121 # 位置 122 s = 0 123 124 # 滑動軌跡列表 向前滑動列表 125 move_list = [] 126 127 # 中間值,作為加減速度的位置 128 mid = distance / 5 * 3 129 130 # 加減速度列表 131 v_list = [1, 2, 3, 4] 132 133 # 循環位移 134 while s < distance: 135 if s < mid: 136 # 隨機獲取一個加速度 137 a = v_list[random.randint(0, len(v_list) - 1)] 138 139 else: 140 # 隨機獲取一個減速度 141 a = -v_list[random.randint(0, len(v_list) - 1)] 142 143 ''' 144 勻加速\減速運行 145 v = v0 + a * t 146 147 位移: 148 s = v * t + 0.5 * a * (t**2) 149 ''' 150 # 獲取初始速度 151 v = v0 152 153 # 路程公式: 154 s1 = v * t + 0.5 * a * (t ** 2) 155 s1 = round(s1) # 取整 156 157 # 加速公式: 158 # v = v0 + a * t 159 m_v = v + a * t 160 161 # 把當前加/減速度賦值給初始速度,以便下一次計算 162 v0 = m_v 163 164 # 把位移添加到滑動列表中 165 move_list.append(s1) 166 167 # 修改滑動初始距離 168 s += s1 169 170 # 后退列表, 自定義后退滑動軌跡,必須是負值 171 back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1] 172 173 return {'move_list': move_list, 'back_list': back_list} 174 175 176 def main(): 177 driver = webdriver.Chrome(r'D:\chromedriver_win32\chromedriver.exe') 178 driver.implicitly_wait(10) 179 driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') 180 181 # 1、輸入用戶名與密碼,并點擊登錄 182 user_input = driver.find_element_by_id('LoginName') 183 user_input.send_keys('_tank_') 184 time.sleep(0.2) 185 186 pwd_input = driver.find_element_by_id('Password') 187 pwd_input.send_keys('k46709394.') 188 time.sleep(2) 189 190 login_submit = driver.find_element_by_id('submitBtn') 191 login_submit.click() 192 193 # 2、獲取完整的圖片 194 image1 = get_image1(driver) 195 196 # 3、獲取有缺口圖片 197 image2 = get_image2(driver) 198 199 # 4、比對兩張圖片,獲取滑動距離 200 distance = get_distance(image1, image2) 201 print(distance) 202 203 # 5、模擬人的滑動軌跡 204 move_dict = get_strck_move(distance) 205 # 獲取前進滑動軌跡 206 move_list = move_dict['move_list'] 207 # 獲取后退滑動軌跡 208 back_list = move_dict['back_list'] 209 210 # 6、開始滑動 211 move_tag = driver.find_element_by_class_name('geetest_slider_button') 212 # 點擊摁住滑動按鈕 213 ActionChains(driver).click_and_hold(move_tag).perform() 214 215 # 向前滑動 216 for move in move_list: 217 ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform() 218 time.sleep(0.1) 219 220 time.sleep(0.1) 221 222 # 向后滑動 223 for back in back_list: 224 ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform() 225 time.sleep(0.1) 226 227 # 制作微妙晃動 228 ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform() 229 ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() 230 231 time.sleep(0.1) 232 233 # 釋放滑動按鈕 234 ActionChains(driver).release().perform() 235 236 time.sleep(100) 237 238 239 if __name__ == '__main__': 240 main() View Code?
----2019.6.19
?轉載于:https://www.cnblogs.com/feiyufei/p/11067198.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Learn python the seventh day的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新款iPad,抱回家!
- 下一篇: 几幅图,拿下 HTTPS