先来看一个动图:
图片展示的是如何用 Python 将销售交易数据填充到在线发票生成器中,可以自动生成并下载所有客户的发票。
再来看一段视频
视频展示的是如何用 Python 来玩 Flash 游戏 Sushi Go Round。源代码[1]。
是不是很酷炫呢?
它们都是借助 PyAutoGUI 来实现的。
有经验的朋友可能会说,selenium 或 playwright 等浏览器自动化工具就可以实现这样的需求,这有什么酷炫的,你说的没错,如果是浏览器是的确可以使用 selenium 或 playwright,前提还得要懂 html、css、浏览器等相关知识。如果录入操作不是在浏览器上进行,而是客户端的应用程序上录入,那么 selenium 或 playwright 将无法使用。
如果你也想实现上述展示的效果,不妨继续向下看。
PyAutoGUI 简介
今天要介绍的工具就是 PyAutoGUI,看到这个名字,就能猜到它的作用,无非用 Python 自动处理图形界面的操作,的确是这样,你可以使用编程的方式来控制电脑的鼠标和键盘。
它有两个优点:
- 跨平台,支持 Python2 和 Python3,支持 Windows,MacOS,Linux。
- 易使用,接口简单不需要太多知识就可以学会,会操作鼠标和键盘就可以。
一个缺点:
- 需要定位鼠标,有时候不太方便,可移植性不强,换台电脑可能因为尺寸不同就报错了。
PyAutoGUI 安装
PyAutoGUI 支持 pip 进行安装
代码语言:javascript复制pip install pyautogui
如果是 Windows 不需要再安装其他依赖。
如果是 Mac 还要安装 pyobjc:
代码语言:javascript复制pip3 install pyobjc-core
pip3 install pyobjc
如果是 Linux 还需要安装下这些:
代码语言:javascript复制sudo apt-get scrot
sudo apt-get install python-tk
sudo apt-get install python3-dev
无论哪一个操作系统都要确保 Pillow 已经安装。如果是 Linux,你还需要安装额外的库来确保 Pillow 中的 PNG/JPEG 模块正常工作。具体可以参考:
代码语言:javascript复制https://stackoverflow.com/questions/7648200/pip-install-pil-e-tickets-1-no-jpeg-png-support
http://ubuntuforums.org/showthread.php?t=1751455
使用举例
使用前需要先了解屏幕坐标的设定,X 坐标从左侧的 0 开始,向右增加,Y 坐标从顶部的 0 开始,向下增加。如下图所示:
目前,PyAutoGUI 仅适用于主显示器。PyAutoGUI 对于第二台显示器的屏幕不可靠(鼠标功能可能会或可能不会在多显示器设置上工作,具体取决于您的操作系统和版本)。
PyAutoGUI 按下的所有键盘都会发送到当前具有焦点的窗口,就像您按下了物理键盘键一样。
鼠标和键盘控制
鼠标控制:
代码语言:javascript复制#1、鼠标移动
pyautogui.moveTo(100, 150) #绝对位置
pyautogui.moveRel(None, 10) #相对位置
pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.easeInOutQuad) # 2秒带动画移动到500,500
#2、鼠标点击
pyautogui.click() 单击
pyautogui.click(x=100, y=200) #
pyautogui.doubleClick() 双击
pyautogui.rightClick() 单击鼠标右键
pyautogui.middleClick() 单击鼠标中键
pyautogui.click(button='right', clicks=3, interval=0.25)
#3、鼠标拖动
pyautogui.dragTo(x,y[,duration=t)
pyautogui.dragRel(x,y, duration=0.5) #按住左键移动
#4、鼠标滚动
pyautogui.scroll(10) / -10 # 正数向上/下滚动
pyautogui.hscroll(10) / -10 # 向右/左滚动
键盘操作:
代码语言:javascript复制pyautogui.typewrite('Hello world!', interval=0.25) #模拟输入
typewrite(['enter'])
pyautogui.typewrite(['a','b','left','left','X','Y']) # XYab
pyautogui.press('esc')
pyautogui.keyDown('shift')
pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left']) 连续按键left
pyautogui.keyUp('shift')
pyautogui.hotkey('ctrl', 'c') # 组合键
消息弹窗提醒
程序运行的过程中,还可以弹窗让你干预自动执行的流程:
代码语言:javascript复制>>> import pyautogui
>>> pyautogui.alert('This is an alert box.')
'OK'
>>> pyautogui.confirm('Shall I proceed?')
'Cancel'
>>> pyautogui.confirm('Enter option.', buttons=['A', 'B', 'C'])
'B'
>>> pyautogui.prompt('What is your name?')
'Al'
>>> pyautogui.password('Enter password (text will be hidden)')
'swordfish'
屏幕操作
代码语言:javascript复制## 0 截取整个屏幕
import pyautogui
im1 = pyautogui.screenshot()
im1.save('my_screenshot.png')
im2 = pyautogui.screenshot('my_screenshot2.png')
## 1、截取部分屏幕
im = pyautogui.screenshot(r'C:screenshot.png',region=(0, 0, 300, 400)) # 截屏并设置保存图片的位置和名称
## 2、 匹配屏幕所有与目标图片的对象,可以用for循环和list()输出
pyautogui.locateAllOnScreen(r'C:region_screenshot.png')
for pos in pyautogui.locateAllOnScreen(r'C:\region_screenshot.png'):
print(pos)
## 3、获取屏幕点色彩属性值
pix = pyautogui.screenshot().getpixel((x, y)) #0,1,2=rgb
## 4、灰度值匹配
pyautogui.pixelMatchesColor(100, 200, (205, 255, 245), tolerance=10)
定位操作
代码语言:javascript复制# 1、获取屏幕宽高
screenWidth, screenHeight = pyautogui.size()
# 屏幕左上开始为(0,0)
# 2、获取当前鼠标位置
currentMouseX, currentMouseY = pyautogui.position()
# 3、根据图片定位在图片在屏幕上的中点
x, y = pyautogui.locateCenterOnScreen(r'C:screenshot.png')
打开浏览器,自动录入一个表单
注意不同的电脑浏览器的位置可能不一样,需要自己定位好输入框的位置 x,y。
代码语言:javascript复制import time
import pyautogui as pag
import webbrowser
webbrowser.open_new("https://formsmarts.com/html-form-example")
#Let the web browser finish loading before clicking (sleep for 2 seconds)
time.sleep(2)
pag.scroll(100)
#Click on the input field
pag.click(x=700, y=970)
#Type some data into the input field. We pass in an optional parameter of interval so it doesn't type too fast
pag.write('David Tan', interval=0.2)
工作原理
Windows、macOS 和 Linux 各有不同的方式来以编程方式控制鼠标和键盘。这通常会涉及晦涩和深入的技术细节。PyAutoGUI 的工作是将所有这些复杂性隐藏在一个简单的 API 后面。
在 Windows 上,PyAutoGUI 通过内置 ctypes 模块访问 Windows API(也称为 WinAPI 或 win32 API)。https://github.com/asweigart/nicewin[2] 上的 nicewin 模块演示了如何通过 Python 进行 Windows API 调用。
在 macOS 上,PyAutoGUI 使用 rubicon-objc 模块访问 Cocoa API。
在 Linux 上,PyAutoGUI 使用该 Xlib 模块访问 X11 或 X Window 系统。
使用场景
- 一些辅助录入工具,比如一些涉及自动录入表单的场景
- 玩游戏工具,比如 GitHub 上有不少用这个实现自动玩跳一跳小游戏
- 执行自动化用户界面测试
- 一些电脑上重复的机械化操作
- GitHub 上的案例[3]
总之你可以发挥想象力,你的程序都能控制鼠标和电脑了,还有什么不可以完成的呢?
最后的话
你可以利用 PyAutoGUI 库开发 Python 脚本,控制鼠标和键盘来自动执行应用程序的交互。
都看到这儿了,你还没关注我嘛?如果有收获,请点在看支持,再不济点个赞总行了吧,感谢老铁支持。
参考资料
[1]
源代码: https://github.com/asweigart/sushigoroundbot
[2]
https://github.com/asweigart/nicewin: https://github.com/asweigart/nicewin
[3]
GitHub 上的案例: https://github.com/search?q=pyautogui