Python实现企业微信自动打卡程序一:基础上下班打卡

一、介绍

在写了这么多手机端自动化测试程序后,基于使用的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

posted @ 2024-03-08 14:29  Python魔法师  阅读(819)  评论(0编辑  收藏  举报