跳至主要內容

抖音抢福袋源码

约 3413 字大约 11 分钟老猫

"ui";
let myapp = {}
myapp.count = '9999'
myapp.time = '10'
myapp.存储标识 = "dy_cf_Y443"
let 屏幕高度 = device.height
let 屏幕宽度 = device.width
let 悬浮创建 = 0

//IMG图片数据
img_zfb = "https://s3.bmp.ovh/imgs/2022/12/31/3dfdc9646eaa3ab0.jpeg";
img_wx = "https://s3.bmp.ovh/imgs/2022/12/31/865ed7216ef93cc7.jpeg";

ui.statusBarColor("#50000000");
const AllColor = "#000000"
const alpha = 1
const primary = '#66B3FF'
ui.statusBarColor(colors.parseColor(primary));
const resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
const statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
const toolbarHeight = parseInt(statusBarHeight / 2)
//自定义控件 付款方式
var v_pay_radio = [];//支付方式 单选框值
//自定义控件 付款方式
var payLayout = (function () {
    util.extend(payLayout, ui.Widget);
    function payLayout() {
        ui.Widget.call(this);
        this.defineAttr("name", (view, attr, value, defineSetter) => {
            view._pay_name.setText(value);

        });
        this.defineAttr("label", (view, attr, value, defineSetter) => {
            view._label_text.setText(value)
            switch (value) {
                case "推荐":
                    view._label_bg.attr("cardBackgroundColor", "#f5a623")
                    view._radio.attr("checked", true)
                    break;
                case "维护":
                    view._label_bg.attr("cardBackgroundColor", "#999999")
                    break;
            }
            view._label_bg.attr("visibility", "visible");
        })
        this.defineAttr("subtitle", (view, attr, value, defineSetter) => {
            view._subtitle.setText(value);
            view._subtitle.attr("visibility", "visible");

        });
        this.defineAttr("src", (view, attr, value, defineSetter) => {
            view._img.attr("src", value);
        });
        this.defineAttr("onClick", (view, name, defaultGetter) => {
            return this._onClick;
        }, (view, name, value, defaultSetter) => {
            v_pay_radio[v_pay_radio.length] = view._radio

            this._onClick = value;
        });
    }
    payLayout.prototype.render = function () {
        return (
            <vertical >
                <frame h="1" w="*" bg="#e3e3e3" />
                <horizontal marginTop="10" marginBottom="10" w="*" h="44" >
                    <img id="_img" w="44" src="#ffffff" />
                    <vertical h="*" w="auto" marginLeft="10">
                        <horizontal h="22" w="auto">
                            <text id="_pay_name" w="auto" text="未知" textSize="18" textStyle="bold" textColor="#000000" minWidth="60" />
                            <card id="_label_bg" w="auto" h="auto" marginLeft="10" layout_gravity="center_vertical" cardCornerRadius="6" cardBackgroundColor="#f5a623"
                                foreground="?selectableItemBackground" visibility="invisible">
                                <text id="_label_text" margin="10 0 10 0" text="暂无" textStyle="bold" textSize="14" textColor="#ffffff" />
                            </card>
                        </horizontal>
                        <text id="_subtitle" w="auto" h="*" gravity="bottom" text="暂无" textSize="12" visibility="invisible" />
                    </vertical>
                    <vertical w="*" h="*" gravity="right|center">
                        <radio id="_radio" w="auto" clickable="false" />
                    </vertical>
                </horizontal>
            </vertical>
        )
    };
    payLayout.prototype.onViewCreated = function (view) {
        view.on("click", () => {
            if (this._onClick) {
                for (let i = 0; i != v_pay_radio.length; i++) {
                    v_pay_radio[i].attr("checked", false);
                }
                if (view._label_text.text() == "维护") {
                    pay = 0
                    alert(view._pay_name.text() + "正在维护中")
                    view._radio.attr("checked", true)

                } else {
                    pay = view._pay_name.text()
                    view._radio.attr("checked", true)
                }
                // view._radio.attr("checked", true)
                eval(this._onClick);
            }
        });
    };
    ui.registerWidget("pay-layout", payLayout);
    return payLayout;
})();

