【2024年最新】autoXJS自动化刷币任务实战训练,ks极速版 2.0迭代版

【2024年最新】autoXJS自动化刷币任务实战训练,ks极速版 2.0自动化迭代

引言

  • 上一个版本:上个模板

  • 相比上版本变化了什么:

    • 代码优化:

      • 设置任务模块:采用对象方式,将不同的任务对象装进任务数组里exports出去,当任务的state属性为成功或者 不可执行时 从数组pop出去
      • 新增工具类部分方法
    • 新增5个任务 (目前13个)

    • 新加入部分弹窗识别关闭

效果图

在这里插入图片描述

代码

注意模块导入的路径

这里直接贴代码吧

有什么问题和建议欢迎留言😁

主程序代码 main.js


/*
 * @Descripttion: 用于快手极速版刷金币的脚本
 * @Author: 菜鸟黄某
 * @AutoXjs版本:6.5.7
 * @快手极速版版本:12.0.40.7282 (2024-02-02 最新版)
 * @Date: 2024-02-02 
 */
//导入模块



const tools = require('Tools2.0.js');
// const tools = require('Tools2.0.js');
let tasksarr = require('Tasks.js');

log("快手极速版脚本 启动")
const h = device.height || 2400,
    w = device.width || 1080;

//手机 数字类型的锁屏密码     
var password = "751953",
    //汇报邮箱
    targetEmail = "mailto:2245334490@qq.com",
    //完成状况
    scriptstate = "",
    //程序最大重试次数
    scripMaxRetryCount = 3,
    //脚本最大运行时间  单位:分钟
    maxRuntime = 40,
    //脚本启动时的时间
    startDate = new Date().getTime() + 8 * 60 * 60 * 1000,
    //不存在的任务
    unfindTasks = 0,
    unfindTasksName = "",
    appname = "快手极速版",
    _packageName = getPackageName(appname),
    //获取得金币数量
    begin_coinNum = 0,
    end_coinNum = 0;


//脚本结尾操作  sync() 把里面的函数加上同步锁,使得在同一时刻最多只能有一个线程执行这个函数
//@是否发送【qq邮箱通知】   @邮箱内容 
var exitEnd = sync(function (content, is_sendemail) {
    log(">>>>>>>>>>>>>>退出脚本准备<<<<<<<<<<<<<<<")
    begin_coinNum = tasksarr[0].begin_coinNum
    end_coinNum = tasksarr[0].end_coinNum
    //is_sendemail 默认为false
    is_sendemail = !!is_sendemail
    content += `脚本已运行:${Math.floor((new Date().getTime() + 8 * 60 * 60 * 1000 - startDate) / (60 * 1000))}分钟 \n剩余未完成任务:${tasksarr.length}\n其中无法执行的任务(无此任务/任务app未装)有:${unfindTasksName}\n脚本开始时的金币:${begin_coinNum}\n脚本结束时的金币:${end_coinNum}\n本次获取金币数量为:${end_coinNum - begin_coinNum}\n`
    log("脚本完成情况:\n" + content)
    //qq邮箱汇报  必须是qq邮箱app  微信关联qq邮箱即可在微信上直接查看脚本情况
    is_sendemail && tools.email(targetEmail, appname, content)
    sleep(3000)
    tools.killApp(appname)
    home()

    device.cancelKeepingAwake()//取消屏幕常亮
    threads.shutDownAll()//关闭所有子线程
    engines.myEngine().forceStop()//关闭当前脚本

})

