geetest拼圖破解:python
一、考慮到每一個網站的拼圖數量不多,能夠先把他們下下來,後面在經過RGB來判斷差別,來找出須要移動到的位置web
二、經過python + selenium來控制頁面的操控頁面的元素,是的拼圖能夠被移動windows
三、這裏先直接貼上一段代碼:app
鳴謝:https://blog.csdn.net/qq_38685503/article/details/81187105dom
1 from selenium import webdriver 2 from selenium.webdriver.common.action_chains import ActionChains 3 from selenium.webdriver.support.ui import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 import time, random, os 6 from PIL import Image 7 8 base_url = "http://www.gsxt.gov.cn" 9 img_paths = "E:/DateSet/geetest/gsxt" 10 img_path = 'E:\DateSet\geetest\wait\quekou.png' 11 img_check_now = 'E:\DateSet\geetest\enter\check_now.png' 12 img_check = 'E:\DateSet\geetest\enter\check.png' 13 img_result = 'E:/DateSet/geetest/result/result.png' 14 js = "var q=document.documentElement.scrollTop=180" 15 16 # 訪問國家企業信用信息公示系統 17 driver = webdriver.Chrome() 18 # driver.implicitly_wait(40) 19 driver.get(base_url) 20 driver.maximize_window() 21 22 23 # 判斷元素是否存在,經過ID查詢 24 def is_exist_by_id(element): 25 try: 26 driver.find_element_by_id(element) 27 return True 28 except: 29 return False 30 31 32 # 判斷元素是否存在,經過Class查詢 33 def is_exist_by_class(element): 34 try: 35 driver.find_element_by_class_name(element) 36 return True 37 except: 38 return False 39 40 41 # 判斷元素是否存在,經過xpath查詢 42 def is_exist_by_xpath(element): 43 try: 44 driver.find_element_by_xpath(element) 45 return True 46 except: 47 return False 48 49 50 while True: 51 if is_exist_by_id("keyword") and is_exist_by_id("keyword"): 52 break 53 time.sleep(0.5) 54 55 driver.find_element_by_id("keyword").clear() 56 driver.find_element_by_id("keyword").send_keys("騰訊") 57 time.sleep(1) 58 driver.find_element_by_id("btn_query").click() 59 time.sleep(1) 60 61 # 獲得滑動小塊在最右邊的截圖 62 while True: 63 if is_exist_by_class("geetest_slider_button"): 64 break 65 time.sleep(0.5) 66 slide_block = driver.find_element_by_class_name('geetest_slider_button') 67 ActionChains(driver).click_and_hold(slide_block).perform() 68 ActionChains(driver).move_by_offset(xoffset=200, yoffset=0).perform() 69 driver.save_screenshot(img_path) 70 71 72 # 獲得匹配的原圖 73 def match_source(image): 74 img_list = [] 75 file_dir = os.listdir(img_paths) 76 for file_name in file_dir: 77 file_path_temp = img_paths + '\\' + file_name 78 img_list.append(Image.open(file_path_temp)) 79 # pingtu 557 * 176 80 pixel_image = image.getpixel((557, 176)) 81 for img in img_list: 82 # source 557 * 290 83 pixel_img = img.getpixel((557, 290)) 84 if abs(pixel_image[0] - pixel_img[0]) < 5: 85 return img 86 return image 87 88 89 # 判斷是不是類似的位置 90 def is_similar(source_img, quekou_img, x, y): 91 pixel1 = source_img.getpixel((x, y + 114)) 92 pixel2 = quekou_img.getpixel((x, y)) 93 if abs(pixel1[0] - pixel2[0]) >= 70 and abs(pixel1[1] - pixel2[1]) >= 70 and abs(pixel1[2] - pixel2[2]) >= 70: 94 return False 95 return True 96 97 98 # 計算滑塊位移距離 99 def get_diff_location(source_img, quekou_img): 100 for i in range(536, 803): 101 for j in range(164, 333): 102 if not is_similar(source_img, quekou_img, i, j): 103 return i 104 return -1 105 106 107 #滑塊移動軌跡 108 def get_track(distance): 109 track = [distance] 110 # current = 0 111 # mid = distance * 7 / 8 112 # t = random.randint(2, 3) / 10 113 # v = 0 114 # while current < distance: 115 # if current < mid: 116 # a = 2 117 # else: 118 # a = -3 119 # v0 = v 120 # v = v0 + a * t 121 # move = v0 * t + 1 / 2 * a * t * t 122 # current += move 123 # track.append(round(move)) 124 return track 125 126 127 ActionChains(driver).release(slide_block).perform() 128 quekou_img = Image.open(img_path) 129 source_img = match_source(quekou_img) 130 131 # h_dis distance to left 132 h_dis = get_diff_location(source_img, quekou_img) 133 134 135 # 模擬人工移動 136 def imitate(distance): 137 track_list = get_track(distance) 138 time.sleep(2) 139 ActionChains(driver).click_and_hold(slide_block).perform() 140 time.sleep(0.02) 141 for track in track_list: 142 ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform() 143 imitate = ActionChains(driver).move_by_offset(xoffset=-1, yoffset=0) 144 time.sleep(0.015) 145 imitate.perform() 146 time.sleep(random.randint(5, 6)/10) 147 imitate.perform() 148 time.sleep(0.04) 149 imitate.perform() 150 time.sleep(0.012) 151 ActionChains(driver).move_by_offset(xoffset=1, yoffset=0).perform() 152 ActionChains(driver).pause(random.randint(1, 2)/10).release(slide_block).perform() 153 time.sleep(2) 154 155 156 imitate(h_dis - 552) 157 while True: 158 if is_exist_by_xpath("//*[@id='advs']/div/div[2]/a[1]"): 159 break 160 time.sleep(0.5) 161 162 # 經過xpath定位到第一條信息 163 driver.find_element_by_xpath("//*[@id='advs']/div/div[2]/a[1]").click() 164 # time.sleep(7) 165 166 167 windows = driver.window_handles 168 driver.switch_to.window(windows[-1]) 169 driver.execute_script(js) 170 driver.save_screenshot(img_result) 171 172 173 # driver.close()