Python實現企業微信上下班自動打卡程式

Python魔法师發表於2024-03-08

一、介紹

在寫了這麼多手機端自動化測試程式後,基於使用的uiautoamtor2,最近,我突然想用Python嘗試自動開啟企微在上下班時間打卡操作,今天我就來分享一下我的經驗和總結。

二、技術原理

要想透過Python控制手機APP,目前主要技術如下。

2.1、Android體系

在Android中,官方有一個叫adb的東西,俗稱Android 除錯橋 (adb)

​Android 除錯橋 (adb) 是一種功能多樣的命令列工具,可讓您與裝置進行通訊。adb 命令可用於執行各種裝置操作,例如安裝和除錯應用。

https://developer.android.com/tools/adb?hl=zh-cn

adb.png

目前很多Python庫的實現都是基於底層adb來實現的,常用的有appium,uiautoamtor2庫

appium和uiautoamtor2的區別

Appium和UIAutomator2都是用於自動化測試移動應用程式的工具,但它們在一些方面有所不同:

  1. 底層技術

    • Appium:是一種跨平臺的移動應用程式自動化工具,它使用WebDriver協議來與移動裝置通訊,從而實現對iOS和Android應用程式的自動化測試。它可以使用多種程式語言(如Java、Python、JavaScript等)進行編寫測試指令碼。
    • UIAutomator2:是Google提供的用於Android平臺的自動化測試框架。它是Android Testing Support Library的一部分,能夠直接與Android系統互動,因此可以提供更多的系統級別的操作和功能。
  2. 支援平臺

    • Appium:支援iOS和Android平臺,可以在不同的裝置和作業系統版本上執行。
    • UIAutomator2:僅支援Android平臺,不能用於iOS應用程式的自動化測試。
  3. 定位策略

    • Appium:可以使用多種定位策略,包括XPath、ID、名稱、類名等。
    • UIAutomator2:使用基於Android UI層次結構的定位策略,可以直接定位應用程式中的UI元素。
  4. 效能和穩定性

    • Appium:由於是跨平臺的,因此可能在某些情況下效能略低於UIAutomator2。此外,由於Appium需要使用WebDriver協議與移動裝置通訊,可能會導致一些效能和穩定性問題。
    • UIAutomator2:作為Android官方提供的測試框架,通常可以提供更好的效能和穩定性,特別是在與Android系統進行互動時。

這裡,我們採用uiautoamtor2來實現。具體原理就是Python程式碼中使用uiautoamtor2庫透過adb連線到Android手機,然後uiautoamtor2實現打卡企業微信,點選應用,點選打卡。最後點選螢幕實現打卡操作。

三、環境準備

在進行自動打卡操作之前,需要確保環境準備完備,包括安裝必要的軟體和配置相關的環境變數,以確保程式能夠正常執行。

3.1、在電腦上安裝ADB工具,並配置環境變數

透過在https://developer.android.com/tools/adb?hl=zh-cn頁面中,根據頁面中文提示,進行安裝ADB,然後記得一定配置ADB的環境變數。

我的環境變數配置

# Android SDK
export ANDROID_HOME=/Users/find/android/android-sdk-macosx

當安裝並配置完成後,在控制檯輸入adb,如果出現如下資訊表示adb環境配置完成

➜  ~ adb
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as /Users/find/android/android-sdk-macosx/platform-tools/adb

3.2、手機設定

為了使自動打卡程式能夠順利執行,需要在手機上進行一些設定,如開啟開發者模式、USB除錯等,以便將手機連線到計算機並進行操作。將手機透過USB資料線連線到電腦

3.2.1、開啟Android手機的開發者模式

設定-關於手機-系統版本(點選系統版本5次)

android1.png

3.2.2、開啟USB除錯模式

設定-系統和更新-開發人員選項

android2.png

3.2.3、保持喚醒狀態

大部分手機都有鎖屏密碼,導致自動化程式執行時需要解鎖螢幕失敗。

共3種方案:

  1. 開發者模式裡設定保持喚醒狀態,則螢幕一直常亮,不會鎖屏,等不除錯程式的時候再關閉即可。
  2. 取消螢幕鎖屏密碼
  3. 將鎖屏密碼直接寫入程式碼裡