//新建线程   专门处理广告倒计时
let thread1 = threads.start(function () {
    try {
        while (true) {
            let ad1 = id("com.kuaishou.nebula.commercial_neo:id/video_countdown").findOne(300)
            if (ad1 && ad1.text() == "已成功领取奖励") {
                log(`【找到[${ad1.text()}]并点击】:${tools.superClick(ad1)}`)
            }
            let ad2 = id("com.kuaishou.nebula:id/neo_count_down_text").findOne(400) || id("com.kuaishou.nebula.commercial_neo:id/reward_merchant_text").findOne(200) || id("com.kuaishou.nebula:id/pendant_task_status").findOne(200)
            if (ad2 && ad2.text().search(/[1-4]秒|00:0[1-4]|已领取|倒计时 00:0[1-4]/) == 0) {
                log(`[广告线程]-->" ${ad2.text()}\n`)
                sleep(5000);
                back()
                sleep(3000);
            }
            let ad3 = packageName(_packageName).textMatches(/(领取|奖励|立即|任务|退出|仍要|直播间|放弃){1,2}/).findOne(300) || className("android.widget.TextView").textStartsWith("看内容最高可得").findOne(200) || className("android.widget.Button").textStartsWith("看内容最高可得").findOne(200)
            if (ad3) {
                if (tools.superClick(ad3)) {
                    log(`【找到[${ad3.text()}]并点击】:true`)
                } else if (ad3.bounds().centerX() > 0 && ad3.bounds().centerY() > 0) {
                    click(ad3.bounds().centerX(), ad3.bounds().centerY());
                }

            }
        }
    } catch (e) {
        if (e.name == "JavaException") {
            log(">>>>>>>>>>>>>>>>广告线程退出<<<<<<<<<<<<<<<<<<<<")
        } else {
            scriptstate += `广告线程异常: 【${e.name}】\n${e.message}\n`
            log(`广告线程异常: 【${e.name}】\n${e.message}\n`)
            exitEnd(scriptstate, true)
        }

    }

});


try {
    init() && main()
} catch (error) {
    scriptstate += `主线程异常: 【${error.name}】\n${error.message}\n`
    log(`主线程异常: 【${error.name}】\n${error.message}\n`)
    //错误类型为 JavaException时 跳过重启任务 因为这是engines.stopAll()抛出异常导致的
} finally {
    exitEnd(scriptstate, true)
}


function main() {
    while (true) {

        let failcount = 0; //失败次数
        for (let i = 0; i < tasksarr.length; i++) {
            if (tools.backTo(text("任务中心"), 4)) {
                tasksarr[i].running();
            } else {
                failcount++;
            }
        }

        //失败次数太多
        if (failcount > 4) {
            log(`失败次数过多--> ${failcount}`)
            scriptstate += `失败次数过多--> ${failcount}\n`
            break;
        }
        //删掉已完成的数组元素
        tasksarr = tasksarr.filter(item => {
            if (item.state == "成功") {
                log(`<<<<<<<<<<<任务:${item.name}已从数组删除>>>>>>>>>>>>>>`)
            }
            if (item.state == "无法执行") {
                log(`<<<<<<<<<<<任务:${item.name}已从数组删除>>>>>>>>>>>>>>`)
                unfindTasks += 1;
                unfindTasksName += `${item.name} , `
            }
            return item.state != "成功" && item.state != "无法执行";
        });
        //剩余未完成任务 过少
        if (tasksarr.length - unfindTasks < 4) {
            throw new tools.UserErroyInfo("剩余任务过少", "剩余任务过少,脚本结束")
        }

    }

    // 重启任务
    tools.killApp(appname)
    if (thread1.isAlive()) {
        tools.killApp(appname)
        init()
    }

}


//初始操作
function init() {
    if (!!scripMaxRetryCount) {
        log(`>>>>>>>>>>>>>>剩余重试次数${scripMaxRetryCount}<<<<<<<<<<<<<`);
        scripMaxRetryCount--;

        //检测是否熄屏并开锁
        tools.openPhone(password);
        sleep(2000);
        //保持屏幕常亮
        device.keepScreenOn()
        tools.openApp(appname, 5000);
        sleep(2000)
        //任务中心
        if (tools.backTo(text("首页"), 3)) {
            let taskcenter = className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
            if (taskcenter) {
                log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
                sleep(8000)
            } else {
                log("未找到任务中心入口 , 尝试坐标点击")
                tools.clicks(760, 2345)
            }
            return true
        }

    } else {
        exitEnd(scriptstate, true)
    }

}










工具类模块代码 Tools.js

var tools = {};


//手机屏幕唤醒  适合数字密码锁屏
//@密码  [type]:str
tools.openPhone = function (password) {
    log("openPhone()----------------->")
    sleep(2000)
    if (!device.isScreenOn()) {
        log("openPhone()-->熄屏状态,尝试唤醒&输入密码")
        device.wakeUp()
        //让设备一直亮屏
        // device.keepScreenOn()
        sleep(2000)
        swipe(device.width / 2, device.height / 1.3, device.width / 2, device.height / 8, 200)
        sleep(1000)
        //有密码则
        log("openPhone()-->输入密码中")
        if (text("1").findOne(2000)) {

            for (var i = 0; i <= password.length; i++) {
                click(password[i])
                sleep(100)
            }
        } else if (desc("1").findOne(2000)) {
            for (var i = 0; i <= password.length; i++) {
                var p = desc(password[i]).findOne(1000)
                if (p) {
                    p.click()
                }
                sleep(100)
            }
        } else {
            log("openPhone()-->未找到密码锁")
        }


    }
};

