圖片比對 昨天的博客已經將圖片存儲到了本地,今天要做的第一件事情,就是需要在兩張圖片中進行比對,將圖片缺口定位出來 缺口圖片 完整圖片 計算缺口坐標 對比兩張圖片的所有RBG像素點,得到不一樣像素點的x值,即要移動的距離 極驗證對於用戶行為檢測是有專門的演算法的,找到一篇比較老的文章 https:// ...
圖片比對
昨天的博客已經將圖片存儲到了本地,今天要做的第一件事情,就是需要在兩張圖片中進行比對,將圖片缺口定位出來
缺口圖片
完整圖片
計算缺口坐標
對比兩張圖片的所有RBG像素點,得到不一樣像素點的x值,即要移動的距離
def get_distance(self,cut_image,full_image):
# print(cut_image.size)
threshold = 50
for i in range(0,cut_image.size[0]):
for j in range(0,cut_image.size[1]):
pixel1 = cut_image.getpixel((i, j))
pixel2 = full_image.getpixel((i, j))
res_R = abs(pixel1[0] - pixel2[0]) # 計算RGB差
res_G = abs(pixel1[1] - pixel2[1]) # 計算RGB差
res_B = abs(pixel1[2] - pixel2[2]) # 計算RGB差
if res_R > threshold and res_G > threshold and res_B > threshold:
return i # 需要移動的距離
極驗證對於用戶行為檢測是有專門的演算法的,找到一篇比較老的文章
https://blog.csdn.net/ieternite/article/details/51483491
如果我們直接把上面算出來的缺口位置放到前面腳本里,你會發現即使移動的位置正確了,提示卻是“怪物吃了餅圖”,驗證不通過。很顯然,geetest識別出了這個動作並不是人的行為。這我們就需要去查看自然人滑動滑鼠和我們代碼實現的滑動在軌跡上有什麼不同。
滑鼠拖動滑塊進行移動的時候,也是遵循人類行為的,這個地方,你可以參考文章
https://www.cnblogs.com/xiao-apple36/p/8878960.html
移動滑塊
這部分和我們之前滑動驗證碼識別是一致的,通過selenium進行人行為實現
# 移動滑塊
def start_move(self, distance):
element = self.driver.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]')
# 使用滑塊的一半進行偏移設置
distance -= element.size.get('width') / 2
distance += 15
# 按下滑鼠左鍵
ActionChains(self.driver).click_and_hold(element).perform()
time.sleep(0.5)
while distance > 0:
if distance > 20:
# 如果距離大於20,就讓他移動快一點
span = random.randint(5, 8)
else:
# 快到缺口了,就移動慢一點
span = random.randint(2, 3)
ActionChains(self.driver).move_by_offset(span, 0).perform()
distance -= span
time.sleep(random.randint(10, 50) / 100)
ActionChains(self.driver).move_by_offset(distance, 1).perform()
ActionChains(self.driver).release(on_element=element).perform()
運行效果,第一次驗證失敗了,等待7秒左右進行第二次驗證,註意成功了。
最後要調整的是驗證失敗,需要重覆驗證
驗證失敗
驗證失敗,在拖動的下麵繼續編寫即可,屬於正常的邏輯代碼了
self.start_move(dis)
# 如果出現錯誤
try:
WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH, '//div[@class="gt_ajax_tip gt_error"]')))
print("驗證失敗")
return
except TimeoutException as e:
pass
# 判斷是否驗證成功
try:
WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//div[@class="gt_ajax_tip gt_success"]')))
except TimeoutException:
print("重新驗證....")
time.sleep(5)
# 失敗後遞歸執行拖動
self.analog_drag()
else:
print("驗證成功")
寫在後面
到此為止,極驗證已經編寫完畢,代碼中還有很多地方需要進行調整
例如
element = self.driver.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]')
上面獲取元素的方式,很容易導致目標元素沒有捕獲到,然後項目直接報錯退出,所以需要進行完善
driver 需要及時的關閉,否則會在你的任務管理器中出現大量的chromedriver.exe
進程
極驗證驗證碼破解方式基本遵循滑動驗證碼,核心內容在於兩個圖片的處理,希望你可以學習到。
掃碼關註微信公眾賬號,回覆0321獲取驗證碼源碼