分享一个网易云会员包项目刷下载量的脚本

此脚本非常的简单,就是不断的下载删除,操作也非常的简单,我分享一下这个auto.js写的源码,有兴趣的朋友可以试一下。

"ui";
var myapp = {}
myapp.sdk = ""
var mainThread = 0
var 悬浮创建 = 0
var 执行数量 = 0
ui.layout(
    <ScrollView >
        <vertical>
            <appbar>
                <toolbar id="toolbar" title="网易云音乐下载删除" />
            </appbar>

            <card w="*" h="auto" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp" gravity="center_vertical">
                <vertical padding="18 8" h="auto">
                    <linear>
                        <Switch id="autoService" text="无障碍权限" checked="{{auto.service != null}}" w="auto" textStyle="bold" />
                        <Switch id="overlayService" text="悬浮窗权限" checked="{{auto.service != null}}" w="auto" textStyle="bold" />
                    </linear>
                </vertical>
                <View bg="#E51400" h="*" w="5" />
            </card>



            <card w="*" h="auto" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp" gravity="center_vertical">
                <vertical padding="18 8" h="auto">
                    <linear>
                        <text text="操作次数" textcolor="black" w="auto" />
                        <input id="执行数量" inputType="text" text="" w="120" />
                        <text text="次" textcolor="black" w="auto" />
                    </linear>

                    <linear>
                        <text text="下载超时时间" textcolor="black" w="auto" />
                        <input id="等待时间" inputType="text" text="" w="120" />
                        <text text="秒" textcolor="black" w="auto" />
                    </linear>
                </vertical>
                <View bg="#ff5722" h="*" w="5" />
            </card>

            <card w="*" h="auto" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp" gravity="center_vertical">
                <vertical padding="18 8" h="auto">
                    <text textColor="red" w="*" textSize="16sp">[网易云音乐版本 8.2.41.151413]</text>
                </vertical>
                <View bg="#ff5722" h="*" w="5" />
            </card>

            <button style="Widget.AppCompat.Button.Colored" margin="5" id="start">保存脚本设置</button>
        </vertical>
    </ScrollView>
);
读取界面配置(true)
ui.autoService.on("check", function (checked) {
    // 用户勾选无障碍服务的选项时,跳转到页面让用户去开启
    if (checked && auto.service == null) {
        app.startActivity({
            action: "android.settings.ACCESSIBILITY_SETTINGS"
        });
    }
    if (!checked && auto.service != null) {
        auto.service.disableSelf();
    }
});
ui.emitter.on("resume", function () {
    // 此时根据无障碍服务的开启情况,同步开关的状态

    ui.autoService.checked = auto.service != null;
});
ui.overlayService.on("check", function (checked) {
    // 用户勾选无障碍服务的选项时,跳转到页面让用户去开启
    if (checked) {
        try {
            int = app.startActivity({
                packageName: "com.android.settings",
                className: "com.android.settings.Settings$AppDrawOverlaySettingsActivity",
                data: "package:" + context.getPackageName().toString()
            });
        } catch (err) {
            app.openAppSetting(getPackageName("网易云音乐下载删除"));
        }
        toast("请打开悬浮窗开关");
    }

    if (!checked && auto.service != null) {
        //auto.service.disableSelf();
        toast("已关闭悬浮窗权限");
    }
});

ui.start.on("click", () => {   //按钮单击事件 哪个按钮 start 需要修改这个ID
    保存界面配置()          //先读取配置
    读取界面配置(false)
    if (auto.service == null) {
        toastLog("请先开启无障碍服务!");
        return
    };


    if (悬浮创建 == 0) {
        threads.start(function () {
            floatyLogInit(5, 0, 10, true)
        })
        // 屏蔽音量键调节声音
        events.setKeyInterceptionEnabled("volume_up", true);
        events.setKeyInterceptionEnabled("volume_down", true);
        events.observeKey();
        //监听音量键按下
        events.onKeyDown("volume_up", () => {
            exit()
        });
        events.onKeyDown("volume_down", () => {
            if (mainThread == 0) {
                mainThread = threads.start(APP_main);
            } else {
                addlog('脚本停止运行')
                mainThread.interrupt();
                mainThread = 0
            }
        });
        悬浮创建 = 1
    }
    home()
    toast('脚本转入后台')
});

function APP_main() {
    addlog('脚本开始运行')
    var 删除成功 = false
    var 下载成功 = false
    var 数量叠加 = false
    var 下载计次 = 0
    while (true) {
        if (id('com.netease.cloudmusic:id/downloadBlock').findOnce()) {
            if (!删除成功) {
                addlog('点击更多')
                Click(desc('更多').findOnce())
            } else if (!下载成功) {
                if (下载计次 >= 2) {
                    下载计次 = 0
                    下载成功 = true
                } else {
                    addlog('点击下载')
                    var node = id('com.netease.cloudmusic:id/downloadBlock').findOnce()
                    if (node != null) {
                        node.click()
                    }
                    下载计次++
                }
            } else {
                if (!数量叠加) {
                    执行数量++
                    if (执行数量 >= parseInt(myapp.执行数量)) {
                        addlog('当前下载删除任务完成 脚本停止')
                        return
                    } else {
                        addlogEX('操作次数:' + 执行数量 + '/' + myapp.执行数量)
                    }
                    数量叠加 = true
                }
                下载计次 = 0
                back()
            }
        } else if (text('删除').findOnce()) {
            addlog('点击删除')
            Click(text('删除').findOnce())
            删除成功 = true
        } else if (text('清空下载文件').findOnce()) {
            addlog('清空下载文件')
            Click(text('清空下载文件').findOnce())
        } else if (textContains('下载音质').findOnce()) {
            addlog('选择下载音质标准')
            Click(textContains('标准').findOnce())
        } else if (text('下载').findOnce()) {
            addlog('点击确认下载')
            Click(text('下载').findOnce())
            下载成功 = true
        } else if (text('我喜欢的音乐').findOnce()) {
            APP_下载判断()
            addlog('点击我喜欢的音乐')
            if (Click(text('我喜欢的音乐').findOnce())) {
                下载成功 = false
                删除成功 = false
                数量叠加 = false
            }
        }
        sleep(800)
    }
}



