• 简书网微信公众号二维码
您当前的位置: 首页 > 知识百科 > 微信自动打卡如何实现?有什么好的方法?

微信自动打卡如何实现?有什么好的方法?

时间:2023-07-01 14:05 阅读数:124 人阅读 分类:知识百科

  现在有很多的企业也使用了企业微信,很多企业都使用了微信打卡,但是你知道微信自动打卡如何实现吗?很多微信用户问我微信自动打卡如何实现了?下面小编就带你了解一下微信自动打卡如何实现。希望小编的内容对你有所帮助。

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

  开发

  了解API

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

  微信抢红包插件

  blog.csdn/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 事件分发的流程;

  使用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 那个工具看嘛。对,的确,但我用这个是为了排查问题,至于何种问题,后面会有介绍。经过上面的代码洗礼,来到下面这个界面:

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

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

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

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

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

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

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

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

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

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

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

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

  你会经常的使用微信打卡吗?你知道微信自动打卡如何实现了吗?通过小编以上的内容,你应该知道了微信自动打卡如何实现了吧?希望小编的内容对你有所帮助,如果需要了解更多信息,请关注微微风,我们将为你提供最新最全面的信息。

  推荐阅读:

  企业微信应该如何检测打卡手机信息?

  求助!企业微信怎么伪装打卡?

  企业微信打卡怎么作弊?