ui.layout(
    <drawer bg="#ffffff">
        <vertical>
            <toolbar bg='{{primary}}' id="toolbar" title='承接脚本定制QQ:68107808' >
            </toolbar>
            <card margin="3 1" contentPadding="5" cardElevation="0" cardCornerRadius="10" cardBackgroundColor="#AFEEEE" alpha="{{alpha}}" >
                <TextView id="tv_text" singleLine="true" ellipsize="marquee" textSize="12" focusable="true"
                    text="本作品仅供学习交流,不得用于任何商业以及非法用途,下载试用后请24小时之内自行删除,因使用软件造成的使用者以及任何网站的一切损失, 皆由使用者承担。如不接受本条款,请立即删除本软件,如不慎软件被破解,皆由破解者承担一切责任本作品仅供学习交流!请于24小时内自行删除!"
                    textColor="#000000" />
            </card>
            <card margin="3 1" cardElevation="0" cardCornerRadius="10" cardBackgroundColor="#AFEEEE" alpha="{{alpha}}" >
                <linear gravity="left">
                    <Switch id="autoService" Thumbcolor="#000000" Trackcolor="#000000" text="无障碍服务" textColor="#000000" w="150" checked="{{auto.service != null}}" padding="8 8 8 8" textSize="15sp" />
                </linear>
                <linear gravity="right" >
                    <Switch id="overlayService" Thumbcolor="#000000" Trackcolor="#000000" text="悬浮窗权限" textColor="#000000" w="150" checked="{{auto.service != null}}" padding="8 8 8 8" textSize="15sp" />
                </linear>
            </card>
            <card margin="3 3" cardElevation="0" cardCornerRadius="10" cardBackgroundColor="#AFEEEE" alpha="{{alpha}}" >
                <vertical padding="10" h="auto">
                    <text gravity='left' text="软件说明" textColor="#009688" textSize="13sp" maxLines="1" />
                    <text gravity='left' text="1. 五云科技-老猫QQ68107808, 承接脚本定制" textColor="#222222" textSize="13sp" maxLines="1" />
                    <text gravity='left' text="2. 本软件基于Auto.js编写手写,仅用于交流学习" textColor="#222222" textSize="13sp" maxLines="1" />
                </vertical>
            </card>

            <viewpager id="viewpager">
                <frame >
                    <ScrollView  >
                        <vertical >
                            <card margin="3 1" cardElevation="0" cardCornerRadius="10" cardBackgroundColor="#AFEEEE" alpha="{{alpha}}" >
                                <vertical padding="3 1 1 1" h="auto">
                                    <linear gravity="left">
                                        <vertical w="*" h="auto" marginTop="10" bg="#AFEEEE">
                                            <vertical margin="10 10 20 10">
                                                <text text="运行模式" marginBottom="10" textSize="22" textStyle="bold" textColor="#000000" />
                                                {/* <View margin='0 1 0 1' bg='#ffffff' w='*' h='1' /> */}
                                                <pay-layout w="*" h="auto"
                                                    name="超级福袋"
                                                    src="{{img_zfb}}"
                                                    label="推荐"
                                                    subtitle="数人都在用 , 安全可托付"
                                                    onClick="pay_bnt_color1()"
                                                />
                                                <pay-layout w="*" h="auto"
                                                    name="普通福袋"
                                                    src="{{img_wx}}"
                                                    label="正常"
                                                    subtitle="诚信1 + 1 , 运行稳定可靠"
                                                    onClick="pay_bnt_color2()"
                                                />
                                                {/* <View margin='0 1 0 1' bg='#ffffff' w='*' h='1' /> */}
                                            </vertical>

                                        </vertical>
                                    </linear>
                                    <View margin='0 1 0 1' bg='#ffffff' w='*' h='1' />
                                    <linear margin="10 10 20 10"  >

                                        <text textSize="16sp" textColor="#000000" text="总参与领取福袋" w="auto" />
                                        <input gravity="center" textSize="16sp" textColor="#009688" id="count" inputType="text" text="" w="60" />
                                        <text textSize="16sp" textColor="#000000" text="次后停止运行" w="auto" />

                                    </linear>
                                </vertical>
                            </card>
                            <card margin="3 30" cardElevation="0" cardCornerRadius="10" cardBackgroundColor="#AFEEEE" alpha="{{alpha}}" >
                                <button alpha="1" bg="#AFEEEE" textColor="#000000" id="start">开启悬浮窗</button>
                            </card>
                        </vertical>
                    </ScrollView>
                </frame>

            </viewpager>
        </vertical>
    </drawer>
);

