1. 程式人生 > 其它 >Windows定時任務 + Appium實現定時向指定微信群/好友傳送訊息(Android)

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秒。