在网上看了一些自动收能量的脚本
根据自己的手机型号 华为荣耀9 分辨率为1980*1080
写了一个脚本
使用AutoJs运行
定时每天早上7点开始收能量(再也不用担心我的能量被偷啦 哈哈~)
AutoJS下载地址 http://shouji.baidu.com/software/23334313.html
运行步骤如下:
1.解锁(点亮屏幕,切换到输入密码界面,输入密码)
2.打开支付宝
3.找到蚂蚁森林
4.收取自己的能量
5.偷取他人能量
附上代码如下:
/*
脚本说明:1.蚂蚁森林需在首页的入口处
2.锁屏密码是4位数字
3.手机分辨率是1920*1080
*/
auto();
requestScreenCapture();
//解锁
unlock();
sleep(1000);
//按键监听
threads.start(function () {
toast("程序可按音量下键停止")
//启动监听
events.observeKey();
//监听音量下键
events.onKeyDown("volume_down", function (event) {
toast("脚本终止")
exit();
})
})
//解锁
function unlock() {
if (!device.isScreenOn()) {
//点亮屏幕
device.wakeUp();
sleep(2000);
swipe(500, 1000, 500, 100, 1000);
click(100, 150);
//输入四次 1 (密码为1111)其他密码请自行修改 数字键1的像素坐标为(200,1000)
//可使用手机开发者选项确定像素坐标
click(200, 1000);
sleep(200);
click(200, 1000);
sleep(200);
click(200, 1000);
sleep(200);
click(200, 1000);
sleep(200);
tLog("解锁成功~");
}
}
var myEnergeType = ["绿色能量", "线下支付", "行走", "共享单车", "地铁购票", "网络购票", "网购火车票", "生活缴费", "ETC缴费", "电子发票", "绿色办公", "咸鱼交易", "预约挂号"];
var morningTime = "07:02";//自己运动能量生成时间
mainEntrence(); //主函数
//日志输出
function tLog(msg) {
toast(msg);
console.log(msg)
}
//获取权限和设置参数
function prepareThings() {
setScreenMetrics(1080, 1920);
//请求截图
if (!requestScreenCapture()) {
tLog("请求截图失败");
exit();
}
}
//获取截图
function getCaptureImg() {
var img0 = captureScreen();
if (img0 == null || typeof (img0) == "undifined") {
tLog("截图失败,退出脚本");
exit();
}
else {
return img0;
}
}
//默认程序出错提示操作
function defaultException() {
tLog("程序当前所处状态不合预期,脚本退出");
exit();
}
//等待加载收集能量页面,采用未找到指定组件阻塞的方式,等待页面加载完成
function waitPage(type) {
// 等待进入自己的能量主页
if (type == 0) {
desc("消息").findOne();
}
// 等待进入他人的能量主页
else if (type == 1) {
desc("浇水").findOne();
}
//再次容错处理
sleep(3000);
}
//从支付宝主页进入蚂蚁森林我的主页
function enterMyMainPage() {
launchApp("支付宝");
//tLog("等待支付宝启动");
var i = 0;
sleep(3000);
//进入蚂蚁森林
swipe(520, 1200, 520, 600, 500);
sleep(500);
//swipe(520, 600, 520, 1300, 500);
while (!textEndsWith("蚂蚁森林").exists() && i <= 5) {
sleep(1000);
i++;
}
clickByText("蚂蚁森林", true, "请把蚂蚁森林入口添加到主页我的应用");
sleep(5000)
}
//进入排行榜
function enterRank() {
sleep(1000);
swipe(520, 1800, 520, 300, 500);
sleep(500);
swipe(520, 1800, 520, 300, 500);
if (textEndsWith("查看更多好友").exists()) {
textEndsWith("查看更多好友").findOne().click();
}
var i = 0;
sleep(3000);
while (!textEndsWith("好友排行榜").exists() && i <= 5) {
sleep(2000);
i++;
}
if (i >= 5) {
defaultException();
}
}
//从排行榜获取可收集好友的点击位置
function getHasEnergyfriend(type) {
var img = getCaptureImg();
var p = null;
if (type == 1) {
//img 是图片
//"#30bf6c" 第一个颜色
//[0, 33, "#30bf6c"] 第二颜色和它的相对坐标
//[34,45, "#ffffff"] 第三个颜色和他的相对坐标
//region: [1030, 100, 1, 1700] 第一个颜色的检测区域1030,100为起始坐标,1,1700为区域宽度!
p = images.findMultiColors(img, "#1da06d", [[59, 0, "#1da06d"], [46, 44, "#ffffff"]], {
region: [1018, 200, 1, 1700]
});
}
if (p != null) {
return p;
}
else {
return null;
}
}
//判断是否好友排行榜是否结束
function isRankEnd() {
if (textEndsWith("没有更多了").exists()) {
var b = textEndsWith("没有更多了").findOne();
tLog("偷能量结束~");
var bs = b.bounds();
if (bs.centerY() < 1920) {
return true;
}
}
return false;
}
//在排行榜页面 循环查找可收集好友
function enterOthers() {
var i = 1;
var ePoint = getHasEnergyfriend(1);
//确保当前操作是在排行榜界面
while (ePoint == null && textEndsWith("好友排行榜").exists()) {
//滑动排行榜 root方式的的点击调用 如无root权限,7.0及其以上可采用无障碍模式的相关函数
swipe(520, 1800, 520, 300, 500);
sleep(100);
ePoint = getHasEnergyfriend(1);
i++;
//检测是否排行榜结束了
if (isRankEnd()) {
return false;
}
//如果连续32次都未检测到可收集好友,无论如何停止查找(由于程序控制了在排行榜界面,且判断了结束标记,基本已经不存在这种情况了)
else if (i > 32) {
tLog("程序可能出错,连续" + i + "次未检测到可收集好友");
exit();
}
}
if (ePoint != null) {
click(ePoint.x, ePoint.y + 20);
//waitPage(1); 会滞留在该页面 后续操作中断
for (var row = 440; row < 900; row += 100)
for (var col = 170; col < 800; col += 100) {
click(col, row);
sleep(50);
}
//clickByDesc("可收取",80); 并不能收取 原因不明
//进去收集完后,递归调用enterOthers
back();
sleep(2000);
var j = 0;
//等待返回好友排行榜
if (!textEndsWith("好友排行榜").exists() && j <= 5) {
sleep(2000);
j++;
}
if (j >= 5) {
defaultException();
}
enterOthers();
}
else {
defaultException();
}
}
//根据描述值 点击(调用该方法时并不能收取能量)
function clickByDesc(energyType, paddingY, noFindExit, exceptionMsg) {
if (descEndsWith(energyType).exists()) {
descEndsWith(energyType).find().forEach(function (pos) {
var posb = pos.bounds();
click(posb.centerX(), posb.centerY() - paddingY);
sleep(200);
});
}
else {
if (noFindExit != null && noFindExit) {
if (exceptionMsg != null) {
tLog(exceptionMsg);
exit();
}
else {
defaultException();
}
}
}
}
//根据text值 点击
function clickByText(energyType, noFindExit, exceptionMsg) {
if (textEndsWith(energyType).exists()) {
textEndsWith(energyType).find().forEach(function (pos) {
var posb = pos.bounds();
click(posb.centerX(), posb.centerY() - 60);
});
}
else {
if (noFindExit != null && noFindExit) {
if (exceptionMsg != null) {
tLog(exceptionMsg);
exit();
}
else {
defaultException();
}
}
}
}
//遍历能量类型,收集自己的能量
function collectionMyEnergy() {
var energyRegex = generateCollectionType();
var checkInMorning = false;
//如果是早上7点02分左右的话 等待主页能量出现 每隔一秒检测一次
while (isMorningTime() && descEndsWith("行走").exists()) {
if (!checkInMorning) {
tLog("等待运动能量生成中...");
checkInMorning = true;
}
descEndsWith("行走").find().forEach(function (pos) {
var posb = pos.bounds();
click(posb.centerX(), posb.centerY() - 80);
});
}
if (checkInMorning) {
tLog("运动能量收集完成");
}
if (descMatches(energyRegex).exists()) {
if (!checkInMorning) {
tLog("防止小树的提示遮挡,等待中");
}
}
//将能量球存在的区域都点一遍,间隔是能量球的半径
for (var row = 640; row < 900; row += 100)
for (var col = 140; col < 800; col += 100) {
click(col, row);
sleep(50);
}
tLog("能量收完,不必担心被偷啦~");
sleep(100);
}
//结束后返回主页面
function whenComplete() {
tLog("运行成功");
back();
sleep(1500);
back();
exit();
}
//根据能量类型数组生成我的能量类型正则查找字符串
function generateCollectionType() {
var regex = "/";
myEnergeType.forEach(function (t, num) {
if (num == 0) {
regex += "(\\s*" + t + "$)";
}
else {
regex += "|(\\s*" + t + "$)";
}
});
regex += "/";
return regex;
}
//行走能量
function isMorningTime() {
var now = new Date();
var hour = now.getHours();
var minu = now.getMinutes();
var targetTime = morningTime.split(":");
if (Number(targetTime[0]) == hour && Math.abs(Number(targetTime[1]) - minu) <= 2) {
return true;
}
else {
return false;
}
}
//程序主入口
function mainEntrence() {
//前置操作
prepareThings();
//从主页进入蚂蚁森林
enterMyMainPage();
//收集自己的能量
collectionMyEnergy();
//进入排行榜
enterRank();
//收集好友能量
enterOthers();
//结束后返回主页面
whenComplete();
}