企业微信自动打卡插件开发

2023-11-17

今日科技快讯

近日中国多家VPN供应商已收到了来自苹果公司的通知,通知主要告知这些供应商和开发者,他们的软件将从中国区App Store下架。对此苹果方面表示,工信部今年早些时候宣布,所有提供VPN服务的开发者必须获得政府的许可,我们被要求移除一些不符合新规定的VPN应用。苹果同时补充道:其它国家/地区的帐单地址的用户将能够继续从App Store中访问这些软件。

作者简介

新的一周开始了,很高兴又跟大家见面了!

本篇来自 splm 的投稿,分享了如何实现公司微信自动化打卡,本文只是分析了技术,并不赞同实际使用! 

思考

需求不容赘述,能找到这个文章的人,估计都心怀鬼胎,哈哈,只希望大家能够从技术的角度看待这个插件,切忌不要做“不好”的事情,年纪都不小了,应该做到是非分明。最后再警告大家,严格律己,遵守公司规章制度。

  • 自动打卡,究竟如何自动化?

实现自动化,定要模拟用户操作,单击,长按,触摸等事件,那么....没错,就需要臭名昭著的 AccessibilityService。

  • 打卡地点,究竟如何模拟?

1. Xposed框架,定位有三种方式,网络,基站和GPS,三者也有优先级,但也可简单粗暴直接拦截系统GPS定位,至于网络,基站定位都给 null。

2. 模拟器,主流的模拟器可以模拟地理位置,开发期间推荐使用模拟器进行调试;

多说一句使用 Xposed 框架,功能异常强大,但调试起来比较烦,虽说自带日志,但时不时就需要来次重启,着实有点闹心。所以在开发过程中,模拟地理位置,只是其中一环,所以为了不影响开发,可以先用模拟器去模拟地理位置,待到打卡功能完善了后再考虑定位的事情,毕竟这由涉及到了 Xposed 插件开发。

开发

了解API

至于 AccessService 如何配置,构造配置这个就不多说了,不是本文重点。如果不会,可以参考这个:

微信抢红包插件

http://blog.csdn.net/dd864140130/article/details/51794318

继承了 AccessService 后,我们需要实现 onAccessibilityEvent 方法,这个方法的意思就是在触发了事件进行回调,至于你想捕捉何种事件,详情参考API,这里只列举在本例使用到的事件:

  • AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:当通知栏发生变化时,也就是当有新通知显示在通知栏时触发;

  • AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:当窗体发生改变时触发,Activity,Fragment 的切换都会触发;

除此之外我们还需要关注 AccessibilityNodeInfo 实例的重要方法:

  • findAccessibilityNodeInfosByText:根据文本查找控件,可能会得到一个集合;

  • findAccessibilityNodeInfosByViewId:根据ID查找控件,会比较精准;

了解WXUI的构造

首先自己去搞一个企业WX的测试账号,成功登录后会进入如下界面:

了解代码

打卡功能是在工作台下的,所以需要先进入打卡模块,但这一系列操作都手动点击就失去了自动化的意义了,因此 AccessService 第一次介入,代码如下:

上述代码就能自动点击工作台按钮,这个代码是我们的核心部分。关于 findTagToClick() 是什么?等下介绍,先说几个需要注意的地方:

这是最重要的,如果想要一个控件响应单击事件,有几种办法?

1. OnClickListener

2. OnTouch() 处理 ActionDown 和 ActionUp 事件。

但重中之重就是该控件的属是 onClickable=true 的也就是可以被点击的,如果该属性为 false,那么辅助服务不能执行单击事件,至少我遇到的是这样。我在开发自动点击工作台这个步骤时,心想只要通过文本内容,拿到指定控件,然后执行单击就可以了。但结果怎样?没有任何反应,原因肯定就是控件没有接收事件,这是我遇到的第一个问题。

多说一句,为何 setOnClickListener 后就看见单击了?

setClickable(true) 原因就在这里。

怎么知道控件是否能响应点击呢?有两个方案:

1. 写递归,判断 node 是否能被点击,如果可以则执行,否则则向上传递,听起来有点像 touch 事件分发的流程;

2. 使用IDE自带工具, Android devic monitor 来看当前 Activity 的UI层级,进入的步骤,以 A.S 为例:Tools->Android->Android Device Monitor。

简单介绍一下 使用 Android Device Monitor 分析UI结构:

我们可以知道"工作台"控件是一个Textview,坐标和 clickable 属性,因为是 false,所以不能执行单击,再找!

查看其父容器,RelativeLayout, clickable=true ,难道是统一给父容器设置的单击事件?再找!

同种方式在查一下 其他tag按钮 的结构,如出一辙,那么很有可能就是将事件统一由其父容器处理。继续我们的开发工作,介绍一下最为关心的方法:

上面的方法都是用来找控件的,基本的循环和判断。

logAllNodeInfo 这个方法,主要是为了遍历某个节点下的控件,便于参考,其实与业务关系不大,但有人会问为啥要加?想要找控件看UI结构,不是可以通过过 Android device monitor 那个工具看嘛。对,的确,但我用这个是为了排查问题,至于何种问题,后面会有介绍。经过上面的代码洗礼,来到下面这个界面:

故技重施,发现"打卡"这个控件,又把事件设置到了父容器上。那么好了,继续完善我们的代码,如下:

截止到这步,当我们启动服务时,如果顺利,就会看到界面在自动执行,直到跳转到下面这个界面:

来到这里,如果想自动打卡,需要怎么做?对,就是获取到打卡的那个控件,然后模拟器操作,是不是再调用一次 findTagToClick("工作台") 就可以了?理论上的确是,但此时这个界面里面有两个“打卡”字样,会查到多个控件,虽然我上面的代码是从查询到的结果集中取第一个 node 元素,但为了避免不必要的麻烦,还是尽量找具备唯一性的文字,那查找包含“次”字样的控件如何?当然可以,至少这个字在当前界面是唯一的,既然考虑到唯一,那为何不用ID,所以

直接传入这个id,但是要注意,不同机器手机这个id可能不一样,所以以最终显示的为准,一定要自己去查,代码如下:

此时运行项目,运行微信,发现界面正常跳转,并成功打卡,非常好!再多试几次,也许会发现问题,就是在打卡界面也就是上图,会出现打卡无效的问题,具体效果就是:从工作台到打卡模块都可以自动完成,十分飘逸,但到了需要单击打卡按钮时,按钮外围的黄色圆圈有时只会转动一次,但不执行打卡业务,再简单点说就是:没打上卡。这究竟是什么问题?当时猜测三个原因:

1. 腾讯做了打卡限制,指定周期内不能连续打卡;

2. 单击动作短促,以至于打卡控件不认为这是一个有效的单击;

3. 代码执行过快,还没有来得及找到对应控件;

在开发中,我们会遇到各式各样,匪夷所思的问题,鉴于这种情况,我个人的方法是将整个流程或者业务的执行过程在脑中过一遍,然后枚举出所以可能出现问题的环节,在依次排除。

#1 尝试几次手动人工连续频度较高的打卡行为,没有发现限制的情况,所以初步排除这个情况;

#2 使用了长按事件,情况依旧;

#3 还记得之前提到过的 logAllNode() 方法吗,这个方法就是在这个阶段加入的,主要是对某节点的控件信息进行输出,对业务没有太多意义,通过对打印日志的分析,发现在渲染打卡界面的时候,会先输出“正在获取管理信息”的 Textview A(速率很快,一闪而过,很容易忽略),然后才会显示打卡控件和其他信息控件,那么可能是在执行 findTagToClick 这个方法时,界面显示的还是 Textview A 控件,所以才没有获取到。那么只要延迟执行即可,我用的是 postDelay,当然这种方式可能还是不够严谨,但排除问题是够用了。代码如下:

再次运行,试了几次正常了,也没有出现异常问题。关于 postDelay 把时间写死这种做法,不够严谨,应该写入一个回调函数,当获取管理信息结束后,执行回调,这时才会精准,当然后续完善。

截止到现在,自动打卡插件的制作,我们已经完成了一多半,现在需要做的就是智能。

1. 定时任务,比如设置早上8点,自动启动应用,并进行打卡。使用的技术肯定是 Alarmmanger,但也有个问题,辅助服务是一个进程,定时任务服务又是另外一个进程,两者如何建立关系?

我没有用IPC,而是用了一个取巧的办法,就是 Notification,用它的理由就是辅助服务有一个监测通知栏变化的方法,前文提到过,那也就是说,只需要任务到期后,创建一个通知,然后辅助服务去监听,捕捉到目标通知做处理就行了呢?

2. 打卡成功后自动退出程序,一个进程,关闭另外一个进程;

想到了一大堆了方法什么finish,kill,exit,但一一试过都不行,那怎么办?只要动用linux命令了,前提是要 su权限,需要 root,也是没有办法的办法。

完善的代码如下:

截止到目前,我们实现的效果就是,设置打卡日期,比如早上8点半,到时后自动启动企业WX,自动执行打卡,完成后退出应用,等待下一次任务执行。很喜庆,再也不用担心早上迟到了罚钱了,因为你总会在那个时间打卡。

总结

整个插件的开发思路很简单,代码也很简单,基础需求已经满足,但如何想要更加智能,就需要花费点精力了。比如,service进程守护,alarm的如何准时执行,更聪明的IPC通信等。虽说都是老生常谈,但还是值得玩玩的,所以给大家留个瞎想的空间。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

企业微信自动打卡插件开发 的相关文章

  • 告诉你外汇交易中心最有可能掉入的九个坑

    一 外汇真能赚钱吗 预期目标多少才算合理 玩外汇的人越来越多 大部分人都是奔着暴利去的 但是现实很残酷 这个市场95 的人都是亏钱的 努力多年都不一定能赚多钱 所以想入坑的人 如果没有足够的经济支撑 不要参与这个残酷的游戏 外汇的难度大于期
  • SQL语句中的条件查询

    条件查询 什么是条件查询 不是将表中所有数据都查出来 而是查询出符合条件的 语法格式 select 字段1 字段2 from 表名 where 条件 具体条件有 lt lt gt gt 或 lt gt between and is null
  • NetCDF文件概要与读写

    NetCDF简介 NetCDF network Common Data Format 即网络通用数据格式 最早是由美国国家科学委员会资助之计划 Unidata 所发展 其用意是在Unidata计划中不同的应用项目下 提供一种可以通用的数据存
  • python抽学号程序_Python编写编程作业批量自动打分程序的思路与实现

    总体思路 把接口明确地告诉学生 本文后面的代码要求学生程序中必须有个函数叫做searchOnede 然后学生把Python程序文件 学号 姓名 py 以任何方式提交给老师 放到同一文件夹中 下面的代码首先由老师编写一个自己认为的最佳和最优实
  • React中的合成事件

    Synthetic Event 合成事件是围绕浏览器原生事件 充当跨浏览器包装器的对象 它们将不同浏览器的行为合并为一个API 这样做是为了确保事件再不同浏览器中显示一致的属性 合成事件的基本操作 基础语法 在JSX元素上 直接基于onXx
  • 【春秋云境】CVE-2022-2073靶场WP和CVE-2022-1014靶场WP

    春秋云境 CVE 2022 2073靶场WP 网站地址 https yunjing ichunqiu com 渗透测试 1 已知提示 Grav CMS 可以通过 Twig 来进行页面的渲染 使用了不安全的配置可以达到远程代码执行的效果 影响
  • 循环神经网络——上篇【深度学习】【PyTorch】【d2l】

    文章目录 6 循环神经网络 6 1 序列模型 6 1 1 序列模型 6 1 2 条件概率建模 6 1 2 代码实现 6 2 文本预处理 6 2 1 理论部分 6 2 2 代码实现 6 3 语言模型和数据集 6 循环神经网络 6 1 序列模型
  • 附答案

    1 什么是机器学习 简单的说 机器学习就是让机器从数据中学习 进而得到一个更加符合现实规律的模型 通过对模型的使用使得机器比以往表现的更好 这就是机器学习 对上面这句话的理解 数据 从现实生活抽象出来的一些事物或者规律的特征进行数字化得到
  • Ubuntu搭建FTP(vsftpd)文件服务器

    前言 在开始介绍ftp服务器如何搭建前 先来介绍一些名词概念 以下名词均和文件服务器有关 SSH Secure Shell ssh是加密的shell 最初是用来替代telnet等无加密的远程登陆 相应的一个服务器是sshd SSL Secu
  • 关于LaTex下插入的图片排列问题及图片与文本排列问题

    begin figure tb centering setlength abovecaptionskip 0pt setlength belowcaptionskip 0pt subfigure show Fig 1 label subfi
  • uboot下的mw写内存和md显示内存命令以及nand命令

    配置uboot参数 setenv ipaddr 192 168 0 10 setenv serverip 192 168 0 40 setenv gatewayip 192 168 0 1 setenv netmask 255 255 25
  • Linux 实操篇(CentOS7)

    关于Shell shell 可看作命令解释器 bin sh 命令 shell命令入口 uinx解释执行的程序 bourne shell 处理和用户的交互比较差一点 后来Linux在此基础上发展出bash shell bourne again
  • 初学stm32-库函数开发步骤及总结

    stm32库函数开发 一 外设常具备的几类寄存器 二 控制外设的常见操作 三 外设的初始化 四 数据传送 五 状态检查与清除 六 外设函数分类 一 外设常具备的几类寄存器 控制寄存器xxx CR Control Configuration
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • 日常错误整理

    DOMException Failed to execute setItem on Storage Setting the value of widgetCacheData exceeded the quota 在使用sessionStor
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • MyBatis一对多,多对一,多对多

    MyBatis中的一对多和对多一 多对多 主要就是resultMap中 association 关联 一个复杂的类型关联 许多结果将包成这种类型 多对一 嵌套结果映射 关联本身可以是一个 resultMap 元素 或者从别处引用一个 col
  • unity的UI元素层级调整的方法

    UI的渲染层级决定了最终显示效果 先渲染的在底层 后渲染的上层 层级按照如下优先级确定 相机深度 通过Camera控件中的Depth属性设置 值越大的后渲染 Canvas的Sorting Layer 约靠下的后渲染 Canvas的Order
  • 最适合 IoT标准化的许可证是哪一个?

    本文翻译至 http readwrite jp infrastructure 32485 IoT 是今年的技术趋势之一 该领域的潜力是相当大的 但是 关于 规格 依然是四分五裂缺乏统一感 最近可以看到世界已经迈出了标准化的一大歩 到现在为止
  • CocosCreator实战篇 |CocosCreator实现《飞机大战》

    博客主页 肩匣与橘 欢迎点赞 收藏 留言 如有错误敬请指正 本文由肩匣与橘编写 首发于CSDN 生活依旧是美好而又温柔的 你也是 飞机大战 前言 一 素材准备 二 场景搭建 背景 主角战斗机 敌方战机生成点 分数UI 副摄像机 三 脚本编写

