打开微信就不用管了:
- 自动打开未读消息
- 自动滑动屏幕检测红包
- 自动跳过无效红包
基于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小时/晚),起因是老婆说他们公司老板经常发大红包她总是抢不到。。。
今晚估计可以让老婆加鸡腿了^_^