//在"Autox.js v6"app页面 打开其他应用成功率高,提高容错
//@app名字  @打开app后休眠时间
tools.openApp = function (name, time) {
    log(`openApp()----------------->${name}`)
    home()
    sleep(1000)
    launchApp("Autox.js v6")
    sleep(5000)
    if (app.getPackageName(name)) {
        launchApp(name)
    } else {
        log("未安装:" + name)
    }

    sleep(time)

};

//自动化 杀死app后台
//@app包名
tools.killApp = function (appName) {
    var pagename = getPackageName(appName);
    if (!pagename) {
        return false;
    }
    home()
    sleep(1000)
    app.openAppSetting(pagename);
    sleep(2000);
    let is_sure = textMatches(/(强行|停止|结束|强制|运行){2}/).findOne(2000);
    if (is_sure && is_sure.enabled()) {
        click(is_sure.text())
        sleep(2000);
        let next = text("确定").findOne(3000) || textMatches(/(强行|停止|结束|强制|运行){2}/).findOne(2000)
        if (next && next.enabled()) {
            click(next.text())

            log(`killApp()---------->应用已被关闭`);
            sleep(2000);
        } else {
            log(`killApp()---------->应用不能被正常关闭或不在后台运行`);
        }



    } else {
        log(`killApp()---------->应用不能被正常关闭或不在后台运行`);
    }
    home()
}


//返回到某个页面       
//@控件条件   @最大返回/查找次数  return{bool}
tools.backTo = function (_uiselector, maxFind) {
    log("backTo()----------------->" + _uiselector)
    while (!_uiselector.findOne(2000)) {
        if (maxFind > 0) {
            back()
            maxFind--;
            sleep(3000)
        } else {
            log("backTo()-->失败")
            return false;
        }
    }
    log("backTo()-->成功")
    return true;
}


//截屏权限获取
tools.getScreenCapture = function () {
    log("请求截屏权限");
    let Thread = null
    if (device.sdkInt > 28) {
        //等待截屏权限申请并同意   线程多开
        Thread = threads.start(function () {
            // sleep(500)
            // click(846, 1553) 如果无法自动点击 可用坐标
            packageName('com.android.systemui').text(/(允许|立即开始|统一)/).waitFor();
            text(/(允许|立即开始|统一)/).click();
        });

    }
    //申请截屏权限
    if (!requestScreenCapture()) {
        log("请求截图失败");
        exit();
        return false;
    } else {
        Thread.interrupt()
        log("已获得截图权限");
        return true;

    }
}

//截屏
tools.ScreenCapture = function () {
    log("ScreenCapture()----------------->")
    // captureScreen("/sdcard/结果图.png");  -->不会保存到系统相册
    takeScreenshot()//模拟电源+音量键 进行截图-->保存到系统相册
    sleep(4000)
}


//qq邮箱发送
//@目标邮箱  @标题  @正文
tools.email = function (targetEmail, tag, content) {
    if (app.getPackageName("QQ邮箱")) {
        log("email()----------------->" + targetEmail)
        let intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(android.net.Uri.parse(targetEmail));
        intent.putExtra(Intent.EXTRA_SUBJECT, tag);
        intent.putExtra(Intent.EXTRA_TEXT, content);
        app.startActivity(intent);
        sleep(4000)
        click("发送")
    } else {
        log("未安装qq邮箱")
    }

}


