打开微信就不用管了:
- 自动打开未读消息
- 自动滑动屏幕检测红包
- 自动跳过无效红包
基于Auto JS,apk版本4.01:
- 大多数动作均基于控件
- 极个别点击基于动态抓取的坐标
- 这就意味着不限机型或屏幕尺寸
使用说明:
- 安装auto.js apk
- 导入js脚本
- 在auto js设置中开启悬浮窗,因为懒得写控制逻辑了,直接用悬浮窗控制程序开始或结束
- 打开微信
逻辑思路和关联到的控件信息:
i. 检查是否有红包?循环上滑3次屏幕
ii. 点击红包消息
LinearLayout(clickable=true && depth=13 && id=atb)
iii. 检测红包是否可领?有无[开]
iv. 开红包【开】
Button(desc='开' && id=dan && depth=9)
v. 取得金额
TextView(depth=13 && id=d62 && text=【金额】)
vi. 返回聊天界面
LinearLayout(depth=7 && id=m0 && clickable=true)
vii. 返回微信首页
LinearLayout(depth=9 && id=lr && clickable=true)
主要代码逻辑 - 检测新红包/无效红包
Hints:
1. 如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:
var b = desc("打开侧拉菜单").findOne().bounds();
click(b.centerX(), b.centerY()); //如果使用root权限,则用 Tap(b.centerX(), b.centerY());
2. 小心使用find(),findOne()等,注意仔细看原文档,否则会莫名其妙找不到控件或被阻塞
//please avoid to use findOne() as it will jam until get one UIObject
// we could use findOne(500) or findOnce() to instead if need
//搜索新红包并点开领取 function searchNewRedpacket(){ var rp_msg_list = className("android.widget.TextView").id('auk').find(); log("调试信息3" + rp_msg_list); if(rp_msg_list.length != 0){ log("检测到的红包个数: " + rp_msg_list.length); for(var i = 0; i < rp_msg_list.length; i++){ var rp_auk = rp_msg_list[i]; var rp_auk_parent = rp_auk.parent(); if(rp_auk_parent.childCount() == 1){ log("### 发现新红包"); var rpB = rp_auk_parent.bounds(); click(rpB.left, rpB.top, rpB.right, rpB.bottom); log("成功打开红包消息"); openNewRedPacket(); sleep(1000); }else if(i == (rp_msg_list.length - 1)){ log("当前页面已检测完"); break; }else{ log("无效红包, 跳过"); } } }else if(rp_msg_list.empty()){ log("未检测到红包消息" + rp_msg_list.length); }else{ return; } }
主要代码逻辑 -- 开红包
//领取点开的红包 function openNewRedPacket(){ var draw = desc("开").findOne(500); log("调试信息2"); if(draw != null){ log("#### 点开新红包"); draw.click(); log("#### Gain a LUCKY succesfully!!!"); sleep(1000); //领完返回聊天主页 back(); }else{ log("过期之类无效红包"); } back(); log("返回成功"); }
今天忙的有点晕,就写这些了,需要完整代码的留言,改天抽空上传操作视频和源码到git。
PS: 写这个前后大概花了4晚上(2小时/晚),起因是老婆说他们公司老板经常发大红包她总是抢不到。。。
今晚估计可以让老婆加鸡腿了^_^