RPA笔记
未完待续(闲暇时间会将近年来所掌握的技术与工具进行分享,不定期更新)
什么是RPA
![RPA展望世界如此美好](https://img-blog.csdnimg.cn/d39ec8066f744bfd9a9c31221f9bdfc8.jpeg#pic_center
RPA(Robotic Process Automation,机器人流程自动化)技术通过模拟人工操作键盘鼠标,自动处理计算机中规则清晰、批量重复的工作与任务。
背景
过去的一年,RPA机器人流程自动化行业迎来了一个快速发展的机遇。RPA创业者得到了国内投资人的认可,一些RPA公司也接连拿到千万美金级别的融资,这在当下遇冷的资本市场环境下显得格外耀眼。
眼下,RPA已在金融、财会、电信、能源、制造、物流等行业领域生根发芽。当下的RPA技术可以替代各行业企业内部软件中所有需要人工重复操作的工作。
以上内容摘自知乎,目前RPA开发工具及产品层出不穷,较为成熟的产品可以自行搜索,各大RPA厂商意在提供简单高效的低代码类工具,不过万变不离其宗,首先我们还是应当掌握编程的基础知识及RPA构建的基本思想。
准备工作
截止目前我们已初步了解RPA,但距离开发一个属于自己的RPA程序我们还需要了解以下基础内容:
- 可以《python开发指南》为参考,了解程序的基本组成如,变量类型、运算符、条件语句、循环语句;
- 网页自动化,以uibot为例可直接通过鼠标拖拽的方式进行元素锁定,较传统RPA开发效率提升乃至5-10倍;但我们不能只看重便捷,更应理解其中的原理,乃至修改其自动生成的代码块;
- 数据处理,由于数据处理逻辑不定,几乎所有RPA厂商提供的Excel或者数据处理自动化不是很实用;目前我所采用的方案为(pandas+xlwings+openpyxl)即可完成几乎所有适用RPA的业务场景;
- GUI可作为进阶内容,需先掌握较为简单的网页自动化。
环境搭建
工欲善其事,必先利其器
作为开发也是相同的道理;在我们选定好适用自己的RPA工具可去相应厂商的官网进行软件的下载进行安装;
除此之外安装python相应的开发工具作为后续进阶的利器,此处推荐pycharm专业版(收费,可自行百度或淘宝~嘘嘘嘘~~~~)
基础语法
此处不在一一叙述,现成及优秀的文档较多
参考所选用RPA工具官网,可对应去社区进行搜索
python基础语法可参考菜鸟教程或者B站进行学习
网页自动化
元素定位方式
实现方式
python(selenium)、uibot等市场RPA工具
文件与文件夹
文件夹的创建与删除
os库
文件的创建、复制、移动、删除
python-shutil库
数据处理
基于pandas、xlwings、openpyxl实现
vlookup
左连接为主(内-外连接为辅)与vlookup相同而不同
数据连接
数据透视
调用excel公式
GUI自动化
os、为win32
句柄锁定工具
SPYXX、Inspect、UISpy
消息推送
飞书、企微群消息推送
# 功能:企业微信群消息推送
# 创建时间:{2023/1/5} 13:07
# 开发人:xiaoqiaoBQ
import json
import requests
"""
url : 群自定义机器人webhook地址
title : 消息标题
text : 文本内容
"""
def wecomGroupMessagePush(url, content):
# 你复制的webhook地址
url = url
# _________________________________发送富文本消息_____________________________________________________
rich_text = {
"msgtype": "markdown",
"markdown": {
"content": content
}
}
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=json.dumps(rich_text))
print(response.text)
发送邮件
# 功能:
# 创建时间:{2022/12/6} 14:45
# 开发人: xiaoqiaoBQ
# coding=gbk
import zipfile
import os
import mimetypes
import smtplib # 发送邮件模块
from email import encoders
from email.mime.multipart import MIMEMultipart # 使用MIMEMultipart来标示这个邮件是多个部分组成的
from email.mime.base import MIMEBase
from email.mime.text import MIMEText # 定义邮件内容
# import datetime
from email.utils import formataddr
def zipDir(dirpath, outFullName):
zip = zipfile.ZipFile(outFullName, "w", zipfile.ZIP_DEFLATED)
for path, dirnames, filenames in os.walk(dirpath):
# 去掉目标跟路径,只对目标文件夹下边的文件及文件夹进行压缩
fpath = path.replace(dirpath, '')
for filename in filenames:
zip.write(os.path.join(path, filename), os.path.join(fpath, filename))
zip.close()
print('压缩成功')
def send_email(filepath, yesterday, receivers):
# filepath = "D:\haoxin008\Desktop\RPA理房通线下退费状态反馈\结果\结果.zip" # 要发送的压缩文件路径
smtp_server = "" # 发送邮箱服务器
username = "" # 用于发送邮箱的用户账号
password = "" # 密码(即授权码)
sender = '' # 发送者的邮箱
# receivers = [] # 接收者的邮箱
EMAIL_FROM_NAME = ' ' # 自定义发件人名称
# time = datetime.datetime.today().strftime("%m-%d %H:%M")
msg = MIMEMultipart()
# 邮件正文
msg.attach(MIMEText("hi,all!\r\n" + yesterday + "理房通、线下退费状态反馈结果请见附件内容", 'plain', 'utf-8')) # 文本内容换行\r\n
msg['From'] = formataddr(pair=(EMAIL_FROM_NAME, sender)) # 自定义发件人的名称
# msg['To'] = receivers[0] # 发送给receivers里的第一个用户
msg['To'] = ";".join(receivers) # 发送给多个好友
subject = "" # 主题
msg['Subject'] = subject
data = open(filepath, 'rb')
ctype, encoding = mimetypes.guess_type(filepath)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
file_msg = MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close()
encoders.encode_base64(file_msg) # 把附件编码
file_msg.add_header('Content-Disposition', 'attachment', filename="结果.zip") # 修改邮件头
msg.attach(file_msg)
try:
server = smtplib.SMTP(smtp_server)
server.login(username, password)
server.sendmail(sender, receivers, msg.as_string())
server.quit()
print("发送成功")
except Exception as err:
print("发送失败")
print(err)
# if __name__ == '__main__':
# # dirpath 为要压缩的文件夹路径,outFullName为压缩完后要存放的路径
# dirpath = r'.\结果'
# outFullName = r'.\结果\结果.zip'
# zipDir(dirpath, outFullName)
# send_email()
录屏
调用录屏
# 功能:EV录屏自动化操作录制
# 创建时间:{2023/1/9} 13:27
# 开发人: xiaoqiaoBQ
import time
import uiautomation
import os
"""
EV录屏操作类
"""
class ev_screen_recording(object):
"""
ev_install_path : EV录屏安装路径
recording_path : 视频存储路径
"""
def __init__(self, ev_install_path, recording_path):
self.ev_install_path = ev_install_path
self.recording_path = recording_path
"""
开始录屏
"""
def recording_start(self):
os.startfile(self.ev_install_path) # 打开EV录屏
calc = uiautomation.WindowControl(Name="EV录屏")
calc.CheckBoxControl(Name=" 列表").Click()
calc.TextControl(Name="更改默认保存位置").Click() # 更改视频存储路径
calc_1 = calc.WindowControl(Name="选择存储路径") # 弹出框
calc_1.EditControl(AutomationId="1152").SendKeys(self.recording_path) # 视频保存路径
calc_1.ButtonControl(Name="选择文件夹").Click() # 弹出框
calc.CheckBoxControl(Name=" 开始").Click() # 开始录制
"""
录屏结束
"""
def recording_end(self):
os.startfile(self.ev_install_path) # 打开EV录屏
calc = uiautomation.WindowControl(Name="EV录屏")
time.sleep(5)
calc.ButtonControl(Name="停止").Click() # 结束录制
os.system('taskkill /f /im EVCapture.exe') # 关闭EV录屏,直接杀死进程
# test
# a = ev_screen_recording(r".\EVCapture.exe", ".\录屏存储")
# a.recording_start()
# a.recording_end()