Python自动化办公-自动录入表单数据

2021-08-19 16:24:55 浏览数 (1)

先来看一个动图:

图片展示的是如何用 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

0 人点赞