//随机时间 随机坐标滑动
//@设备宽度  @设备像素高度  @方向  @最小随机时间  @最大随机时间 
tools.randomSwipe = function (w, h, dir, sleeptiemMin, sleeptiemMax) {

    let _swipe = {
        offset: random(-55, 55),
        x_l: random(w / 6, w / 5),
        x_r: random(w * 0.85, w * 0.75),
        y_up: random(h / 6, h / 5),
        y_down: random(h * 0.85, h * 0.75),
        time: random(320, 450),
        sleep_time: random(sleeptiemMin, sleeptiemMax)
    }

    var x1, x2, y1, y2
    switch (dir) {
        case "右":
            x1 = _swipe.x_r
            x2 = _swipe.x_l
            y1 = h / 2 + _swipe.offset
            y2 = h / 2 - _swipe.offset
            break;
        case "下":
            x1 = w / 2 + _swipe.offset
            x2 = w / 2 - _swipe.offset
            y1 = _swipe.y_down
            y2 = _swipe.y_up
            break;
        case "上":
            x1 = w / 2 - _swipe.offset
            x2 = w / 2 + _swipe.offset
            y1 = _swipe.y_up
            y2 = _swipe.y_down
            break;
        case "左":
            x1 = _swipe.x_l
            x2 = _swipe.x_r
            y1 = h / 2 - _swipe.offset
            y2 = h / 2 + _swipe.offset
            break;
        default:
            log("模拟滑动的方向错误")
    }
    log(`${_swipe.sleep_time / 1000}秒后将向${dir}`)
    sleep(_swipe.sleep_time)

    var xxy = [_swipe.time];
    var point = [];
    var dx0 = {
        "x": x1,
        "y": y1
    }

    var dx1 = {
        "x": random(x1 - 100, x1 + 100),
        "y": random(y1, y1 + 50)
    }
    var dx2 = {
        "x": random(x2 - 100, x2 + 100),
        "y": random(y2, y2 + 50),
    }
    var dx3 = {
        "x": x2,
        "y": y2
    }
    for (var i = 0; i < 4; i++) {

        eval("point.push(dx" + i + ")");

    }


    for (let i = 0; i < 1; i += 0.08) {
        xxyy = [parseInt(bezier_curves(point, i).x), parseInt(bezier_curves(point, i).y)]

        xxy.push(xxyy);

    }

    gesture.apply(null, xxy);

}

//点击 在当前页面的控件 
//@uiSelects 控件条件   @rangeTop/rangebottom 控件出现得上下范围  有默认值  return{bool}
tools.clickBounds = function (ui_select, findtime, rangeTop, rangebottom) {
    rangeTop = rangeTop || 0
    rangebottom = rangebottom || device.height
    while (true) {
        let uiObj = ui_select.findOne(findtime)
        if (uiObj) {
            if (uiObj.bounds().centerY() < rangeTop) {  //得向下滑动
                log(`clickBounds()------->${uiObj.text()}控件在屏幕上方`)
                swipe(w / 2, h / 2, w / 2, h / 1.2, 300)
            } else if (uiObj.bounds().centerY() > rangebottom) { //得向上滑动
                log(`clickBounds()------->${uiObj.text()}控件在屏幕下方`)
                swipe(w / 2, h / 1.2, w / 2, h / 2, 300)
            } else {
                log(`点击--->${uiObj.text()}`)
                click(uiObj.bounds().centerX(), uiObj.bounds().centerY())
                return true;
            }
        } else {
            log(`clickBounds()---------->未找到${ui_select}`)
            return false;

        }
    }
}


//主线程 在一定时间内 执行fn() 直到目标控件出现 或者时间结束  
//@uiselector控件条件   @maxWaitCount 最大执行fn()次数
tools.waitforUi = function (uiSelector, maxWaitCount, fn) {
    let i = 1
    do {
        //最大等待次数 
        if (i > maxWaitCount) {
            return tools.backTo(uiSelector, 3);
        }
        log(`主线程第${i}/${maxWaitCount}次等待`)
        fn()
        i++
    }
    while (!uiSelector.exists())
    return true
}


//停止出自己之外的所有脚本
tools.stopOtherScript = function () {
    engines.all().map((ScriptEngine) => {
        if (engines.myEngine().toString() !== ScriptEngine.toString()) {
            ScriptEngine.forceStop();
        }
    });

}
//超级点击  
//@要点击的控件  return{bool}
tools.superClick = function (node) {
    try {
        if (node) {
            if (node.click()) {
                return true
            } else if (node.parent().click()) {
                return true
            } else if (node.parent().parent().click()) {
                return true
            } else if (node.parent().parent().parent().click()) {
                return true
            } else if (node.parent().parent().parent().parent().click()) {
                return true
            } else if (node.parent().parent().parent().parent().parent().click()) {
                return true
            } else if (node.parent().parent().parent().parent().parent().parent().click()) {
                return true
            }
        }
    } catch (e) { }
    return false
}