為了演示方便,我直接選擇1,讓螢幕不休眠。

android3.png

3.2.4、選擇USB配置

USB連線電腦時,不要選擇僅充電,要選擇檔案傳輸模式

android4.png

在控制檯輸入adb devices,來獲取已經連線到的手機裝置id

➜  ~ adb devices
List of devices attached
SNU0220A15007866	device

記住這個SNU0220A15007866,它相當於你手機的唯一識別碼,接下來會用到。

四、程式碼編寫

編寫自動打卡程式的關鍵是編寫程式碼,透過Python程式語言結合uiautomator2庫來實現自動化操作,包括登入企業微信、定位打卡按鈕、模擬點選等功能的實現。

新建Python,並安裝uiautoamtor2庫,pip install uiautomator2

(venv) ➜  qw_punch_card pip install uiautomator2
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting uiautomator2
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/5f/b9/7607bd0512d266336929b80006ef2eeef870d978a16427d052215ec5c809/uiautomator2-2.16.25-py3-none-any.whl (3.1 MB)
Collecting six
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting Pillow
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/4f/d3/5b5682b498805c06b900cdd778b649a4132162b17da674a1fef56da56a77/pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl (3.5 MB)
Collecting requests>=2
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl (62 kB)
Collecting lxml>=4.3
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/97/a8/92d88fe22b8caccdb0c1ff099e5ef90052b058b42671e69986e2262faa1f/lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl (4.8 MB)
     |██████████████████▌             | 2.8 MB 1.2 MB/s eta 0:00:02

新建punch_card.py檔案

獲取企微PackageName和ActivityName

package_name = "com.tencent.wework"
activity_name = "com.tencent.wework.launch.LaunchSplashActivity"

連線到裝置
d = u2.connect("SNU0220A15007866")

開啟應用

# 企業微信應用包資訊
package_name = "com.tencent.wework"
activity_name = "com.tencent.wework.launch.LaunchSplashActivity"

# 開啟應用
print(d.info)
d.app_stop(package_name)
d.app_start(package_name, activity_name, wait=True)

開啟工作臺

print("啟動企業微信成功")
d(text=u"工作臺").click()

上班打卡

這裡假設上班打卡時間是8-9點

if 8 < datetime.now().hour < 9:
    if d(text=u"你已在打卡範圍內").info['text'] == "你已在打卡範圍內":
        print("現在是上午")
        d(text=u"上班打卡").click()
        time.sleep(3)
        print(f"{TimeUtil.curr_date()} : 上班打卡成功")

下班打卡

這裡假設下班打卡時間是18-19點

if 18 < datetime.now().hour < 19:
    if d(text=u"你已在打卡範圍內").info['text'] == "你已在打卡範圍內":
        print("現在是下午")
        d(text=u"下班打卡").click()
        time.sleep(3)
        print(f"{TimeUtil.curr_date()} : 下班打卡成功")

打卡完成後,退出企業微信,返回桌面

# 返回桌面
time.sleep(1)
os.popen("adb shell input keyevent 3")
time.sleep(1)
os.popen("adb shell am force-stop com.tencent.wework")
time.sleep(1)

總結

透過以上程式碼,就實現了自動上下班打卡操作,本文主要介紹了adb和uiautoamtor2的使用。

不過以上程式只是拋磚引玉,還有很多可以最佳化的地方。例如:

  1. 怎麼實現定時排程打卡?
  2. 怎麼實現打卡時間隨機範圍,例如一直在8:30至9:00之間,避免一個固定的時間點打卡被人發現?
  3. 怎麼處理節假日不打卡的情況?
  4. 打卡成功或失敗,怎麼進行通知到自己?

各位看官,如對你有幫助歡迎點贊,收藏。如需繼續更新該打卡程式的請關注公眾號,聯絡作者更新喲~

如需要原始碼請關注公眾號【Python魔法師】,後臺回覆“企微打卡”即可獲取原始碼程式和文件。

qrcode.jpg

相關文章