听说你想学最近火爆的自动化Python办公——pyautogui控制鼠标键盘自动化操作,pytesseract进行图片文字识别,搭配上os文件管理,re正则过滤简直爽爆了
- 前言
- 准备条件
- 扩展与提升
- 收集群里图片用pyautogui库
- 重命名收集好的图片
- 细节一:pytesseract的下载与安装
- 安装
- 配置环境变量
- 验证是否安装成功
- 细节二:pytesseract中文字体包的导入
前言
最近在小破站上突然火爆了一个Python自动化办公的视频,地址如下:5分钟,教你做个自动化软件拿来办公、刷副本、回微信 | 源码公开,开箱即用
但是虽说源码公开,但是也并非是完全开箱即用,对于那些基础不太行的同志来说确实有亿点点难…
因此,本小主特意为同志们准备了这一篇,想要学最近火爆的自动化Python办公,看这一篇就行!
准备条件
- Python环境
首先,既然说好了是Python自动化办公,首当其冲的肯定就是Python了,这里我就不做赘述,Python环境配置不难,网上一大堆,但是还是推荐大家下一个pycharm,毕竟专业的工具用做专业的事情嘛。
- pyautogui库
接下来介绍一个Python自动化办公的关键库——pyautogui,其主要是控制鼠标键盘使用的模块。它的下载方法也很简单,可以通过pip下载,关于具体的下载方式你也可以直接搜索其他资料,这里不做过多赘述。简单来给大家讲几个pyautogui库最常用的功能:
'''
获取基本信息
'''
import pyautogui
# # 屏幕大小
size = pyautogui.size()
print(size)
# 鼠标位置
mouse_pos = pyautogui.position()
print(mouse_pos)
# 判断点是否在屏幕内
print(pyautogui.onScreen(100,100))
'''
控制鼠标移动
'''
import pyautogui
size = pyautogui.size()
# 把鼠标移动到(10,10)的位置,周期duration为1秒
pyautogui.moveTo(10,10,duration=1)
# 把鼠标移动到画面中央,周期duration为0.5秒
pyautogui.moveTo(size.width/2,size.height/2,duration=0.5)
# 鼠标相对移动,周期duration为1秒
pyautogui.moveRel(100, 0,duration=1)
'''
鼠标的移动
'''
import pyautogui
# 上一次的位置
last_pos = pyautogui.position()
try:
while True:
# 新位置
new_pos = pyautogui.position()
if last_pos != new_pos:
print(new_pos)
last_pos = new_pos
except KeyboardInterrupt:
print('\nExit.')
'''
鼠标的移动加点击
'''
import time # 这个是系统时间库
import pyautogui
# 系统准备时间,停止1秒
time.sleep(1)
# 取得帮助菜单的位置
Project_pos = pyautogui.locateOnScreen('Project.png')
goto_Project = pyautogui.center(Project_pos)
# 移动鼠标
pyautogui.moveTo(goto_Project,duration=1)
# 点击
pyautogui.click()
# 再移动鼠标到返回图标并点击
break_pos = pyautogui.locateOnScreen('break.png')
goto_break = pyautogui.center(break_pos)
# 移动鼠标
pyautogui.moveTo(goto_break,duration=1)
pyautogui.click()
'''
键盘输入
这里会碰到一个输入不了中文的问题,可参考如下解决办法:
导入pyperclip库,如果没有可以用: pip install pyperclip 安装
作用:向剪切板发送文本或读取剪切板文本
用法:
pyperclip.copy('dsd')#向剪切板发送文本
pyperclip.paste()读取剪切板文本
再用pyautogui.hotkey('ctrl','v')粘贴
'''
import time
import pyautogui
import pyperclip
# 系统准备时间,停止1秒
time.sleep(1)
# 点击一次编辑器Python!
pyautogui.click(button="left")
# 输入【Python牛逼!】
pyautogui.typewrite("I like Python!")
# 输入回车,然后进行输入内容
pyautogui.typewrite('\nI like you.',0.25)
# 输入【good】,然后将头文字改为大写的G,最后在行尾写个句子
pyautogui.typewrite(['enter','g','o','o','d','left','left','left','backspace','G','end','.'],0.25)
# 输入中文,利用pyperclip.copy('你好,Python')#向剪切板发送文本,再用pyautogui.hotkey('ctrl','v')粘贴到文本里
pyperclip.copy('你好,Python')
pyautogui.hotkey('ctrl','v')
'''
组合键的使用
'''
time.sleep(2)
# 每个动作间隔0.5秒钟
pyautogui.PAUSE = 0.5
# pyautogui.FAILSPAFE = True # 启用自动防故障功能,左上角的坐标为(0,0),将鼠标移到屏幕的左上角,来抛出failSafeException异常
# 记事本打出时间(这里要注意是记事本,如果是Word的话f5就是查找和替换)
pyautogui.press('f5')
# 打入三行内容
pyautogui.typewrite('\nhelo')
pyautogui.typewrite('\nhelo')
pyautogui.typewrite('\nhelo')
# 按下Ctrl键(注意:keyDown是按下不松开,再用keyUp松开,而press就是按一下)
pyautogui.keyDown('ctrl')
# 按下a键,选择全部
pyautogui.press('a')
# 按下c键,复制
pyautogui.press('c')
# 松开Ctrl键
pyautogui.keyUp('ctrl')
# 鼠标点击记事本下方
pyautogui.click(600,600)
# 输入两个空行
pyautogui.typewrite('\n\n')
# 粘贴
pyautogui.hotkey('ctrl','v')
最后,以上只是pyautogui的最常用的最基础的功能,更多详细的请见官方API文档。
扩展与提升
最近接了个兄弟的小活,我兄弟是团支书,每个星期都要收团活动的截图,简单来说就是把群里每个人的截图保存下来,再重名名,统计数量,这种简单而繁琐的工作让他叫苦不堪,因此我给他写了个Python自动化脚本。
收集群里图片用pyautogui库
收集群里图片这个简单,可以用pyautogui对鼠标键盘的常用操作,直接给他来一波拟人化操作,详细看代码:
# -*-coding:utf-8-*-
"""
作者:白浪
日期:2021年11月25日
(这里的代码仅供参考,不适用于其他人)
"""
import pyautogui # 自动化操作库
import time # 系统时间库
# 弹窗
def auto_alert():
# 显示一个简单的带文字和OK按钮的消息弹窗。用户点击后返回button的文字。
# pyautogui.alert(text='', title='', button='OK')
b = pyautogui.alert(text='您确定您要开始超级无敌自动化牛逼到爆的程序了么?', title='超级无敌自动化程序', button='确定!冲冲冲')
print(b) # 输出结果为OK
def goto_img(img):
# 取得找到的第一张图片的位置
# img_pos = pyautogui.locateOnScreen(img,confidence=0.8)
# print(img_pos)
# 取得多个图片的位置
img_pos_list = list(pyautogui.locateAllOnScreen(img, confidence=0.8,grayscale=True))
print(img_pos_list)
# 移动鼠标到图片位置
to_img = pyautogui.center(img_pos_list[0])
pyautogui.moveTo(to_img,duration=0)
# 步骤一:收取图片
def Step1_GetImg():
print('开始收取图片')
# 系统等待5秒,这段时间你得打开你要收取图片的区域
# time.sleep(5)
# 来到班级群
try:
goto_img('class.png')
pyautogui.click()
except:
goto_img('class2.png')
time.sleep(1)
while 1:
# 移动鼠标到截图区域
try:
goto_img('jietuweizhi.png')
except:
try:
goto_img('jietuweizhi2.png')
except:
continue
# 按下鼠标右键
pyautogui.mouseDown(button='right')
pyautogui.mouseUp(button='right')
# 另存为截图
goto_img('save.png')
# 点击
pyautogui.click()
try:
goto_img('save2.png')
except:
goto_img('save3.png')
# 点击
pyautogui.click()
# 移动鼠标到截图区域
try:
goto_img('jietuweizhi.png')
except:
try:
goto_img('jietuweizhi2.png')
except:
continue
pyautogui.scroll(-20) # 向下滚动10格
pyautogui.scroll(-20) # 向下滚动10格
# 步骤二:给图片重命名
def Step2_rename():
print('开始给图片重命名')
if __name__ == '__main__':
# 弹窗
auto_alert()
# 步骤一:收取图片
Step1_GetImg()
# 步骤二:给图片重命名
Step2_rename()
关于我上面为什么用try,except异常抛出,主要原因还是在于pyautogui.locateOnScreen(img)精度太高,有时间找不到图片,改为pyautogui.locateOnScreen(img,confidence=0.8)后,confidence是精度参数,范围在0~1间,精度越大肯定越精确,精度太小就容易识别到其他的错误图片上去了,达不到想要的效果。所以用异常抛出
重命名收集好的图片
收集好图片后如何重命名图片文件?这是一个很好的question!
这里我采用的是如下方法:
- 先用文件管理库——os,获取收集好的图片;
- 再用图片识别文字库——pytesseract,识别位置图片文字;
- 这里识别的文字可能还包含其他你不想要的文字信息,所以我们用正则库——re,正则化提取出我们想要的文字信息;
- 最后再用文件管理库——os,对位置图片重命名;
方法是这么个方法,但是实施过程中还是有很多需要注意的细节点,其中主要还是下载和安装配置方面,这里为了大家方便,我把下载链接和搭配好中文字体包的压缩包都放置这里,大家自行提取:pytesseract和中文字体识别包.zip
细节一:pytesseract的下载与安装
安装
安装过程中直接下一步就好,不过前往要记得自己的安装目录(博主的安装路径为:C:\Program Files(x86)\Tesseract-OCR),等会配置环境变量要用。
配置环境变量
博主的安装路径为:C:\Program Files(x86)\Tesseract-OCR。电脑属性–高级系统设置–环境变量,进入如下界面。
把刚刚的安装路径"C:\Program Files(x86)\Tesseract-OCR"添加到用户变量和系统变量的path中
验证是否安装成功
打开命令终端,输入:tesseract -v,可以看到版本信息。如果没有安装成功,可以重启电脑,或者再参考其他教程
细节二:pytesseract中文字体包的导入
如果不是做英文的图文识别,还需要下载其他语言的识别包(详细见上方下载链接),如简体字识别包对应的是chi_sim.traineddata ,繁体字识别包对应的是chi_tra.traineddata 。
下载好之后放到安装目录的tessdata目录下即可。
最后本着开源的精神,我也把图片文字识别的代码奉上,大家自行参考:
# -*-coding:utf-8-*-
"""
作者:白浪
日期:2021年11月25日
"""
import pytesseract
from PIL import Image
import os
import re
# 生成正则表达式查找name模板
find_name = re.compile(r'(物 联 1941.*)\n')
# print(os.listdir('./收取的截图'))
# 所有人的集合
name_list = []
os_len = len(os.listdir('./收取的截图'))
for i in range(os_len):
try:
im_src = './收取的截图/' + os.listdir('./收取的截图')[i]
except:
continue
im=Image.open(im_src,mode="r")
String = pytesseract.image_to_string(im,lang='chi_sim')
# print(String)
name = re.findall(find_name, String)
print(name)
try:
if len(name) != 0 and name[0] != '' and name[0] not in name_list:
try:
name_list.append(name[0])
os.renames(im_src, './筛选后的截图/' + name[0] + '.jpg')
except:
os.remove('./筛选后的截图/' + name[0] + '.jpg')
print('文件' + name[0] + '.jpg 已经存在了,进行下一张判断' )
except:
pass
print(name_list)
print(len(name_list))