// ==================
run_type = "超级福袋"
function pay_bnt_color1() {
    run_type = "超级福袋"
    ui.run(function () {

    })
}
function pay_bnt_color2() {
    run_type = "普通福袋"
    ui.run(function () {

    })
}

ui.tv_text.setSelected(true);//设置文字滚动状态
读取界面配置(true)
//右上角设置
activity.setSupportActionBar(ui.toolbar);
//创建选项菜单(右上角)
ui.emitter.on("create_options_menu", menu => {
    menu.add("日志");
});
//监听选项菜单点击
ui.emitter.on("options_item_selected", (e, item) => {
    switch (item.getTitle()) {
        case "日志":
            app.startActivity("console");
            break;
    }
    e.consumed = 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("dy_cf"));
        }
        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) {
        events.removeAllKeyDownListeners("volume_up")
        // 屏蔽音量键调节声音
        events.setKeyInterceptionEnabled("volume_up", true);
        events.observeKey();
        //监听音量键按下
        events.onKeyDown("volume_up", () => {
            exit()
        });

        threads.start(function () {
            日志显示(0, 屏幕高度 * 0.7, true)
        })
        悬浮创建 = 1
    }
    // home()
    toast('脚本转入后台')
    // app.launchApp("抖音")
});

function Main() {
    let number = 0
    // 记时开始
    let timeStart = timeStamp();
    dlog("当前版本:" + getVerName(app.getPackageName('抖音')) + '    执行分钟:  ' + 0 + '  /  ' + myapp.time + '    参与次数:  ' + 0 + '  /  ' + myapp.count);
    jlog('执行功能:抖音福袋')
    //判断主页
    while (true) {
        if (!desc("更多面板 按钮").visibleToUser().exists()) {
            jlog('请在直播间运行')
        } else { break }
        sleep(1500)
    }

    while (true) {
        jlog("抖音直播间已打开")
        sleep(3000)
        if (!descContains('超级福袋').visibleToUser().exists()) {
            swipe_downUp(true)
            sleep(3000)
            jlog("未发现超级福袋")
        } else {
            jlog("超级福袋......")
            sleep(1000)
            break
        }
    }
    // =========================

    while (true) {
        if (desc('活动已结束').visibleToUser().exists()) { back(); clog('活动结束,返回'); }
        sleep(300)
        if (descContains('参与成功').visibleToUser().exists()) { back(); jlog('参与成功,等待开奖'); }
        sleep(300)
        if (descContains('我知道了').visibleToUser().exists()) { back(); clog('我知道了,返回'); }
        sleep(300)
        if (desc('一键发表评论').visibleToUser().exists()) {
            clickCoords('desc', '一键发表评论', true);
            clog('一键发表评论');
            ++number
        }

        sleep(300)
        if (descContains('超级福袋').visibleToUser().exists()) { clickCoords('desc', '超级福袋', true); jlog('点击超级福袋'); }
        var timeUp = timeStamp();
        var record = timeUp - timeStart
        dlog("当前版本:" + getVerName(app.getPackageName('抖音')) + '    执行分钟:  ' + (record / 60).toFixed(1) + '  /  ' + myapp.time + '    参与次数:  ' + number + '  /  ' + myapp.count);
        if (number >= parseInt(myapp.count)) {
            sleep(300)
            tlog('停止运行')
            console.hide()
            alert("运行完毕");
            sleep(300)
            exit()
            return
        }
    }
}

function 普通福袋() {
    let number = 0
    // 记时开始
    let timeStart = timeStamp();
    dlog("当前版本:" + getVerName(app.getPackageName('抖音')) + '    执行分钟:  ' + 0 + '  /  ' + myapp.time + '    参与次数:  ' + 0 + '  /  ' + myapp.count);
    jlog('执行功能:抖音普通福袋')
    //判断主页
    while (true) {
        if (!desc("更多面板 按钮").visibleToUser().exists()) {
            jlog('请在直播间运行')
        } else { break }
        sleep(1500)
    }

    while (true) {
        jlog("抖音直播间已打开")
        sleep(3000)
        if (!descStartsWith('福袋').visibleToUser().findOnce()) {
            swipe_downUp(true)
            sleep(3000)
            jlog("未发现普通福袋")
        } else {
            jlog("福袋......")
            sleep(1000)
            break
        }
    }
    // =========================
    while (true) {
        if (desc('活动已结束').visibleToUser().exists()) { back(); clog('活动结束,返回'); }
        sleep(300)
        if (descContains('参与成功').visibleToUser().exists()) { back(); jlog('参与成功,等待开奖'); }
        sleep(300)
        if (descContains('我知道了').visibleToUser().exists()) { back(); clog('我知道了,返回'); }
        sleep(300)
        if (textContains('已参与').visibleToUser().exists()) { back(); clog('已参与,返回'); }

        sleep(300)
        if (textContains('去发表评论').visibleToUser().exists()) {
            clickCoords('text', '去发表评论', true);
            sleep(2000)
            clickCoords("desc", '发送', true)
            clog('去发表评论');
            ++number
        }

        sleep(300)
        if (descStartsWith('福袋').visibleToUser().findOnce()) { 
            var w = descStartsWith('福袋').visibleToUser().findOnce().bounds()
            click(w.centerX(), w.centerY())
            sleep(500)
            jlog('点击福袋'); 
        }
        var timeUp = timeStamp();
        var record = timeUp - timeStart

        dlog("当前版本:" + getVerName(app.getPackageName('抖音')) + '    执行分钟:  ' + (record / 60).toFixed(1) + '  /  ' + myapp.time + '    参与次数:  ' + number + '  /  ' + myapp.count);

        if (number >= parseInt(myapp.count)) {
            sleep(300)
            tlog('停止运行')
            console.hide()
            alert("运行完毕");
            sleep(300)
            exit()
            return
        }
    }
}


//下滑
function swipe_downUp(Vertical) {
    let x = device.width / 2
    let y1 = parseInt(device.height * 0.8)
    let y2 = parseInt(device.height * 0.1)
    if (Vertical) {
        gesture(random(500, 800), [x + random(-30, 30), y1], [x + random(-30, 30), y1 - 200], [x + random(-20, 20), y1 - 400], [x + random(-20, 20), y2])
    } else {
        gesture(random(500, 800), [x + random(-30, 30), y2 + 100], [x + random(-30, 30), y2 + 300], [x + random(-20, 20), y2 + 500], [x + random(-20, 20), y1])
    }

}

function timeStamp() {
    return Date.parse(new Date()) / 1000;
}

