一、項目需求
每周從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