91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

selenium+Chrome滑動驗證碼破解二(某某網站)

發布時間:2020-10-06 22:03:41 來源:腳本之家 閱讀:245 作者:臥會兒 欄目:開發技術

具體詳情見代碼,研究網站,隨便輸入手機號點擊獲取驗證碼

在自己寫代碼前參考了一批博客,是把所有驗證碼圖片截取所有驗證碼圖片保存在本地,再對比,感覺方法不行,所以自己寫了個破解方法,通過js修改css直接抓取完整圖片,因為上一篇寫了B站,這里就不一一分析了,直接上代碼:

破解成功界面

selenium+Chrome滑動驗證碼破解二(某某網站)

完整代碼:

# -*- coding:utf-8 -*-
'''
研究網站: https://account.ch.com/NonRegistrations-Regist
滑塊驗證碼也分兩種:
  1.直接給缺口圖片,先滑動到缺口找到完整驗證碼圖片,對比有缺口的驗證碼圖片,然后計算缺口坐標,再利用selenium移動按鈕到指定位置
  2.直接給原圖,缺口需要點擊出現,直接保存原圖,然后對比
'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from lxml.html import etree
from PIL import Image
from time import sleep
import re, requests
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
 
class SliderVerificationCode(object):
  def __init__(self): # 初始化一些信息
    self.left = 60 # 定義一個左邊的起點 缺口一般離圖片左側有一定的距離 有一個滑塊
    self.url = 'https://account.ch.com/NonRegistrations-Regist'
    self.chromedriverPath = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
    self.driver = webdriver.Chrome(executable_path=self.chromedriverPath)
    self.wait = WebDriverWait(self.driver, 20) # 設置等待時間20秒
    self.phone = "18516544488"
 
  def input_name_password(self): # 輸入手機號
    self.driver.get(self.url)
    self.driver.maximize_window()
    self.inputphone = self.wait.until(EC.presence_of_element_located((By.NAME, 'phoneNumberInput')))
    self.inputphone.send_keys(self.phone)
 
 
  def click_login_button(self): # 點擊登錄按鈕,出現驗證碼圖片
    login_button = self.wait.until(EC.element_to_be_clickable((By.ID, 'getDynamicPwd')))
    login_button.click()
    sleep(1)
 
  def get_geetest_image(self): # 獲取驗證碼圖片
    # print(self.driver.page_source)
    gapimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_bg')))
    sleep(2)
    gapimg.screenshot(r'./captcha1.png')
    # 通過js代碼修改標簽樣式 顯示圖片2
    js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'
    self.driver.execute_script(js)
    sleep(2)
    fullimg = self.wait.until(
      EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_fullbg')))
    fullimg.screenshot(r'./captcha2.png')
 
  def is_similar(self, image1, image2, x, y):
    '''判斷兩張圖片 各個位置的像素是否相同
    #image1:帶缺口的圖片
    :param image2: 不帶缺口的圖片
    :param x: 位置x
    :param y: 位置y
    :return: (x,y)位置的像素是否相同
    '''
    # 獲取兩張圖片指定位置的像素點
    pixel1 = image1.load()[x, y]
    pixel2 = image2.load()[x, y]
    # 設置一個閾值 允許有誤差
    threshold = 60
    # 彩色圖 每個位置的像素點有三個通道
    if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
        pixel1[2] - pixel2[2]) < threshold:
      return True
    else:
      return False
 
  def get_diff_location(self): # 獲取缺口圖起點
    captcha1 = Image.open('captcha1.png')
    captcha2 = Image.open('captcha2.png')
    for x in range(self.left, captcha1.size[0]): # 從左到右 x方向
      for y in range(captcha1.size[1]): # 從上到下 y方向
        if not self.is_similar(captcha1, captcha2, x, y):
          return x # 找到缺口的左側邊界 在x方向上的位置
 
  def get_move_track(self, gap):
    track = [] # 移動軌跡
    current = 0 # 當前位移
    # 減速閾值
    mid = gap * 4 / 5 # 前4/5段加速 后1/5段減速
    t = 0.2 # 計算間隔
    v = 0 # 初速度
    while current < gap:
      if current < mid:
        a = 3 # 加速度為+3
      else:
        a = -3 # 加速度為-3
      v0 = v # 初速度v0
      v = v0 + a * t # 當前速度
      move = v0 * t + 1 / 2 * a * t * t # 移動距離
      current += move # 當前位移
      track.append(round(move)) # 加入軌跡
    return track
 
  def move_slider(self, track):
    slider = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_slider_button')))
    ActionChains(self.driver).click_and_hold(slider).perform()
    for x in track: # 只有水平方向有運動 按軌跡移動
      ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
    sleep(1)
    ActionChains(self.driver).release().perform() # 松開鼠標
 
  def main(self):
    self.input_name_password()
    self.click_login_button()
    self.get_geetest_image()
    gap = self.get_diff_location() # 缺口左起點位置
    gap = gap - 6 # 減去滑塊左側距離圖片左側在x方向上的距離 即為滑塊實際要移動的距離
    track = self.get_move_track(gap)
    print("移動軌跡", track)
    self.move_slider(track)
 
 
if __name__ == "__main__":
  springAutumn = SliderVerificationCode()
  springAutumn.main()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海晏县| 磴口县| 郯城县| 广水市| 昭觉县| 大丰市| 阳城县| 博湖县| 邛崃市| 光山县| 伊宁市| 连云港市| 锡林郭勒盟| 嘉义市| 宁都县| 噶尔县| 金阳县| 秦安县| 胶州市| 会理县| 噶尔县| 武宣县| 来宾市| 高要市| 昭平县| 象山县| 太保市| 忻城县| 仪征市| 壤塘县| 城口县| 南涧| 梓潼县| 广德县| 华池县| 桐城市| 元朗区| 哈尔滨市| 呼图壁县| 方正县| 将乐县|