Windows定時任務 + Appium實現定時向指定微信群/好友傳送訊息(Android)
一、準備工作
1、下載並安裝所需軟體。
(1) Python 3.x (本文利用Python寫指令碼)
(2) Appium
(3) Appium Inspector (便於獲取微信App元素ID)
(4) 您還需要Android SDK、ADB、JDK8。
2、通過Windows終端 / CMD 執行pip install appium-python-client,如下圖所示。
二、配置環境變數、Appium Server
安裝好Appium後執行,出現了下圖介面。
這裡將Host設定為127.0.0.1,Port設定為4723,並點選紅框處Edit Configurations。
點選後設置兩個環境變數的位置。這裡由於博主沒有配置ANDROID_HOME環境變數,需要對該變數設定。而JAVA_HOME已經配置過,所以這裡已經自動填寫。
三、開啟手機的USB安裝、USB除錯
本文使用真機,對真機而言,需要開啟開發者選項中的USB安裝、USB除錯。
對於MIUI,開發者選項開啟的方式為:設定->我的裝置->全部引數->連續點選MIUI版本。其它定製UI、(類)原生開啟方式類似。
開啟開發者選項後,在設定->更多設定->開發者選項中開啟如下圖中的三個許可權。
四、測試能否開啟微信App
編寫如下Python程式碼:
from appium import webdriver desired_caps = { "platformName": "Android", # 作業系統 "deviceName": "Xiaomi Redmi K30 Pro", # 裝置 ID "platformVersion": "11", # Android版本號 "appPackage": "com.tencent.mm", # app 包名,這裡是微信 "appActivity": "com.tencent.mm.ui.LauncherUI", # app 啟動時主 Activity 'noReset': True, # 避免每次執行重複安裝appium相關安裝包 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
開啟Appium的Server,用資料線連線手機至電腦,然後執行上述程式碼。第一次執行時,會在手機上安裝Appium的相關應用,對於MIUI,需要在手機亮屏時允許USB安裝操作。
如果手機自動打開了微信主介面,說明上述步驟均配置正確。
五、Appium Inspector的使用
1、配置Appium Server與本文第二部分一致。
注意:本文使用的Appium Server是1.x,Remote Path應改為/wd/hub。(參見Appium Inspector文件)
2、配置引數
配置與本文第四部分程式碼相同的platformName、deviceName等引數。由於博主只連線了一臺裝置,只在platformName填寫了Android。如下圖。
填完後點擊右下角的Start Session。
注意:如右下角沒有Start Session,是視窗顯示不全,請最大化視窗後向下滑動滑鼠滾輪。
3、使用Appium Inspector抓取元素ID
首先要在確保Appium Server已經啟動的基礎上開啟Appium Inspector,用資料線將手機連線到電腦。手機端設定前文已詳細描述。得到了如下圖所示的介面。
可以發現,手機螢幕已經在軟體介面左半部分出現;可以選擇介面中的元素,將滑鼠划動到對應位置,其會變為黃色,如上圖中標①處。當手機介面有變化時,單擊上圖②處重新整理。
單擊要抓取的元素,會在介面右側顯示出對應的ID,如下圖所示。
六、向指定微信群傳送訊息功能的實現
可以用以下思路實現:
(模擬)點選【搜尋】按鈕 -> (模擬)在【搜尋框】輸入指定微信群/好友 -> (模擬)點選【搜尋結果】 -> (模擬)在【訊息文字框】輸入要傳送的文字 -> (模擬)點選【傳送按鈕】
思路中方括號部分為需要抓取的ID。
Appium通過ID獲取指定元素可用driver.find_element_by_id(),引數為ID字串,一些早期的教程也呼叫這個方法。但這是一個被標記過時的方法,如使用會有警告。新的用法如下:
首先需要匯入如下包:
from selenium.webdriver.common.by import By
呼叫示例:
driver.find_element(By.ID,'com.tencent.mm:id/j63')
此外,由於手機開啟微信、執行每步操作需要時間,在執行每步操作時,sleep一定時間。開啟微信的時間較長,可以將時間設定略長些。使用sleep需要匯入:
from time import sleep
在本文第四部分的基礎上,匯入上述兩個包,編寫程式碼如下。
#等待微信載入
sleep(10)
#取搜尋圖示的ID並模擬點選
driver.find_element(By.ID,'com.tencent.mm:id/j63').click()
sleep(2)
#取搜尋框的ID並模擬輸入,將xxx替換為需要傳送的群/好友,確保結果顯示在第一行
driver.find_element(By.ID,'com.tencent.mm:id/cd6').send_keys('xxx')
sleep(2)
#取搜尋框第一條結果
driver.find_element(By.ID,'com.tencent.mm:id/kpx').click()
sleep(2)
#取文字框的ID並模擬輸入,將xxxx替換為需要傳送的內容
driver.find_element(By.ID,'com.tencent.mm:id/b4a').send_keys('xxxx')
sleep(2)
#取傳送按鈕的ID並模擬點選
driver.find_element(By.ID,'com.tencent.mm:id/b8k').click()
#10秒後退出
sleep(10)
driver.quit()
重要提示:您的ID可能並不與上述程式碼ID相同。請根據您實際抓取的ID作為引數。
在手機未鎖屏狀態下,執行指令碼測試。
七、自動解鎖
細心的讀者可注意到,上文要求在手機未鎖屏狀態下操作,而一般情況下無法保證手機一直亮屏。Appium提供了自動解鎖的功能,只需要在desired_caps新增如下引數:
"unlockType":"pinWithKeyEvent",
"unlockKey":"1234"
unlockType是密碼種類,支援如下五種方式(PIN、密碼、圖案、指紋、帶KeyEvent的PIN):
['pin', 'password', 'pattern', 'fingerprint', 'pinWithKeyEvent']。
unlockKey是密碼。
對於指紋,只在Android 6.0以上模擬器可用。對於圖案,用1~9分別依次表示9個點(先從左到右,再從上到下。)
對於原生Android,一般用前四種就可以了。但對於MIUI等定製UI,則可能需要使用pinWithKeyEvent解鎖。
實測pinWithKeyEvent可用,但也並非一次即可解鎖,有時需要嘗試三次。
由於Appium還是以適配原生Android為主,通過實際測試,對MIUI來說,pinWithKeyEvent是合適的方法。另外,如果設定了指紋解鎖,在Appium自動解鎖後會自動把指紋資料刪掉,很是無奈。
儘管有些缺憾,仍然可以實現基本的自動解鎖功能,從而避免手動操作解鎖。
八、設定定時任務
至此,距需求只差“定時”。
首先要建立一個批處理指令碼。指令碼程式碼很簡單,呼叫Python執行程式碼檔案,如:
C:/Python310/python.exe c:/Users/xwwyt/wx.py
Windows提供了定時任務功能,開啟“任務計劃程式”,如下。
然後右擊任務計劃程式庫,選擇“新建基本任務”。在彈出的視窗中填寫名稱和描述,單擊下一頁,觸發器選擇每天,並設定定時時間,操作選擇執行程式。程式位置填寫批處理指令碼儲存的位置,然後點選完成即可。如下圖所示。
至此,實現完成。觀察設定的時間是否會向微信傳送資訊。需要注意的是,由於執行指令碼、手機啟動、自動解鎖、模擬控制均需要一定的時間,建議將定時設定為早於期望時間30~45秒。