如何写一个自动抢微信红包的程序

      春节临近,为避免错失土豪们的红包,动手写了一个自动抢微信红包的小程序,试了一下效果还不错。本程序适用于安卓4.1版本以上手机,不需要ROOT权限。现将程序的设计要点记录如下,供有兴趣的同行参考。

一、基本原理

目前网上已经有很多款自动抢红包软件,其基本原理都是一致的,都是实现一个Accessibility Service(即“辅助服务”),捕捉手机的通知栏变动事件、窗口切换事件、窗口内容变动事件,在收到微信红包通知消息时自动转到微信页面,搜索到红包节点,模拟点击操作。抢到红包后,再搜索“拆红包”节点,打开红包,取出红包金额。

由于一个完整的发现红包、抢红包、拆红包流程需要10秒左右,而各种事件是以毫秒级的速度在不断触发,因此此类程序的核心问题是维护好一个全局的抢红包状态转换图,处理好各个事件处理任务的并发控制和相互协调,避免因状态走错而导致程序运行不稳定的情况。

二、主要流程

自动抢红包动作由两种场景触发:(1)发现一个微信红包消息通知;(2)在当前微信聊天页面发现一个新红包。两种场景的处理流程大体一致,现将新通知消息触发的抢红包流程说明如下。

 

三、状态转换

鉴于整个抢红包流程耗时较长,本程序维护了一个全局的状态变量(供有七种状态),以控制任务流程,同时维护了一个全局的等待队列,以存放在此期间到达的新红包。对于由新通知消息触发的抢红包流程,其状态转换如下图所示。

 

四、关于红包唯一性识别

抢红包程序的一个重要问题是鉴别红包的唯一性,既要避免漏抢红包,又要避免乱抢红包而干扰用户的正常操作。据我所知,这个问题实际上没有完美的解决方案。有的程序通过AccessibilityNodeInfo的ObjectId来标识各窗口组件,但实际上,Accessbility Service与相应的微信程序是在不同的进程里运行的,AccessibilityNodeInfo仅仅是对另一进程里的窗口组件的映射,而且这种映射关系是不稳定的,因此试图用AccessibilityNodeInfo的ObjectId来标识窗口组件无异于刻舟求剑。
微信数据库(EnMicroMsg.db)中有一个唯一的红包ID(select content from message where type=436207665),我怀疑这个数据放在View对象的TAG里面了,以便在用户点击时发送到后台服务器。但据我所知,通过AccessibilityNodeInfo是取不到对应的View对象里的这个数据的。
我采用的方法是:
(1)对于由消息通知触发的抢红包任务,直接相应页面的最后一个红包即可,没有误判问题。
(2)对于由聊天页面触发的抢红包任务,取页面最后一个红包,如果该红包后面没有新的消息了,就抢一下试试;如果已经有新消息,说明是以前的红包,不再尝试。这种方法在特定场景下会引起一定的重复抢红包问题,对用户正常操作形成了一定干扰,但最大程度地避免了漏抢问题。

五、关于程序的健壮性
抢红包程序虽然简单,但是要使它有足够的健壮性,在各种情景下都能正常工作,还是挺不容易的。我试了网上几个主流的抢红包软件,都是只能在一部分场景下才正常工作。要考虑的场景至少有四种(以下两两组合形成):(1)红包来自当前聊天页面/其它页面;(2)当前屏幕状态为开启/熄灭。此外,还要考虑红包的并发到达问题、各种异常情况下的自我修复问题等等。
尤其是当红包来自当前聊天页面、且当前屏幕为熄灭状态时,此时系统仅触发通知到达事件,不触发窗口内容变动事件,而要执行Notification.contentIntent.send()又会走错页面,解决这个问题费了我好几天时间,最后绕了一个弯子才算是曲线解决了。

最后提醒一点,“辅助服务”的安全隐患还是挺大的,它启动后,理论上可以监听用户的任何操作,包括输入的银行卡密码等。因此,对于来路不明的软件,如果要求您开启辅助服务,您可千万要慎重,以免个人财物或隐私受到损失。




  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值