//用户信息报错时的构造函数
tools.UserErroyInfo = function (name, message) {
    this.message = message;
    this.name = name;
}
//适配不同设备的点击方法
//注意,测试机型为1080*2400,
tools.clicks = function (x, y) {
    x1 = device.width / 1080
    y1 = device.height / 2400
    click(x * x1, y * y1)
}

function bezier_curves(cp, t) {
    cx = 3.0 * (cp[1].x - cp[0].x);
    bx = 3.0 * (cp[2].x - cp[1].x) - cx;
    ax = cp[3].x - cp[0].x - cx - bx;
    cy = 3.0 * (cp[1].y - cp[0].y);
    by = 3.0 * (cp[2].y - cp[1].y) - cy;
    ay = cp[3].y - cp[0].y - cy - by;

    tSquared = t * t;
    tCubed = tSquared * t;
    result = {
        "x": 0,
        "y": 0
    }
    result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
    result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
    return result;
}

//暴露模块
module.exports = tools;

任务模块 Task.js







function Task(name) {
    this.name = name;
    //任务状态 :未开始 成功  进行中  失败  无法执行  
    this.state = "未开始";
    //入口按钮
    this.enterbtn = null;
}

let openBox = new Task("开宝箱")
let lookAD = new Task("看广告")
let lookProduct = new Task("逛街浏览商品")
let lookzbj = new Task("看直播间")
let lookvd = new Task("刷短视频")
let findLook = new Task("搜素浏览")
let eatTime = new Task("每日餐补")
let sleepgetup = new Task("早睡早起")
let getCoinNum = new Task("获取金币数量")
let looktv = new Task("看短剧")
let readNovel = new Task("爽读小说")
let toOpenApp = new Task("打开app")
let lokzbj2 = new Task("去金币购赚更多")

lookAD.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").textMatches(/看广告得.+|看视频得.+/).findOne(2000)
    if (this.enterbtn) {
        let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
        if (state1) {
            let num = state1.text().match(/(\d+)\/(\d+)/)
            if (num[1] == num[2]) {
                log(`已完成:${num[1]}/${num[2]}`)
                this.state = "成功"
                return;
            }
        }

        if (this.enterbtn.parent().findOne(textStartsWith("明天看广告"))) {
            this.state = "成功"
            return;
        }

        sleep(2000)
        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(4000)
        //等待
        if (!tools.waitforUi(text("任务中心"), 30, () => sleep(10000))) { return }

    } else {
        log("未找到广告任务入口")
        this.state = "无法执行"
    }

}
openBox.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = textMatches(/treasurebox|开宝箱得金币|点就领.+/).findOne(2000)
    if (this.enterbtn) {
        click(this.enterbtn.bounds().centerX(), this.enterbtn.bounds().centerY());
        if (!tools.waitforUi(text("任务中心"), 20, () => sleep(10000))) { return }


    } else {
        log("暂无宝箱")
    }

}
lookProduct.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").text("逛街领金币").findOne(2000)
    if (this.enterbtn) {
        if (this.enterbtn.parent().findOne(textStartsWith("今日福利已领取"))) {
            log("逛街领金币已完成")
            this.state = "成功"
            return;
        }

        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(3000)
        if (!tools.waitforUi(text("任务中心"), 13, () => {
            tools.randomSwipe(w, h, "上", 2000, 3200);
            tools.randomSwipe(w, h, "上", 2000, 3200)
            tools.randomSwipe(w, h, "下", 2000, 3200)
        })) { return }


    } else {
        this.state = "无法执行"
        log("未找到入口")
    }
}

lookzbj.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").textMatches(/.+次直播领金币/).findOne(2000)
    if (this.enterbtn) {
        let num = [0, 0]
        let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
        if (state1) {
            num = state1.text().match(/(\d+)\/(\d+)/)
            if (num[1] == num[2]) {
                log(`已完成:${num[1]}/${num[2]}`)
                this.state = "成功"
                return;
            }
        }
        if (this.enterbtn.parent().findOne(text("今日已成功领取直播奖励金币"))) {
            this.state = "成功"
            return;
        }


        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)

        sleep(3000)
        tools.randomSwipe(w, h, "下", 0, 0)
        tools.randomSwipe(w, h, "下", 1000, 2000)
        sleep(1000)
        let maxcount = num[2] - num[1]
        for (let i = 0; i < maxcount; i++) {
            let zbj = id("recycler_view").findOne(2000)
            if (zbj && i < zbj.childCount()) {
                sleep(1000)
                log(`${i + 1}/${maxcount}次进入直播间`)
                tools.superClick(zbj.child(i))
                if (!tools.waitforUi(text("看直播领金币"), 9, () => sleep(10000))) { return }
            } else {
                log("未找到直播间控件/已看完")
                break;
            }
        }
    } else {
        log("未找到入口")
        this.state = "无法执行"
    }
}

