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,  # 避免每次運行把微信數據重置,實機一定要設置此項!!!否則聊天記錄就丟失了

    }

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM