控制飞书客户端自动发邮件
自動化飛書郵箱網(wǎng)頁版應(yīng)該有不少例子,可以使用Clicknium、Selenium,Playwright這些工具實現(xiàn)。這次使用[Clicknium](https://www.clicknium.com/)來介紹一下桌面客戶端的自動化,進一步講解如果利用Python實現(xiàn)桌面端自動化。想要寫一個能穩(wěn)定運行的自動化腳本,并不容易,過程中需要不停修正定位數(shù)據(jù)。很多時候,我們看到腳本的結(jié)果,但很少有教程描述,腳本是怎么一步一步寫出來的。
首先,我們要明確自動化的需求。舉一個最簡單的場景:群發(fā)郵件。與過年群發(fā)祝福消息類似,想要別人不知道這則消息是群發(fā)的,就需要在消息中帶上對方獨特的屬性,比如名字等。現(xiàn)在不少提供模板方式群發(fā)郵件的服務(wù)都是收費的。其實我們使用Python+Clicknium的方式可以很快實現(xiàn)一個根據(jù)模板群發(fā)郵件的程序。
有了需求,我們需要理清楚實現(xiàn)自動化的基本步驟:
1. 材料:郵件模板
2. 材料:郵箱列表和模板填充數(shù)據(jù)
3. 操作:將模板填充數(shù)據(jù),填入郵件模板中
4. 操作:用飛書客戶端將填充數(shù)據(jù)后的模板,根據(jù)郵箱地址發(fā)送出去
下面是簡單的樣例:
郵件模板(sample.txt):
其中{name}就是一個占位符(placeholder),在實際郵件中會被詳細信息中的userName替換掉。?
郵箱列表(user.csv):
| xxx@gmail.com | Jack |
| xxx@qq.com | HuaHua Wong |
準備環(huán)境:
- Windows 7 SP1+?
- VS Code
- Clicknium: 參考 quick start?, 不在此詳述
- 飛書
下面我們詳細描述怎么把這個sample一步一步做出:
1. Python啟動飛書:
?
2. 點擊郵箱按鈕,進入飛書郵箱,新建郵件:
在這一步,為了方便我將郵箱從更多列表中拖入左側(cè)任務(wù)欄中,并放置在第五個。
利用抓取按鈕,點擊上圖的郵箱圖標,抓取按鍵。
抓取后我們可以在locator store中看到剛抓取的UI元素
從上圖中可以看到,Clicknium利用上面的屬性來定位元素。大概看一下,其中最重要的應(yīng)該是第九行。 index=6 最終定位了這個按鈕的位置。還可以得到的信息是,獲取元素位置采用了UIA技術(shù),按鈕的name屬性為空,意味著飛書團隊并沒有給改按鈕命名,我們無法通過name標識這個按鈕。index并不是固定的,隨意拖動郵箱圖標都會導(dǎo)致index位置變化。但是這個方式比較高效,如果該腳本需要給別人使用,我們可以采用圖像識別的方式。可以通過上圖的Validation確定能不能定位到元素,通過Action嘗試點擊操作是否能成功。
補充上面的代碼:
這部分代碼中,引入了clicknium庫,通過locator.feishu.mailbutton可以定位到郵箱圖標,對其點擊操作。clicknium通過將locator傳入find_element()函數(shù)就找到對應(yīng)的UI元素,然后直接對其進行操作。通過F5運行,看是否能夠成功執(zhí)行。運行成功飛書會打開一個新的窗口,如下圖:
第一步,抓取收件人輸入框。Recorder在auto配置下得到下圖的locator:
在auto檔捕獲技術(shù)下使用的是UIA技術(shù),點擊validation可以找到元素,點擊action-->set_text失敗。看來UIA技術(shù)還需要調(diào)優(yōu),我們點擊Recapture嘗試使用IA技術(shù)。
切換IA技術(shù)后得到上圖的locator,確認Validate和Action都能成功運行。同樣的方式,我們抓取下圖的主題\正文和發(fā)送按鈕。
文本處理
郵件模板放在項目根目錄中的sample.txt文件中,簡單用Python直接讀取數(shù)據(jù)即可。
然后讀取csv文件中的郵箱和用戶名信息:
定一個發(fā)送郵件的函數(shù),接受模板內(nèi)容、郵箱和用戶名:
實現(xiàn)sendMail方法
發(fā)送有郵件的函數(shù)步驟:
1. 用戶名替換模板placeholder(文本處理)
2. 點擊寫新郵件的按鈕(click)
3. 填寫收件人郵箱地址(click)
4. 填寫郵件主題(set_text)
5. 填寫郵件內(nèi)容(set_text)
6. 點擊發(fā)送按鈕(click)
實現(xiàn):
def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.recipient).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click') ??paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click() def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.recipient).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click') ??paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click()
第一行對用戶名做一個簡單的處理,去掉特殊字符,首字母大寫等。第二行用文本替換,處理模板占位符。
之后點擊飛書客戶端寫新郵件的按鈕?之后我們填寫收件人:
點擊查看set_text函數(shù),或者查函數(shù)文檔
從描述中可知,clicknium提供三種輸入文本的方法。set-text是系統(tǒng)調(diào)用,性能是最好的,直接將一段文本設(shè)置上去,但不是所有場景都可用。sendkey-after-click和sendkey-after-focus是采用模擬鍵盤輸入的方法,主要解決的就是點擊或設(shè)置關(guān)注后才激活的問題,簡單說來就是模擬鼠標和鍵盤,所以字母也是一個一個敲進去的,消耗的實際就比較長。這里我們采用sendkey-after-click。
在設(shè)置完郵件主題后,發(fā)現(xiàn)郵件這個彈框上的文本會根據(jù)主題變化,會對定位彈框有影響,我們檢查locator store中的locator對其進行一定的泛化處理。
打開郵件文本的locator:
通過locator中的配置信息, 可以看到發(fā)件人, 郵件主題,收件人這些信息都用來幫助定位元素了。這就意味著,其中任何一項信息發(fā)生變化,很可能就無法定位元素了。郵件主題,發(fā)件人, 收件人發(fā)生變化就無法使用的話,泛化能力就太差了,自動化腳本的可用性和穩(wěn)定性都會大大降低。Clicknium Locator中的配置信息是可以直接修的,也提供了一些方式解決泛化的能力:
-
每一項配置前都有一個check box。取消勾選,這項配置就不參與定位。對于特殊元素,如果在定位中不起決定性作用,可以嘗試取消勾選,使用validation和action測試是否依然有效。
-
如果配置中只有部分內(nèi)容參與定位,尤其是位于配置的頭尾,我們可以直接選中,在右側(cè)修改配置信息。刪除特殊內(nèi)容,測試是否有效。
-
通配符:可在配置中使用通配符
-
正則表達式:可在配置中使用正則表達式
-
變量 :可在配置中使用變量?可以在文檔中查看parametric locator章節(jié)
去掉與郵件主題,發(fā)件人,收件人相關(guān)的配置,就能提高泛化能力,使用不同賬號給不同的人發(fā)送郵件了。 郵件主題可以采用變量的方式配置。
在郵件正文locator的配置中,我們發(fā)現(xiàn)其定位到的是一個group,并不是edit,我們模擬鼠標鍵盤輸入的方式,一個按鍵一個按鍵點擊的速度是比較慢的?所以我們采用復(fù)制張貼的方式,將文本內(nèi)容寫入剪貼板,然后利用粘貼功能寫入文本。這里需要利用pyperclip庫,使用pip install pyperclip安裝利用下面的函數(shù)使用張貼功能:
def paste_text(webEle:UiElement,text:str):webEle.send_hotkey('^a',preaction="click")webEle.send_hotkey('^x',preaction="click")pyperclip.copy(text)webEle.send_hotkey('^v',preaction="click")最后點擊發(fā)送按鈕即可。
下面是完整代碼:
Github: Feishu Mail
from clicknium import clicknium as cc, locator,UiElement import subprocess import csv import pyperclipdef main():process = subprocess.Popen("C:\\Users\\kay\\AppData\\Local\\Feishu\\Feishu.exe") #replace with your feishu.exe pathcc.find_element(locator.feishu.mailbutton).click()f = open(r".\sample.txt")mailtxt = f.read()with open('user.csv') as f:f_csv = csv.DictReader(f)for u in f_csv:sendMai(u['email'],u['username'],mailtxt)def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)print("email:",mail," name:",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.edit_ia).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click') paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click()def getName(userName):return userName.split(",")[0].split("@")[0].split(" ")[0].split(".")[0].capitalize()def paste_text(webEle:UiElement,text:str):webEle.send_hotkey('^a',preaction="click")webEle.send_hotkey('^x',preaction="click")pyperclip.copy(text)webEle.send_hotkey('^v',preaction="click")if __name__ == "__main__":main()總結(jié)
以上是生活随笔為你收集整理的控制飞书客户端自动发邮件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 判断应用是否安装,一个判断oic
- 下一篇: 计算机配置管理模板怎么重装,电脑重装与功