lookvd.running = function () {
    log(`\n【${this.name}任务】`)

    sleep(2000)
    if (textMatches(/今日已领.+明日可领.+金币/).exists()) {
        log("刷视频任务已完成")
        this.state = "成功"
        return;
    }

    this.enterbtn = textMatches(/看视频额外得\d+金币|看视频赚金币|首页/).findOne(2000)
    if (this.enterbtn) {

        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(2000)

        let i = 0;
        while (i < 20) {
            log(`浏览视频第 ${i}/2020次`)
            tools.randomSwipe(w, h, "下", 5000, 8000)
            tools.randomSwipe(w, h, "下", 6000, 7000)
            tools.randomSwipe(w, h, "上", 8000, 10000)

            i++;
        }

        //回到任务中心
        if (tools.backTo(id("android:id/text1").text("首页"), 3)) {
            let taskcenter = id("float_background").findOne(2000) || className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
            if (taskcenter) {
                log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
                sleep(4000);
            } else {
                log("未找到 任务中心")
            }
        }



    } else {
        log("未找到入口")
        this.state = "无法执行"
    }
}

findLook.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").textMatches(/搜索.+/).findOne(2000)
    if (this.enterbtn) {
        let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
        if (state1) {
            let num = state1.text().match(/(\d+)\/(\d+)/)
            if (num[1] == num[2]) {
                log(`已完成:${num[1]}/${num[2]}`)
                this.state = "成功"
                return;
            }
        }

        //要输入的内容
        let context = this.enterbtn.text().match(/“(.+?)”/) || this.enterbtn.text().match(/\"(.+?)\"/)
        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        log(context)

        sleep(2000)
        let state = text("任务中心").findOne(2000)
        if (state) {
            log(`倒计时结束后可看`)
            return;
        }


        let btn = className("android.widget.TextView").text("搜索").findOne(2000)
        if (btn && context) {
            log("输入:" + context[1])
            setText(context[1])
            sleep(1000)
            log(`【找到[${btn.text()}]并点击】:${tools.superClick(btn)}`)
            sleep(22000)
            back()
        } else {
            log("未找到搜索按钮")
        }


        //回到任务中心
        if (tools.backTo(id("android:id/text1").text("首页"), 3)) {
            let taskcenter = id("float_background").findOne(2000) || className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
            if (taskcenter) {
                log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
                sleep(4000);
            } else {
                log("未找到 任务中心")
            }
        }

    } else {
        log("未找到入口")
        this.state = "无法执行"
    }
}

