opencv 기반 selenium 슬라이딩 인증 코드 구현

selenium 기반 동작 체인
최근 많은 사람들 이 미끄럼 인증 코드 를 어떻게 처리 해 야 할 지 에 대해 이 야 기 를 나 누 었 기 때문에 직접 해 보기 로 했다.
뭐 하나 만 들 기 전에우 리 는 우선 이 물건 의 조작 과정 에 대해 대략적인 이 해 를 가 져 야 한다.
인증 코드 페이지 를 엽 니 다드래그 버튼
드래그 버튼 을 드래그 합 니 다4.567917.그림자 가 빨리 겹 치 는 위치 로 드래그 합 니 다드래그 버튼 을 놓 으 세 요

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

artice = browser.find_element_by_class_name('geetest_slider_button') #     
action = ActionChains(browser)
action.click_and_hold(artice).perform() #      
action.reset_actions() 
action.pause(0.01).move_by_offset(step, 0).perform() #step         
action.release(artice).perform() #     
위 에서 본 측 이 사용 하 는 Action Chains 에 관 한 방법 이 있 습 니 다.다른 방법 은 여기 서 많이 소개 할 뿐 입 니 다.더 알 고 싶 은 것 은 돌려 주세요seleniun ActionChains 마우스 키보드 조작
다음은 제 가 이번에 소개 할 중점,미끄럼 거리 에 대한 소개,즉 그림 이 그림자 구역 의 위 치 를 구 하 는 것 입 니 다.
여기 서 저 는 opencv 라 이브 러 리 를 사 용 했 습 니 다.주요 절 차 는 다음 과 같 습 니 다.
이미지 이치 화
4.567917.이치 화 된 이미지 에 대해 고 스 퍼 지 를 한다
  • canny 로 가장자리 검 사 를 실시 합 니 다
  • 그리고 HoughLines P 호 프 변환 직선 찾기4.567917.조건 에 부합 되 는 직선 을 처리 하여 교점 을 찾 아 우리 가 찾 아야 할 그림자 가 빠 른 거 리 를 구한다
    
    import cv2 as cv
    import numpy as np
    import math
    
    #     
    def FindLines(image):
     image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #    
     blurred = cv.GaussianBlur(image, (5, 5), 0) #     
     canny = cv.Canny(blurred, 200, 400) # canny    
     lines = cv.HoughLinesP(canny, 1, np.pi / 180, 20, minLineLength=15, maxLineGap=8) #         
     return lines[:, 0, :] #     
    
    
    #          
    def FindResultLises(lines):
     resultLines = []
     for x1, y1, x2, y2 in lines:
      if (abs(y2 - y1) < 5 or abs(x2 - x1) < 5) and min(x1, x2) > 60: #                   60    
       resultLines.append([x1, y1, x2, y2])
     return resultLines
    
    
    #          
    def distAbs(point_exm, list_exm):
     x, y = point_exm
     x1, y1, x2, y2 = list_exm
     dist_1 = math.sqrt(abs((y2 - y1) + (x2 - x1) + 1)) #      
     dist_2 = math.sqrt(abs((y1 - y) + (x1 - x) + 1)) + math.sqrt(abs((y2 - y) + (x2 - x) + 1)) #            
     return abs(dist_2 - dist_1) 
    
    
    #      y = kx + b      
    def findPoint(line1, line2):
     poit_status = False
     x1, y1, x2, y2 = line1
     x3, y3, x4, y4 = line2
     x = y = 0
    
     if (x2 - x1) == 0: #   x 
      k1 = None
      b1 = 0
     else:
      k1 = 1.0 * (y2 - y1) / (x2 - x1)
      b1 = y1 * 1.0 - k1 * x1 * 1.0
    
     if (x4 - x3) == 0:
      k2 = None
      b2 = 0
     else:
      k2 = 1.0 * (y4 - y3) / (x4 - x3)
      b2 = y3 * 1.0 - k2 * x3 * 1.0
    
     if k1 is None:
      if not k2 is None:
       x = x1
       y = k2 * x1 + b2
       poit_status = True
     elif k2 is None:
      x = x3
      y = k1 * x3 + b1
      poit_status = True
     elif k1 != k2:
      x = (b2 - b1) * 1.0 / (k1 - k2)
      y = k1 * x * 1.0 + b1 * 1.0
      poit_status = True
    
     return poit_status, [x, y]
    
    
    #    
    def linePoint(resultLines):
     for x1, y1, x2, y2 in resultLines:
      for x3, y3, x4, y4 in resultLines:
       point_is_exist, [x, y] = findPoint([x1, y1, x2, y2], [x3, y3, x4, y4]) #        
       if point_is_exist:
        dist_len1 = distAbs([x, y], [x1, y1, x2, y2])
        dist_len2 = distAbs([x, y], [x3, y3, x4, y4])
        if dist_len1 < 5 and dist_len2 < 5: #      5          
         #                   
         if abs(y2 - y1) < 5:
          # x1    
          if abs(x1 - x) + abs(y1 - y) < 5: #    
           return -1, [x, y]
          else:
           return 1, [x, y]
         else:
          # x2    
          if abs(x3 - x) + abs(y3 - y) < 5:
           return -1, [x, y]
          else:
           return 1, [x, y]
     return 0, [0, 0]
    
    if __name__ == '__main__':
     img = cv.imread(r'C:\Users\Administrator\Desktop\opencv\temImg.png')
     lines = FindLines(img)
     lines = FindResultLises(lines)
     L_or_R, point_x = linePoint(lines) # L_or_R                         
     xoffset = point_x[0]
     yoffset = point_x[1]
     cv.circle(img, (int(xoffset), int(yoffset)), 5, (0, 0, 255), 3)
     cv.imshow('circle', img)
     cv.waitKey(0)
     cv.destroyAllWindows()


    효과 도
    물론 조작 할 수 없 는 그림 도 있 습 니 다.여러분 이 관심 있 는 것 은 그 중의 인 자 를 시도 하고 수정 할 수 있 습 니 다.
    미끄럼 인증번호
    위 에서 우 리 는 이미 가장자리 점 을 찾 았 고 교점 이 왼쪽 인지 오른쪽 인지 에 따라 계산 하여 우리 가 미 끄 러 질 마지막 값 을 찾 았 다.
    
    if L_or_R == 1:
     x_offset = xoffset - 20 # 20                   
    else:
     x_offset = offset + 20
    미끄럼 거리 가 생 겼 으 니 다음은 미 끄 러 질 것 이다.
    우리 가 직접action.move_by_offset(x_offset,0).perform()그림 을 사용 하면 괴물 에 게 잡 아 먹 혔 음 을 보 여 준다.그것 은 바로 운동 궤적 이 정상 인 이 아 닌 행동 으로 검출 되 는 것 이다.정상 인 은 당기 기만 하면 대응 하 는 위치 로 끌 어 올 리 기 어렵 기 때문이다.
    미끄럼 궤적 알고리즘
    그래서 우 리 는 사람의 정상 적 인 조작 을 모 의 하 는 드래그 궤적 이 있어 야 한다.다음은 먼저 속 도 를 내 고 속 도 를 줄 이 는 궤적 이다.
    
    import ramdom
    
    #             
    def moveTrack(xoffset):
     updistance = xoffset*4/5
     t = 0.2
     v = 0
     steps_list = []
     current_offset = 0
     while current_offset<xoffset:
      if current_offset<updistance:
       a = 2 + random.random() * 2
      else:
       a = -random.uniform(12,13)
      vo = v
      v = vo + a * t
      x = vo * t + 1 / 2 * a * (t * t)
      x = round(x, 2)
      current_offset += abs(x)
      steps_list.append(abs(x))
     #     sum(steps_list)         ,             ,        
     disparty = sum(steps_list)-xoffset 
     last1 = round(-random.random() - disparty, 2)
     last2 = round(-disparty-last1, 2)
     steps_list.append(last1)
     steps_list.append(last2)
     
     return steps_list
    궤적 이 있 으 면 우 리 는 순환 을 통 해 버튼 을 끌 수 있다.주의해 야 할 것 은 매번 순환 할 때마다steps_list그렇지 않 으 면 그 는 이전의 거리 도 계산 하고 순환 이 끝나 면 버튼 을 놓 는 것 을 기억 해 야 한 다 는 것 이다.
    
    for step in steps_list:
     action.reset_actions()
     action.pause(0.01).move_by_offset(step, 0).perform()
    action.release(artice).perform()
    opencv 기반 selenium 미끄럼 인증 코드 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 opencv selenium 미끄럼 인증 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기