随机推荐

  • 空余时间在家做短视频剪辑,一部手机就能搞定,0基础新手也能做

    新手小白刚进去短视频自媒体领域 0粉丝想赚钱就要选一个发布内容有播放量就有收益平台去操作 刚开始可能收益不高 但你坚持做下去 就会跟半途放弃的人不一样 今天大周就说一说具体步骤 该怎么去做 一 选择平台 选择一个有播放量就有收益的平台 今天
  • 【⑬MySQL

    前言 欢迎来到小K的MySQL专栏 本节将为大家带来MySQL数据类型简介 整数 浮点 定点 时间 日期类型的分享 目录 前言 0 数据类型简介 1 整数类型 2 浮点类型 3 定点类型 4 日期 时间类型 总结 0 数据类型简介 数据类型
  • 数论函数(一)

    转载请标明出处 目录 转载请标明出处 1 前言 2 数论函数介绍 2 1加性函数 2 1 1加性函数的性质 2 1 2一些加性函数的例子 2 2积性函数 2 2 1积性函数的性质 2 1 2一些积性函数的例子 2 3数论函数的重要操作 2
  • 原码、反码、补码的运算及在计算机中的作用

    一 概念简述 机器码 一个数在计算机中的二进制形式 机器码是带符号的 在计算机用机器码的最高位存放符号 正数为0 负数为1 如 0000 0011 和 1000 0011 机器码的真值 机器码除符号位剩下的真正数值 如 0000 0001的
  • python如何模拟键盘输入_python模拟鼠标点击和键盘输入的操作

    所有代码都是网上百度出来的 通过个人实践找到适合自己的 采用的python 库是 pymouse pykeyboard 安装时直接pip安装的 pip install PyUserInput 实现了一个最简单的输入密码 enter进入的登录
  • 四分位数与pandas中的quantile函数

    四分位数与pandas中的quantile函数 1 分位数概念 统计学上的有分位数这个概念 一般用p来表示 原则上p是可以取0到1之间的任意值的 但是有一个四分位数是p分位数中较为有名的 所谓四分位数 即把数值由小到大排列并分成四等份 处于
  • Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)

    文章目录 1 前言 2 绘制交互式散点图 3 定制图表主题 4 增强数据可视化的交互性与注释 步骤1 步骤二 5 结语 1 前言 在上一篇博文 Streamlit 讲解专栏 十 数据可视化 图表绘制详解 上 中 我们学习了一些关于数据可视化
  • AI绘画是艺术还是技术?AI绘画会让插画师集体失业?

    今年以来 AI绘画的讨论热潮此起彼伏 过一段时间就会引起争议和恐慌 就在近日 日本推出一款名为mimic的AI绘画软件 被日本绘画圈集体声讨 许多画师公开禁止AI绘画 恰巧最近美国艺术圈里关于AI绘画也发生了一件大事 一副 数字绘画 作品获
  • day2 poc与exp学习之pikachu字符注入

    exp编写 这里以基于联合注入的exp为例子 1 全局变量 对数据存储以及http包头的自定义 url http 192 168 110 131 pikachu master vul sqli sqli str php 要验证注入点的url
  • IBM《智慧数据中心》

    部分内容摘要 IBM认为 数据中心的发展路径是从成本中心演变成为服务中心 其功能也从支撑业务发展到驱动业务 并进一步成为业务创新的加速器 未来数据中心将是智慧的 绿色的 灵活支撑业务发展的 实现监控可视化 控制自动化 管理流程化 信息系统从
  • 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

    目录 试题 A 日期统计 本题总分 5 分 试题 B 01 串的熵 本题总分 5 分 试题 C 冶炼金属 本题总分 10 分 试题 D 飞机降落 本题总分 10 分 试题 E 接龙数列 本题总分 15 分 试题 F 岛屿个数 本题总分 15
  • node.js express 文件服务器,如何用nodejs+express搭建一个简单的后台服务器?

    Express框架 根据官方的介绍 Express是一个基于Node js平台 快速 开放 极简的Web开发框架 安装 Express是一个基于Node js的平台 所以在安装Express之前 你得先确保你已经安装了Node js 打开命
  • 计算1到10的阶乘之和:1!+2!+3!+......+10!(C语言&&Python)

    计算1到10的阶乘之和 1 2 3 10 C语言 include
  • Java 文件上传 三种方式

    一 配置springBoot上传文件限制 spring servlet multipart max file size 100MB 单个文件大小 max request size 1024MB 总文件大小 二 代码 import org s
  • 【LVGL 学习】样式(style)过渡动画学习

    transition 过渡动画 当一个控件的状态发生改变时 可以让样式也发生变化以提醒用户 通过过渡动画 transition 可以让样式的改变更自然 例如 按钮在点击时 以及开关在切换时 都具有一小段的过渡动画 过渡动画使用 lv sty
  • Vue手动控制点击事件Click触发

    方法一 变量的值 触发函数 方法二 利用变量控制css样式设置其pointer event none
  • Dynamics 365 for Sales: Email Engagement

    今天我们来看看和电子邮件相关的新功能 Email Engagement 这个功能是用来跟踪电子邮件的反馈状态 非常适合做邮件营销的公司 在做邮件营销的时候 我们会对发出去的邮件进行反馈统计 例如 多少邮件被查看了 有多少邮件被回复了 有多少
  • 微信小程序:css弹出菜单+多语言切换功能

    如何用css写出弹出菜单效果以及它的使用 1 核心知识点 2 实现效果 3 注意点分解 4 代码源码 5 写在最后 1 核心知识点 1 弹出菜单 animation动画 transform属性 2 语言切换功能 点击事件函数catchtap
  • tar解压文件到指定目录出现Not found in archive

    使用tar解压文件到指定目录时出现Not found in archive是因为没有设置 C这个参数 create 解压后的文件只有 通过设置 C 注意要大写 这个参数 创建默认文件夹才能被成功解压 如需要把home目录下的 jdk 8u1
  • 企业微信自动打卡插件开发

    今日科技快讯 近日中国多家VPN供应商已收到了来自苹果公司的通知 通知主要告知这些供应商和开发者 他们的软件将从中国区App Store下架 对此苹果方面表示 工信部今年早些时候宣布 所有提供VPN服务的开发者必须获得政府的许可 我们被要求