eatTime.running = function () {
    log(`\n【${this.name}任务】`)

    // 获取当前北京时间的时间戳(单位为毫秒)
    var stamp = new Date().getTime() + 8 * 60 * 60 * 1000;
    // 格式化北京时间为"YYYY-MM-DD HH:mm:ss"
    //replace() -->字符串分割  substring(0, 10); -->取 年月日 
    var beijingTime = new Date(stamp).toISOString().replace(/T/, ' ').replace(/\..+/, '').substring(0, 10);
    //当前小时    Date.parse( )-->转化成时间戳     向下取整
    let date = Math.floor((stamp - Date.parse(beijingTime)) / (60 * 60 * 1000))
    switch (date) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 9:
        case 10:
        case 14:
        case 20:
        case 0:
            log(`未到餐补时间--》目前:${date}`)
            this.state = "无法执行"
            break
        default:
            log(`餐补时间--》目前:${date}`)
            this.enterbtn = className("android.widget.TextView").text("到饭点领饭补").findOne(2000)
            if (this.enterbtn) {
                log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
                sleep(3000)
                //点击领取
                let next1 = text("领取饭补").findOne(2000) || textMatches(/(.+?)领取(.+?)补贴/).findOne(2000)
                if (next1) {
                    log(`【找到[${next1.text()}]并点击】:${tools.superClick(next1)}`)
                    this.state = "成功"
                } else {
                    log("未找到 领取控件")
                }

                sleep(2000)
                let next2 = textEndsWith("待补签").find()
                if (next2) {
                    for (let i = 0; i < next2.length; i++) {
                        log(`【第${i}次找到[${next2[i].text()}]并点击】:${tools.superClick(next2[i])}`)
                        sleep(40000)
                    }
                } else {
                    log("未找到 补签控件")
                }

                return;

            } else {
                log("未找到饭补入口");
                this.state = "失败"
            }





    }
}
sleepgetup.running = function () {
    log(`\n【${this.name}任务】`)

    // 获取当前北京时间的时间戳(单位为毫秒)
    var stamp = new Date().getTime() + 8 * 60 * 60 * 1000;
    // 格式化北京时间为"YYYY-MM-DD HH:mm:ss"
    //replace() -->字符串分割  substring(0, 10); -->取 年月日 
    var beijingTime = new Date(stamp).toISOString().replace(/T/, ' ').replace(/\..+/, '').substring(0, 10);
    //当前小时    Date.parse( )-->转化成时间戳     向下取整
    let date = Math.floor((stamp - Date.parse(beijingTime)) / (60 * 60 * 1000))
    switch (date) {
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
            log(`起床时间--》目前:${date}`)
            this.enterbtn = className("android.widget.TextView").textMatches(/起床赚金币|睡觉赚金币/).findOne(2000)
            if (this.enterbtn) {
                sleep(2000)
                if (text("已起床").exists()) {
                    log("已起床")
                    this.state = "成功"
                    return;
                }
                log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
                sleep(2000)
                //点击领取
                let next = text("开始起床").findOne(2000)
                if (next) {
                    log(`【找到[${next.text()}]并点击】:${tools.superClick(next)}`)
                } else {
                    log("未找到 领取控件")
                }
            } else {
                log("未找到入口");
                this.state = "失败"

            }
            break
        case 20:
        case 21:
        case 22:
        case 23:
            log(`睡觉时间--》目前:${date}`)
            this.enterbtn = className("android.widget.TextView").textMatches(/起床赚金币|睡觉赚金币/).findOne(2000)
            if (this.enterbtn) {
                sleep(2000)
                if (text("已睡觉").exists()) {
                    log("已睡觉")
                    this.state = "成功"
                    return;
                }
                sleep(2000)
                log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
                //点击领取
                let next = text("开始睡觉").findOne(2000)
                if (next) {
                    log(`【找到[${next.text()}]并点击】:${tools.superClick(next)}`)
                } else {
                    log("未找到 领取控件")
                }
            } else {
                log("未找到入口");
                this.state = "无法执行"
            }
            break
        default:
            log("时间未到")
            this.state = "无法执行"

    }

}

getCoinNum.begin_coinNum = 0
getCoinNum.end_coinNum = 0
getCoinNum.running = function () {

    log(`\n【${this.name}任务】`)
    this.enterbtn = className("android.widget.TextView").text("我的金币").findOne(2000)
    if (this.enterbtn) {
        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(4000)
        if (text("我的收益").exists()) {
            let coin = textMatches(/(\d?\.?\d+)w?金币/).findOne(2000)
            if (this.state == "未开始") {
                this.begin_coinNum = this.end_coinNum = coin.text().match(/(\d?\.?\d+)/)[0]
                this.begin_coinNum.toString().search(/\./) != -1 && (this.begin_coinNum = Math.ceil(this.begin_coinNum * 10000))
            } else {
                this.end_coinNum = coin.text().match(/(\d?\.?\d+)/)[0]
                this.end_coinNum.toString().search(/\./) != -1 && (this.end_coinNum = Math.ceil(this.end_coinNum * 10000))

            }
            log("this.begin_coinNum-->" + this.begin_coinNum, "this.end_coinNum-->" + this.end_coinNum)
            this.state = "进行中"
        } else {
            log("未进入 金币详情页面")
        }

    } else {
        log("未找到 -- 我的金币")
    }

}

