使用Python定时执行一任务,自动登录某web系统,生成报表,然后发送邮件给指定人员
一、项目需求
每周从A系统生成一张Excel报表,发送此报表给指定人员,相关人员依据此报表去完成后续的工作。
项目限制:
1、无法通过EDI系统交互的方式从后台读取数据
2、由于公司网络环境限制,不能使用SMTP发送邮件,比如,不能通过smtp.163.com发送邮件
二、解决方案
模拟人工操作,登录系统,输入相应查询条件,生成报表,保存后发送邮件给指定人员。
采用技术:采用Python
三、关键点
1、使用selenium模拟登录浏览器
'使用IE浏览器
driver.webdriver.Ie()
driver.get("http://XXXXX")
'最大化浏览器
driver.maximize_window()
'找到登录账号的组件名
elem=driver.find_element_by_name("tbx_loginEmpNo")
'输入登录账号,假定登录账号是AAAAA
elem.send_keys(u"AAAAA")
’找到登录口令组件
elem=driver.find_element_by_name("tbx_Password")
'假定登录口令是XXXXXX
elem.send_keys(u"XXXXXX")
'点击登录按钮
driver.find_element_by_id("btnSignIn").send_keys(Keys.ENTER)
2、使用pyautogui模拟键盘操作,根据日期输入动态查询条件
'鼠标所在位置的(X,Y)坐标的获得
print(pyautogui.position())
‘可以设定鼠标移动到屏幕上任何位置,以(X,Y)坐标表示
ptautogui.moveTo(x,y,duration=1)
'模拟鼠标左键点击
ptautogui.click(x,y)
’获得当前日期
today=datetime.date.today()
‘无法直接把today输入到屏幕上的文本框里,需要转换成字符串类型
‘这里假定查询从今天往前一周的数据
sBeginDate=(today-datetime.timedelta(days=7)).strftime('%Y-%m-%d')
sEndDate=today.strftime('%Y-%m-%d')
'在往屏幕上文本框里输入日期条件时,先移到指定位置
pyautogui.moveTo(x,y,duration=1)
'点鼠标左键确定输入到文本框里
pyautogui.click(x,y)
'输入动态日期
pyautogui.typewrite(sBeginDate)
这里如果直接在pyautogui.typewrite(today)则会报错,需要把today转换成字符串
3、import win32Com.client as win32
调用Outlook,发送邮件,需要已具备公司内部邮箱账号
参考示例:
outlook=win32.Dispatch('outlook.application')
mail=outlook.CreateItem(0)
receivers=['abc123@163.com;abc234@163.com']
mail.To=receivers[0]
mail.Subject='这是一个测试邮件'
mail.Body="Dear XXX \r\n XXXX \r\n XXXX"
mail.Attachements.Add(‘C:\\aaa.xlsx’) '假设要发的附件在C盘根目录下
mail.Send()
四、定时任务
定时任务的实现是采用Windows系统里的任务,创建一任务,调用一个简单的批处理文件,设置成一周调用一次
文件名: AAA.bat
内容:
@echo off
python C:\work\python\XXXXXX.py
exit