免root蚂蚁森林自动收能量,可自动解锁和自动触发
欢迎大家使用体验、提交错误,后面将逐步完善;
目前支持收好友能量和收自己能量
(看起来复杂,其实只是讲的比较详细)
私信小编获取github
目前只能收自己的,收好友能量的功能还在开发中...
0、效果演示:
1、脚本实现功能
启动后,脚本处于监听状态,注意开启保护,不要被后台关闭了。一般能量每天都是同一个时间点成熟,成熟后会通知栏发出通知(下面有说怎么在蚂蚁森林里开启通知),脚本监听到该通知后,就会自动触发启动,点亮屏幕,解锁,进入蚂蚁森林。这时候,就需要用到你设置的时间了。因为是提前一分钟进入,所以能量还没成熟,但脚本会一直戳屏,直到到你设置的结束时间。所以输入时间并启动后,虽然没有任何动静,但只要不报错,一般就可以了;
2、下载源码安装autojs.apk
源码在文章底部
2.5 、解压小手图片并放到自己能记住的路径下
等会要填到程序里的findImg()!!
3、解压并导入到app
解压源码后,放到手机存储下的“脚本”目录;也可以是其他的,记得就行
打开autojs app,点击导入
4、打开蚂蚁森林能量提醒功能
进入蚂蚁森林,点右上角“...”,进入设置,开启提醒
5、打开无障碍服务、通知权限
点击后如有跳转,就对应的完成设置
6、将autojs加入电池白名单、保护锁定,防止被后台关闭(这个大家都会的吧)
7、初次使用,程序中main()中的gesture()函数,是解锁功能,需要修改成自己的锁屏手势。
如果不改呢,就只是不能解锁而已,其他没影响
可通过打开开发者选项中的指针位置查看坐标。
8、运行脚本即可
9、由于是通过蚂蚁森林通知触发,所以输入时间并启动后,虽然没有任何动静,但只要不报错,一般就可以了;
输入时间处,点“确定”按钮左边的横线位置,就会弹出键盘。
如果想立即看到效果,可以在这里添加RunApp();后再运行:
10、如果想测试解锁,在这里加条语句
sleep(2000);
main();
然后按照点击运行、输入时间、锁屏,静待手机自动解锁
11、报错情况
- 可能是通知栏权限没开
- 可能是无障碍服务没开
欢迎评论留言
源码
var MODE=0;
function CloseApp() {
let packageName = currentPackage();
app.openAppSetting(packageName);
text(app.getAppName(packageName)).waitFor();
let is_sure = textMatches(/(.*强.*|.*停.*|.*结.*|.*行.*)/).findOne();
if (is_sure.enabled()) {
textMatches(/(.*强.*|.*停.*|.*结.*|.*行.*)/).findOne().click();
textMatches(/(.*确.*|.*定.*)/).findOne().click();
log(app.getAppName(packageName) + "应用已被关闭");
sleep(1000);
back();
} else {
log(app.getAppName(packageName) + "应用不能被正常关闭或不在后台运行");
back();
}
}
function EnterApp()
{
toast("启动支付宝")
app.launchApp("支付宝");
//text("蚂蚁森林").waitFor();
toast("启动完成");
sleep(1000);
className("android.widget.TextView").text("付钱").waitFor();
//bounds(33,103,843,180).click();
className("android.widget.ViewFlipper").click();
sleep(1000);
className("android.widget.TextView").desc("搜索").waitFor();
//bounds(231,76,905,207).setText("蚂蚁森林");
className("android.widget.EditText").setText("蚂蚁森林");
sleep(500);
className("android.widget.FrameLayout").desc("搜索").click();
className("android.widget.TextView").text("蚂蚁森林,为你在荒漠种下一棵真树").waitFor();
sleep(500);
//bounds(44,757,291,996).click();
className("android.widget.FrameLayout").clickable(true).depth(13).indexInParent(0).drawingOrder(1).click();
toast("进入森林中...");
var cnt = 0;
while(cnt++<5)
{
sleep(500);
if(className("android.view.View").text("社区生活 - 生活号").exists())
{
back();
break;
}
}
className("android.widget.Button").text("背包").waitFor();
toast("进入完成");
}
function RunApp(){
EnterApp();
while(true){
var dates = new Date();
if(dates.getHours() == startTime[0] && dates.getMinutes() - startTime[1] >=0 && dates.getMinutes() - startTime[1] < 2)
{
MyPower();
}
else if(dates.getHours() == endTime[0] && dates.getMinutes() == endTime[1])
{
toast("结束");
//exit();
break;
}
else
{
toast("未到时间");
sleep(5000);
}
}
}
function MyPower(){
do {
var powerList = className("android.widget.Button").textStartsWith("收集能量").find();
powerList.forEach(function(item){
press(item.bounds().centerX(), item.bounds().centerY(), 80);
//item.click();
toast("收取一次");
sleep(200);
});
} while (powerList.length);
toast("未成熟");
sleep(500);
}
function findImg()
{
//toast("截图中...");
var img = captureScreen();
while(!img)
{
sleep(100);
img = captureScreen();
}
toast("截图完成!");
var icon = images.read("/storage/emulated/0/脚本/icon.jpg");
var p = findImage(img, icon);
if(p){
toast("找到啦:" + p);
}else{
toast("没找到");
}
return p;
}
function FriendPower(){
EnterApp();
className("android.view.View").text("查看更多好友").findOne().click();
if(MODE==1)
{
className("android.view.View").text("周排行榜").waitFor();
sleep(1000);
var cnt = 0;
while(!className("android.view.View").text("邀请").exists() && cnt<30)
{
className("android.webkit.WebView").scrollDown();
toast("down");
sleep(500);
cnt ++;
}
lists=className("android.view.View").depth(14).find();
if(lists.empty())
console.log("empty");
var index = 0;
toast(lists.length);
lists.forEach(function(item){
if(index++>=2)
{
item.click();
var cnt = 0;
while(cnt<5)
{
if(className("android.widget.Button").text("浇水").exists())
{
sleep(1000);
MyPower();
back();
sleep(1000);
break;
}
cnt ++;
if(cnt>=5) toast("跳过");
sleep(500);
}
sleep(1000);
}
});
}
else if(MODE==4)
{
sleep(1000);
toast("模式4");
while(true)
{
var p = findImg();
if(p)
{
toast("找到");
click(p.x-500, p.y+50);
var cnt = 0;
while(cnt<5)
{
if(className("android.widget.Button").text("浇水").exists())
{
MyPower();
back();
sleep(1000);
break;
}
else
{
cnt ++;
sleep(500);
}
}
}
else
{
toast("上滑");
swipe(500,1800,500,500,500);
}
sleep(500);
}
}
}
function main(){
device.wakeUp();
sleep(1000);
swipe(500,1800,500,500,100);
sleep(1000);
gesture(1000, [540,1425], [250,1700],[560,1700],[540,2020],[840,1700]);
sleep(1000);
RunApp();
if(MODE==2)
FriendPower();
exit();
}
function selectMode(){
var options = ["定时收自己", "马上收好友能量", "定时收自己再收好友", "马上收自己(注意时间就得填现在)","马上收好友(若卡在收好友界面不动,请选这个)"]
var i = dialogs.select("请选择一个选项(默认第一项)", options);
if(i >= 0){
toast("您选择的是" + options[i]);
MODE = i;
}else{
toast("您取消了选择");
MODE = 0;
}
}
//程序从这里开始
auto();
alert("使用须知", "需开启无障碍服务、通知栏权限,音量下键可中止脚本;本程序监听状态栏自动启动,支持自动亮屏解锁,并在指定时间内检查能量。");
alert("注意", "初次使用,程序中main()中的gesture()函数,是解锁功能,需要修改成自己的锁屏手势。可通过打开开发者选项中的指针位置查看坐标。");
//setScreenMetrics(1080, 2340);
if(!requestScreenCapture()){
toast("请求截图失败");
exit();
}
selectMode();
sleep(500);
if(MODE==1 || MODE==4)
{
alert("注意!请核对'小手'图片存放位置,可在findImg()函数中修改,默认放在: /storage/emulated/0/脚本/icon.jpg");
FriendPower();
exit();
}
console.show();
var startTime = console.rawInput("请输入能量开始查询时间,如7.23:").split(".");
var endTime = console.rawInput("请输入能量结束查询时间,如7.25:").split(".");
console.log(">> 开始时间: "+startTime);
console.log(">> 结束时间: "+endTime);
sleep(1000);
console.hide();
toast("开始");
if(MODE==3)
{
RunApp();
exit();
}
events.observeNotification();
events.on("notification", function(n){
log("收到新通知:\n 标题: %s, 内容: %s, \n包名: %s", n.getTitle(), n.getText(), n.getPackageName());
if(n.getPackageName()=="com.eg.android.AlipayGphone")
{
if(n.getTitle()=="你的能量快成熟了")
main();
}
});
threads.start(function(){
//在子线程中调用observeKey()从而使按键事件处理在子线程执行
events.observeKey();
events.on("key_down", function(keyCode, events){
//音量键关闭脚本
if(keyCode == keys.volume_down){
// exit();
}
});
});
events.on("exit", function(){
toast("脚本已结束");
});
});
请先 后发表评论~