赞
踩
在写了这么多手机端自动化测试程序后,基于使用的uiautoamtor2,最近,我突然想用Python尝试自动打开企微在上下班时间打卡操作,今天我就来分享一下我的经验和总结。
要想通过Python控制手机APP,目前主要技术如下。
在Android中,官方有一个叫adb的东西,俗称Android 调试桥 (adb)
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。
https://developer.android.com/tools/adb?hl=zh-cn
目前很多Python库的实现都是基于底层adb来实现的,常用的有appium,uiautoamtor2库
Appium和UIAutomator2都是用于自动化测试移动应用程序的工具,但它们在一些方面有所不同:
底层技术:
支持平台:
定位策略:
性能和稳定性:
这里,我们采用uiautoamtor2来实现。具体原理就是Python代码中使用uiautoamtor2库通过adb连接到Android手机,然后uiautoamtor2实现打卡企业微信,点击应用,点击打卡。最后点击屏幕实现打卡操作。
在进行自动打卡操作之前,需要确保环境准备完备,包括安装必要的软件和配置相关的环境变量,以确保程序能够正常运行。
通过在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
为了使自动打卡程序能够顺利执行,需要在手机上进行一些设置,如开启开发者模式、USB调试等,以便将手机连接到计算机并进行操作。将手机通过USB数据线连接到电脑
设置-关于手机-系统版本(点击系统版本5次)
设置-系统和更新-开发人员选项
大部分手机都有锁屏密码,导致自动化程序运行时需要解锁屏幕失败。
共3种方案:
为了演示方便,我直接选择1,让屏幕不休眠。
USB连接电脑时,不要选择仅充电,要选择文件传输模式
在控制台输入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
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的使用。
不过以上程序只是抛砖引玉,还有很多可以优化的地方。例如:
怎么实现定时调度打卡?
怎么实现打卡时间随机范围,例如一直在8:30至9:00之间,避免一个固定的时间点打卡被人发现?
怎么处理节假日不打卡的情况?
打卡成功或失败,怎么通知到自己?
各位看官,如对你有帮助欢迎点赞,收藏。如需继续更新该打卡程序的请关注公众号,联系作者更新哟~
如需要源码请关注公众号【Python魔法师】,后台回复“
企微打卡
”即可获取源码程序和文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。