開頭語:
除非是很簡單的參數能夠解決滑塊問題或者追求效率的業務,否則的話,我還是會selenium來解決,并且接下來的驗證碼模式的話不需要使用到原圖進行比較!!我發現很多網站都是基于比較原圖,發現缺口的方式來獲取坐標,而我有不同的小思路。并且該滑塊驗證碼有特殊性,如果遇到可以收藏并點贊!!!!
開發工具:
Python/ target=_blank class=infotextkey>Python版本:3
相關模塊:
selenium模塊、PIL模塊 以及一些python自帶的模塊。
Chromedriver:
有插件的就不用管他了,如果沒有就找小編領取一下!在文章下方有源碼和驅動下載的!
環境搭建:
安裝python并添加到環境變量,pip安裝需要的相關模塊即可。
接著,我們用它來自動訪問一下自己站的登錄界面:
browser.get("https://ad.oceanengine.com/pages/login/index.html")
設置一下等待時間,并自動填充一下用戶名和密碼:
wait = WebDriverWait(browser, 30)
element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[10]/div'))) # 它的作用現在就是,等!!!!!!!
input_user = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[4]/input'))).send_keys('user') # 輸入賬號
input_password = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[5]/input[1]'))).send_keys('password') # 輸入密碼
element.click()#點擊登錄time.sleep(3)#等待三秒鐘就會有驗證碼了
其中用戶名和密碼的輸入框都直接用xpath來定位,非常方便
不會還有人不知道吧,不會吧不會吧~
上面的操作一完成,就有驗證碼彈出來了,直接就有缺口,沒有原圖,無法做比較
驗證碼如圖
驗證碼出來的操作
getimage = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="validate-big"]'))) # 等出圖片
browser.get_screenshot_as_file("./全屏截圖.jpg")
imgelement = browser.find_element_by_xpath('//*[@id="verify-bar-box"]/div[2]/img[2]') # 定位驗證碼
rangle = (324,350, 590,500) # 寫成我們需要截取的位置坐標
i = Image.open("./全屏截圖.jpg") # 打開截圖
i = i.convert('RGB')
frame1 = i.crop(rangle)# frame1.show()# frame1.save('./驗證碼截圖.jpg')
data = frame1.getdata()#獲取rgb
w, h = frame1.size#獲取寬高XCoordinates = 0
接下來是核心算法,求出需要移動的x坐標距離
for x in range(1, w - 1):
for y in range(1, h - 1):
mid_pixel = data[w * y + x] # 中央像素點像素值 if mid_pixel[0] > 230 and mid_pixel[1] > 230 and mid_pixel[2] > 230 and int(x) > 100: # 找出上下左右四個方向像素點像素值
top_pixel = data[w * (y - 1) + x] # 上
down_pixel = data[w * (y + 1) + x] # 下
if top_pixel[0] > 230 and top_pixel[1] > 230 and top_pixel[2] > 230 and down_pixel[0]> 230 and down_pixel[1]> 230 and down_pixel[2]> 230:
XCoordinates=x
這是拖動操作!!包含了拖動時軌跡的變速運動!!
找到滑動的滑塊
element = browser.find_element_by_xpath('//*[@id="validate-drag-wrApper"]/div[2]/img')
location = element.location# # 獲得滑動圓球的高度y = location["y"]
# # 鼠標點擊元素并按住不放# print("第一步,點擊元素")
ActionChains(browser).click_and_hold(on_element=element).perform()## ActionChains(browser).move_by_offset(xoffset=0, yoffset=y - 445).perform()
## time.sleep(0.15)
# print("第二步,拖動元素")
distance=XCoordinates-60
# 初速度v = 0
# 單位時間為0.2s來統計軌跡,軌跡即0.2內的位移,越低看起來越絲滑!!
t = 0.08
# 位移/軌跡列表,列表內的一個元素代表0.2s的位移
tracks = []# 當前的位移current = 0
# 到達mid值開始減速mid = distance * 5 / 8
distance += 10 # 先滑過一點,最后再反著滑動回來
# a = random.randint(1,3)
while current < distance:
if current < mid:
# 加速度越小,單位時間的位移越小,模擬的軌跡就越多越詳細 a = random.randint(100, 200) # 加速運動
else:
a = -random.randint(2, 10) # 減速運動
# 初速度 v0 = v # 0.2秒時間內的位移
s = v0 * t + 0.5 * a * (t ** 2)
# 當前的位置 current += s # 添加到軌跡列表 tracks.append(round(s)) # 速度已經達到v,該速度作為下次的初速度 v = v0 + a * t if current>distance:
break
# 反著滑動到大概準確位置# for i in range(4):
# tracks.append(-random.randint(1, 3))
# for i in range(4):
# tracks.append(-random.randint(1,3))
random.shuffle(tracks)
count=0
for item in tracks:
print(item)
count+=item ActionChains(browser).move_by_offset(xoffset=item, yoffset=random.randint(-2, 2)).perform()
# ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=XCoordinates-18,yoffset=y - 445).perform()
# time.sleep(2)
# # 釋放鼠標print(count)
ActionChains(browser).release(on_element=element).perform()
然后就能登陸了!!!完美!!!其實還有登陸后的操作,也一并奉上吧~點擊操作呢
jiazaichenggong = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[25]/div/div/div[2]/div[2]/button')))
jiazaichenggong.click() Exitboot = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[2]/div/div[6]/div/div[4]/div')))#點擊推出引導
Exitboot.click() closekey=wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[13]/div[2]/div[3]/button')))#查看快捷鍵
closekey.click() time.sleep(3)
# closekey.send_keys(Keys.ESCAPE) ActionChains(browser).move_by_offset(300,238).click().perform()
time.sleep(5)
clickdate=wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[3]/div[2]/div/div[1]/div')))#點擊時間
clickdate.click() print('請輸入時間選擇-格式如下2020.09.01')
stime=input('請輸入開始時間:')
etime = input('請輸入結束時間:')
time.sleep(10)
clickstime = wait.until(EC.presence_of_element_located((By.XPATH, f"//td[@title='{stime}']"))) # 點擊時間
clickstime.click() clicketime = wait.until(EC.presence_of_element_located((By.XPATH, f"//td[@title='{etime}']"))) # 點擊時間
clicketime.click() time.sleep(60)