looktv.running = function () {

    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").textMatches(/看短剧得.+金币/).findOne(2000)
    if (this.enterbtn) {
        let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
        if (state1) {
            let num = state1.text().match(/(\d+)\/(\d+)/)
            if (num[1] == num[2]) {
                log(`已完成:${num[1]}/${num[2]}`)
                this.state = "成功"
                return;
            }
        }



        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(2500)
        //等待
        if (!tools.waitforUi(text("任务中心"), 6, () => sleep(10000))) { return }

    } else {
        log("未找到广告任务入口")
        this.state = "无法执行"
    }


}
readNovel.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").text("爽读小说咔咔赚金币").findOne(2000)
    if (this.enterbtn) {

        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(10000)
        let book = className("android.view.View").textMatches(/.*每读\(\d+\/\d+\)(分|章)/).findOne(2000)
        if (book) {
            sleep(4000)
            tools.randomSwipe(w, h, "右", 0, 0)
            tools.randomSwipe(w, h, "右", 500, 1000)
            tools.randomSwipe(w, h, "右", 500, 1000)
            log(`【找到[${book.text()}]并点击】:${tools.superClick(book)}`)
            sleep(1400)
            if (!
                tools.waitforUi(text("任务中心"), 130, () => {
                    tools.randomSwipe(w, h, "右", 2500, 5200)
                })) { return }


        } else {
            tools.backTo(text("任务中心"), 3)
        }


    } else {
        this.state = "无法执行"
        log("未找到入口")
    }
}

toOpenApp.running = function () {
    log(`\n【${this.name}任务】`)
    if (this.state == "成功") {
        return;
    }
    this.state = "成功"
    let app_arr = ["快影", "淘宝", "一淘", "点淘", "闲鱼", "支付宝", "七猫", "京东", "京东金融"]
    for (let i = 0; i < app_arr.length; i++) {
        let appbtn = className("android.widget.TextView").textContains(app_arr[i]).findOne(2000)
        if (appbtn) {
            if (appbtn.text().search(/登录|打开|去/) == 0) {
                if (appbtn.text().search(/施肥/) != -1) {
                    //去施肥 ,如果是小米 小窗开启的坐标为(540 1160) 
                    // tools.clicks(540, 1940)
                    continue;
                }
                if (appbtn.parent().parent().findOne(text("已完成"))) {
                    log(`打开${app_arr[i]}任务 已完成`)
                    continue;
                } else {

                    log("任务开始:打开" + app_arr[i])
                    if (tools.superClick(appbtn)) {
                        sleep(10000)
                        tools.killApp(app_arr[i])
                        sleep(2000)
                        launchApp(appname)
                        if (!tools.backTo(text("任务中心"), 4)) { return }
                    }
                }

            }
        } else {
            log(`打开${app_arr[i]}任务未找到`)
        }

    }
}

lokzbj2.running = function () {
    log(`\n【${this.name}任务】`)

    this.enterbtn = className("android.widget.TextView").text("去金币购赚更多金币").findOne(2000)
    if (this.enterbtn) {
        log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
        sleep(4000)
        let btn = textContains("今日签到").findOne(2000)
        if (btn) {
            log(`【找到[${btn.text()}]并点击】:${tools.superClick(btn)}`)
        }
        sleep(1400)
        let btn1 = textContains("看直播可领").findOne(2000)
        if (btn1) {
            if (btn1.text() == "明日看直播可领") {
                log("任务已完成")
                this.state = "成功"
                return;
            }
            log(`【找到[${btn1.text()}]并点击】:${tools.superClick(btn1)}`)
            sleep(4000)
            let a = text("直播间下单还能返金币").findOne(2000)
            if (a) {
                let zbjs = a.parent().parent().child(2)
                for (let i = 0; i < 3; i++) {
                    if (zbjs && i < zbjs.childCount()) {
                        log(`${i + 1}/3次进入直播间`)
                        zbjs.child(i).click()
                        if (!tools.waitforUi(text("直播间下单还能返金币"), 11, () => sleep(10000))) { return }
                    } else {
                        log("未找到直播间控件/已看完")
                        this.state = "成功"
                        return;
                    }
                }
            } else {
                log("未找到控件")
            }
        }

    } else {
        log("未找到入口")
        this.state = "无法执行"
    }
}


// 爽读小说咔咔赚金币
var tasksarr = [getCoinNum, openBox, lookAD, sleepgetup, eatTime, lookProduct, looktv, lokzbj2, getCoinNum, toOpenApp, lookzbj, findLook, lookvd]

//暴露模块
module.exports = tasksarr;



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值