function Click(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
}
function floatyLogInit(linesCount, x, y, islog) {
    let _linesCount = linesCount || 6;
    if (typeof _linesCount != 'number') _linesCount = 6;
    if (typeof x != 'number') x = 0;
    if (typeof y != 'number') y = 10;
    if (typeof islog != 'boolean') islog = true;
    let initX = x
    let initY = y
    floatyLogW = floaty.rawWindow(
        <card w="*" h="auto" marginLeft="3" cardBackgroundColor='#66242424' cardCornerRadius="8dp" cardElevation="1dp" gravity="center_vertical">
            <vertical paddingLeft="5" paddingRight="5" w='*'>
                <Chronometer id='chronometer' textSize="13dp" textColor="#DC143C" w="*" style="Widget/AppCompat.Button.Borderless" textStyle='bold' />
                <button id='logEX' textSize="13dp" textColor="#20B2AA" style="Widget/AppCompat.Button.Borderless" textStyle='bold'
                    layout_weight='5' layout_width="wrap_content" layout_height="wrap_content" />

                <button id='log' textSize="13dp" textColor="#FFD700" style="Widget/AppCompat.Button.Borderless" textStyle='bold'
                    layout_gravity="right" layout_weight='5' layout_width="wrap_content" layout_height="wrap_content" />
            </vertical>
        </card>
    );
    let nowlogArr = [];

    addlogEX = function (printContent) {
        ui.run(() => { floatyLogW.logEX.text(printContent) })
    }

    floatyLogShow = function (x, y) {
        let _x = x || initX
        let _y = y || initY
        ui.run(() => { floatyLogW.setPosition(_x, _y) })
    }

    floatyLogHide = function () {
        ui.run(() => { floatyLogW.setPosition(3000, 3000) })
    }

    function dateFormat(date, fmt_str) {
        return java.text.SimpleDateFormat(fmt_str).format(new Date(date || new Date()));
    }

    ui.run(() => {
        addlog('音量-键 【启动】【停止】脚本')
        addlog('音量+键 【结束】脚本进程')
        addlogEX('操作次数:' + 执行数量 + '/' + myapp.执行数量)
        floatyLogW.chronometer.setFormat('[运行时间] %s')
        floatyLogW.chronometer.start()
        floatyLogW.setTouchable(false);
        floatyLogW.setPosition(x, y);
    })
}
function 保存界面配置() {
    保存本地数据(myapp.存储标识, "执行数量", ui.执行数量.text())
    保存本地数据(myapp.存储标识, "等待时间", ui.等待时间.text())
};
function 读取界面配置(是否设置组件值) {   //逻辑值 是否设置组件值
    if (读取本地数据(myapp.存储标识, "执行数量") != undefined) {
        myapp.执行数量 = 读取本地数据(myapp.存储标识, "执行数量")
    };
    是否设置组件值 && ui.执行数量.setText(myapp.执行数量);


    if (读取本地数据(myapp.存储标识, "等待时间") != undefined) {
        myapp.等待时间 = 读取本地数据(myapp.存储标识, "等待时间")
    };
    是否设置组件值 && ui.等待时间.setText(myapp.等待时间);
};
function 保存本地数据(存储标识, ID, 界面组件值) {
    const storage = storages.create(存储标识);  //创建storage对象
    storage.put(ID, 界面组件值);
};
function 读取本地数据(存储标识, ID) {
    const storage = storages.create(存储标识);  //创建storage对象
    if (storage.contains(ID)) {
        return storage.get(ID, "");
    };
    //默认返回undefined
};
function 到期判断(到期时间) {
    var 输入框月份, 输入框日期, 输入框小时, 输入框分钟, 输入框日期, 输入框年份, 输入框秒数
    输入框日期 = 到期时间
    输入框时间 = 输入框日期.split("S")
    if (输入框时间.length == 6) {
        输入框年份 = parseInt(输入框时间[0], 16)
        输入框月份 = parseInt(输入框时间[1], 16)
        输入框日期 = parseInt(输入框时间[2], 16)
        输入框小时 = parseInt(输入框时间[3], 16)
        输入框分钟 = parseInt(输入框时间[4], 16)
        输入框秒数 = parseInt(输入框时间[5], 16)
        输入框年份 = 输入框年份 / 1990
        输入框月份 = 输入框月份 / 1990
        输入框日期 = 输入框日期 / 1990
        输入框小时 = 输入框小时 / 1990
        输入框分钟 = 输入框分钟 / 1990
        输入框秒数 = 输入框秒数 / 1990
        var 激活卡时间 = new Date(输入框年份, 输入框月份 - 1, 输入框日期, 输入框小时, 输入框分钟, 输入框秒数);
        var 现在时间 = new Date()
        if (激活卡时间 < 现在时间) {
            return false
        } else {
            toastLog("到期时间:" + 输入框年份 + "年" + 输入框月份 + "月" + 输入框日期 + "日  " + 输入框小时 + "时" + 输入框分钟 + "分" + 输入框秒数 + "秒")
            return true
        }
    } else {
        return false
    }
}


版权声明:本文为weixin_42596619原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。