一、准備工作
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, # 避免每次運行把微信數據重置,實機一定要設置此項!!!否則聊天記錄就丟失了
}
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 appium.webdriver.common.mobileby import MobileBy as 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提供了定時任務功能,打開“任務計划程序”,如下。
然后右擊任務計划程序庫,選擇“新建基本任務”。在彈出的窗口中填寫名稱和描述,單擊下一頁,觸發器選擇每天,並設置定時時間,操作選擇運行程序。程序位置填寫批處理腳本保存的位置,然后點擊完成即可。如下圖所示。
至此,實現完成。觀察設置的時間是否會向微信發送信息。需要注意的是,由於執行腳本、手機自動解鎖、啟動App、模擬控制均需要一定的時間,建議將定時設置為早於期望時間30~45秒。