python在屏幕上點(diǎn)擊特定按鈕或圖像效果實(shí)例
想要的效果
大概就是搞個windows桌面自動點(diǎn)擊程序,以新浪微博自動點(diǎn)贊為例。
需要用到的函數(shù)庫
PyAutoGUI——圖形用戶界面自動化(主要用到這個)
PyAutoGUI是Python功能強(qiáng)大的UI自動化庫,其目的是可以用程序自動控制鼠標(biāo)和鍵盤操作,主要用來實(shí)現(xiàn)PC端的UI自動化。
- 有鼠標(biāo)控制、鍵盤操作、屏幕截圖、圖片定位、消息對話框、窗口操作等功能;
- 有倒計時、鼠標(biāo)坐標(biāo)顏色抓取小程序、UI自動化迷你語言等實(shí)用工具;
- 有故障安全、通用暫停等機(jī)制。
Pillow——圖像處理
該庫提供廣泛的文件格式支持、高效的內(nèi)部表示和相當(dāng)強(qiáng)大的圖像處理功能。旨在快速訪問以幾種基本像素格式存儲的數(shù)據(jù)。它應(yīng)該為一般的圖像處理工具提供堅(jiān)實(shí)的基礎(chǔ)。
- 該庫包含基本的圖像處理功能,包括點(diǎn)操作、使用一組內(nèi)置卷積內(nèi)核進(jìn)行過濾以及色彩空間轉(zhuǎn)換。
- 該庫還支持圖像大小調(diào)整、旋轉(zhuǎn)和任意仿射變換。
- 有一種直方圖方法允許您從圖像中提取一些統(tǒng)計信息。這可用于自動對比度增強(qiáng)和全局統(tǒng)計分析。
OpenCV——是開源的計算機(jī)視覺和機(jī)器學(xué)習(xí)庫(不太了解,問題不大)
它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實(shí)現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。
前面的看不看都一樣進(jìn)入正題
例如實(shí)現(xiàn)功能,打開新浪微博首頁,我們要識別圖中的的贊,并點(diǎn)擊。
1),使用pyautogui.mouseInfo()獲取目標(biāo)圖片(屏幕上需要點(diǎn)擊的圖像)位置,以新浪微博點(diǎn)贊為例,寫代碼截取點(diǎn)贊的手勢圖片,代碼如下:
import pyautogui pyautogui.mouseInfo()#獲取點(diǎn)贊圖片的位置(1127,756,1146,775)
from PIL import Image import pyautogui import time time.sleep(2)#留一點(diǎn)切換頁面時間 im = pyautogui.screenshot()#截取整個屏幕 om = im.crop((1127, 756, 1146, 775))#根據(jù)截取的屏幕僅截取“帶贊的手勢圖片”,用pyautogui.mouseInfo()獲取圖片的位置(1127,756,1146,775),這里截取區(qū)域用到了Pillow om.save(r"C:\Users\zz\Desktop\dianzan.png")#將圖片保存供pyautogui.locateOnScreen()使用
截圖效果:
ps:自己手動截圖也一樣,還有最重要每當(dāng)初次運(yùn)行時要確保圖像不出錯還是重新用程序截一個圖靠譜。
2),獲取贊截圖后使用pyautogui.locateOnScreen()識別圖像獲取贊圖像的位置,再用pyautogui.center()獲取中心點(diǎn),代碼如下:
import pyautogui import time time.sleep(1) def zan(): time.sleep(1) # 這個可以用來防止操作過快 left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png") # 尋找剛才保存點(diǎn)贊手勢圖片 center = pyautogui.center((left, top, width, height)) # 尋找圖片的中心 pyautogui.click(center) print('點(diǎn)贊成功!') count = 10 # 為了防止一直運(yùn)行下去,點(diǎn)一定數(shù)量的贊就結(jié)束,自己定義 while count: try: zan() # 調(diào)用點(diǎn)贊函數(shù) count -= 1 except TypeError: # 錯誤類型沒有也文圖不大,哈哈哈 pyautogui.scroll(-500) # 本頁沒有圖片后,滾動鼠標(biāo); print('沒有找到目標(biāo),屏幕下滾~') print("點(diǎn)10個贊結(jié)束!")
運(yùn)行結(jié)果:
代碼輸出如下:
一般基本原理以上就是了,大概。。。。但是要提高pyautogui.locateOnScreen()識別圖像速度和效率的話看下面:
圖片定位不穩(wěn)定的四種解決方案
方案介紹
1.模糊定位:借助opencv的來提高識別率,加入
confidence
參數(shù)調(diào)整識別準(zhǔn)確度,當(dāng)confidence
越小,定位的精度就會越低,從而實(shí)現(xiàn)模糊定位。2.灰度匹配:加入grayscale參數(shù),當(dāng)grayscale=True時會使圖像和屏幕截圖中的顏色去飽和,解決由于顯示器飽和度不同從而引起的顏色細(xì)微差異因而導(dǎo)致的圖像定位失敗問題。
3.指定范圍:加入region參數(shù),可以控制找圖范圍提高找圖效率。
4.多圖定位:圖標(biāo)在不同場景下可能有不同的顯示效果,可以把不同顯示效果的多張圖片歸為一個事件,對多張圖進(jìn)行循環(huán)查找,定位一張圖就可以對整個事件進(jìn)行定位。
1.模糊定位
在pyautogui.locateOnScreen()
函數(shù)中加入confidence
參數(shù),當(dāng)confidence的值決定精度,代碼如下:
left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", confidence=0.9) #太長了下面用xy表示
2.灰度匹配
在pyautogui.locateOnScreen()
函數(shù)中加入grayscale=True,就可以實(shí)現(xiàn)灰度匹配,代碼如下:
xy = locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", grayscale=True)
3.指定范圍
加入region參數(shù),可以控制找圖范圍,從而提高找圖效率。region(x,y,width,height),其中x,y為范圍左上角坐標(biāo),width,height為范圍的寬和高,代碼如下:
xy = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", region=(1128, 208, 1158, 1027))
4.多圖定位
可以對一個圖標(biāo)截多張不同的圖,每一張圖都代表這個圖標(biāo),只要定位其中一張圖就能定位這個圖標(biāo)。對locateOnScreent()函數(shù)進(jìn)行二次封裝,多張圖片之間用 ' | ' 間隔,實(shí)現(xiàn)循環(huán)找圖,代碼如下:
from pyautogui import * #把字符串按'|'切割 def word_cut(args): tup = [] if '|' in args: re1 = args.split('|') return re1 else: tup.append(args) return tuple(tup) #判斷圖像是否找到,如果找到就返回True,沒找到就跳過 def assertPIC(args): if locateOnScreen(args) == None: pass else: return True #循環(huán)找圖,找到就返回圖像中心點(diǎn),沒找到就打印'沒找到' def img_locat(args): arg = word_cut(args) for i in range(len(arg)): if assertPIC(arg[i]): return center(locateOnScreen(arg[i])) else: print('沒找到') #測試 print(img_locat('test1.png|test2.png'))
所以最后的程序可以這樣:
import pyautogui import time time.sleep(1) def zan(): time.sleep(3) # 這個可以用來防止操作過快 left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", confidence=0.9, region=(1101, 190, 1240, 1034)) # 尋找剛才保存點(diǎn)贊手勢圖片 center = pyautogui.center((left, top, width, height)) # 尋找圖片的中心 pyautogui.click(center) print('點(diǎn)贊成功!') count = 10 # 為了防止一直運(yùn)行下去,點(diǎn)一定數(shù)量的贊就結(jié)束,自己定義 while count: try: zan() # 調(diào)用點(diǎn)贊函數(shù) count -= 1 except TypeError: # 錯誤類型沒有也文圖不大,哈哈哈 pyautogui.scroll(-500) # 本頁沒有圖片后,滾動鼠標(biāo); print('沒有找到目標(biāo),屏幕下滾~') print("點(diǎn)10個贊結(jié)束!")
補(bǔ)充:Python實(shí)現(xiàn)鼠標(biāo)自動控制到屏幕指定位置,并點(diǎn)擊
import pyautogui pyautogui.moveTo(0, 0, duration=1) pyautogui.click()
代碼解釋:
0, 0是鼠標(biāo)需要移動到的位置,這邊是屏幕左上角的位置坐標(biāo)
duration=1是將鼠標(biāo)移動到指定坐標(biāo)的間隔時間,這邊是1秒
pyautogui.click()是點(diǎn)擊
注:
屏幕的位置坐標(biāo)點(diǎn)可以通過微信截圖看到坐標(biāo)
總結(jié)
到此這篇關(guān)于python在屏幕上點(diǎn)擊特定按鈕或圖像效果的文章就介紹到這了,更多相關(guān)python屏幕上點(diǎn)擊按鈕或圖像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
搭建Python的Django框架環(huán)境并建立和運(yùn)行第一個App的教程
時至今日Django仍然是人氣最高的Web開發(fā)框架,MVC結(jié)構(gòu)清晰內(nèi)置功能強(qiáng)大,這里我們就來共同學(xué)習(xí)搭建Python的Django框架環(huán)境并建立和運(yùn)行第一個App的教程2016-07-07pygame實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn),python版飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09詳解在python操作數(shù)據(jù)庫中游標(biāo)的使用方法
這篇文章主要介紹了在python操作數(shù)據(jù)庫中游標(biāo)的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11