//随机秒数
function getRandom(min, max) {
    // console.log("停留:" + random(parseInt(min), parseInt(max)) + " 毫秒");
    return random(parseInt(min), parseInt(max))

}
function clickCoords(type, value, isContain) {
    if (isContain) {
        switch (type) {
            case "id":
                try {
                    var w = idContains(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            case "text":
                try {
                    var w = textContains(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            case "desc":
                try {
                    var w = descContains(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            default:
                return false
        }
    } else {
        switch (type) {
            case "id":
                try {
                    var w = id(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            case "text":
                try {
                    var w = text(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            case "desc":
                try {
                    var w = desc(value).visibleToUser().findOnce().bounds()
                    click(w.centerX(), w.centerY())
                    sleep(500)
                    return true
                } catch (e) { console.log(e); return false }
            default:
                return false
        }
    }

}

//软件版本
function getVerName(package_name) {
    let pkgs = context.getPackageManager().getInstalledPackages(0).toArray();
    for (let i in pkgs) {
        if (pkgs[i].packageName.toString() === package_name) return pkgs[i].versionName;
    }
}

//===============
function 日志显示(x, y, is) {
    if (typeof x != 'number') x = 0;
    if (typeof y != 'number') y = 10;
    let floatyLogW = floaty.rawWindow(
        <card id="main" marginLeft="3" h="150" cardBackgroundColor='#b3000000' cardCornerRadius="8dp" cardElevation="1dp" gravity="center_vertical">
            <vertical padding="5 5 5 0" w='*'>
                <button layout_gravity="center" id='顶层显示' textSize="11dp" textColor="#20B2AA" style="Widget/AppCompat.Button.Borderless" textStyle='bold'
                    layout_width="wrap_content" layout_height="15dp" />
                <button gravity="center_horizontal" textColor="#DC143C" w="*" h="13" textStyle='bold' marginBottom="3" />
                <vertical padding="5 0">
                    <button id='log1' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log2' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log3' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log4' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log5' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log6' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />

                    <button id='log7' textSize="12dp" textColor="#FFF5EE" style="Widget/AppCompat.Button.Borderless" textStyle='normal'
                        layout_gravity="left" layout_width="wrap_content" layout_height="15dp" />
                </vertical>
            </vertical>
        </card>
    );
    控制按钮 = floaty.rawWindow(
        <vertical h="150">
            <text layout_weight="5" id="启动" textStyle="bold" gravity="center" w="22" text="启动" bg="#00a86b" />
            <text layout_weight="5" id="隐藏" textStyle="bold" gravity="center" w="22" text="日志" bg="#FF8E12" />
            <text layout_weight="5" id="结束" textStyle="bold" gravity="center" w="22" text="结束" bg="#d71345" />
        </vertical>
    );
    let arr = []
    arr[0] = floatyLogW.log1
    arr[1] = floatyLogW.log2
    arr[2] = floatyLogW.log3
    arr[3] = floatyLogW.log4
    arr[4] = floatyLogW.log5
    arr[5] = floatyLogW.log6
    arr[6] = floatyLogW.log7
    let islog = []
    let i = 0
    let thread = null
    tlog = function (msg) {
        msg = '[' + dateFormat(new Date(), "HH:mm:ss") + '] >> ' + msg
        let 余数 = msg.length % 40
        let 运算结果 = parseInt(msg.length / 40)
        if (余数 > 0) {
            运算结果++
        }
        let x = 40
        for (let ii = 0; ii < 运算结果; ii++) {
            let ks = ii * 40
            let js = x
            let obj = {}
            obj.is = msg.slice(ks, js)
            obj.color = colors.rgb(255, 255, 255)
            islog.push(obj);
            x = x + 40
        }
        ui.run(() => {
            let 数组长度 = islog.length
            if (数组长度 > 7) {
                let 裁剪长度 = 数组长度 - 7
                islog = islog.slice(裁剪长度);
                // log('数组长度:' + islog.length)
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            } else {
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            }
        })
    }

    jlog = function (msg) {
        msg = '[' + dateFormat(new Date(), "HH:mm:ss") + '] >> ' + msg
        let 余数 = msg.length % 40
        let 运算结果 = parseInt(msg.length / 40)
        if (余数 > 0) {
            运算结果++
        }
        let x = 40
        for (let ii = 0; ii < 运算结果; ii++) {
            let ks = ii * 40
            let js = x
            let obj = {}
            obj.is = msg.slice(ks, js)
            obj.color = colors.rgb(255, 255, 0)
            islog.push(obj);
            x = x + 40
        }
        ui.run(() => {
            let 数组长度 = islog.length
            if (数组长度 > 7) {
                let 裁剪长度 = 数组长度 - 7
                islog = islog.slice(裁剪长度);
                // log('数组长度:' + islog.length)
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            } else {
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            }
        })
    }

    clog = function (msg) {
        msg = '[' + dateFormat(new Date(), "HH:mm:ss") + '] >> ' + msg
        let 余数 = msg.length % 40
        let 运算结果 = parseInt(msg.length / 40)
        if (余数 > 0) {
            运算结果++
        }
        let x = 40
        for (let ii = 0; ii < 运算结果; ii++) {
            let ks = ii * 40
            let js = x
            let obj = {}
            obj.is = msg.slice(ks, js)
            obj.color = colors.rgb(255, 0, 0)
            islog.push(obj);
            x = x + 40
        }
        ui.run(() => {
            let 数组长度 = islog.length
            if (数组长度 > 7) {
                let 裁剪长度 = 数组长度 - 7
                islog = islog.slice(裁剪长度);
                // log('数组长度:' + islog.length)
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            } else {
                for (let s = 0; s < islog.length; s++) {
                    arr[s].setTextColor(islog[s].color)
                    arr[s].text('  ' + islog[s].is)
                    if (is) log(islog[s].is)
                }
            }
        })
    }

    dlog = function (printContent) {
        ui.run(() => {
            // floatyLogW.顶层显示.setTextColor(colors.parseColor("#c37e00"))
            floatyLogW.顶层显示.text('  ' + printContent)
        })
    }

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

    ui.run(() => {
        floatyLogW.setTouchable(false);
        floatyLogW.setSize(-1, -2);
        floatyLogW.setPosition(3000, 3000)
        控制按钮.setPosition(0, y);
        控制按钮.结束.click(() => {
            toast("结束脚本运行");
            exit()
        });
        控制按钮.隐藏.click(() => {
            if (控制按钮.隐藏.text() == "隐藏") {
                floatyLogW.setPosition(3000, 3000)
                控制按钮.隐藏.setText("日志")
                控制按钮.隐藏.attr("background", "#FF8E12");
            } else if (控制按钮.隐藏.text() == "日志") {
                控制按钮.隐藏.setText("隐藏")
                控制按钮.隐藏.attr("background", "#d1c7b7");
                floatyLogW.setPosition(x + 20, y);
            }
        });
        控制按钮.启动.click(() => {
            if (thread ? !thread.isAlive() : true) { //线程没有运行。
                控制按钮.启动.setText("暂停");
                控制按钮.启动.attr("background", "#05a7f4");
                //新建一个线程,赋值给变量thread
                thread = threads.start(function () {
                    try {
                        if(run_type == "超级福袋") {
                            Main();
                        } else {
                            普通福袋();
                        }
                        
                    } catch (e) { console.log("程序启动失败");console.log(e) };
                    //运行完毕修改按钮文字
                    ui.run(() => { 控制按钮.启动.setText("启动"); })

                });
            } else {
                thread.interrupt();
                //中断线程;
                控制按钮.启动.setText("启动");
                控制按钮.启动.attr("background", "#00a86b");
            };
        });
    })
};

//====================
function 保存界面配置() {
    //  执行数
    保存本地数据(myapp.存储标识, "count", ui.count.text())
};

function 读取界面配置(是否设置组件值) {   //逻辑值 是否设置组件值
    // 点赞数
    if (读取本地数据(myapp.存储标识, "count") != undefined) {
        myapp.count = 读取本地数据(myapp.存储标识, "count")
    };
    是否设置组件值 && ui.count.setText(myapp.count);
};
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
};