别再让我帮你盖楼了行不?给个脚本自动盖楼领喵币

这几天,双十一的活动有没有把你折腾的不轻呢?如果没有,只有两种可能:一,你没女朋友;二,你没有女性朋友,不然你一定会收到如下消息

要知道阿里每年都会发放大量红包、各种优惠券和各种互助游戏......而这两天,马爸爸的“ATM”们可都沉迷于这些个互助游戏里不可自拔,吾日三省吾身:签到了?做任务了么?升级了么?:

一般我们程序员对这种游戏都是没什么太大兴趣,毕竟每天都有找不完的Bug,加不完的班,但是假如在这时候你的女神向你求帮助的时候,就你那个等级你拿的出手么?

所以,程序员怎么能错过这么一个在女神面前展现专业能力的时候呢,这不,今天猿妹就在GitHub上发现,有程序员写了一个小脚本,可以每天自动做任务,领喵币,这下帮女神盖楼,再也不用担心等级低了:

可以看出来目前这个小脚本还没有引起程序员的注意,一个星星都还没获得(GitHub地址:https://github.com/sleepybear1113/taobaoVisitingVenues)

其实,这个脚本并不难,基于auto.js框架来实现,auto.js是一个支持无障碍服务的Android平台上的JavaScript IDE,以控件为基础,能自动运行一些操作,实现悬浮窗录制和运行。所以这个脚本只支持安卓系统。
详细的脚本代码如下:

let deviceWidth = device.width;
let deviceHeight = device.height;

function openBeginningBtnItem(delay) {
    let items = textStartsWith("gif;base64").depth(19).find();
    console.log("寻找--领喵币");
    if (items.length > 0) {
        let item = items[items.length - 1];
        console.log("点击--领喵币");
        clickItemInCenter(item);
        sleep(delay);
        return 1;
    }
    return -1;
}

function isOpenBeginning() {
    let signIn = textContains("签到").findOnce();
    if (signIn != null) {
        console.log("成功--打开领取中心");
        return 1;
    }
    return -1;
}

function ensureOpenBeginning(waitDelay) {
    if (isOpenBeginning() === -1) {
        openBeginningBtnItem(waitDelay);
    }
    if (isOpenBeginning() === 1) return 1;

    console.error("失败--打开领取中心");
    toast("失败--打开领取中心");
    return -1;
}

function clickItemInCenter(item, time) {
    if (time == null) time = 50;
    if (item == null) return;
    let x = item.bounds().centerX();
    let y = item.bounds().centerY();
    press(x, y, time);
}

function goShopping() {
    let shopping = text("去浏览").findOne(1000);
    if (shopping == null) {
        toastLog("结束--未知问题");
        return -1;

    }
    console.log("开始浏览...");
    clickItemInCenter(shopping);
    return 1;
}

function swipeUp() {
    let x = parseInt(deviceWidth / 2);
    let duration = 500;
    let y = [parseInt(deviceHeight * 0.75), parseInt(deviceHeight * 0.25)];
    swipe(x, y[0], x, y[1], duration);
    swipe(x, y[0], x, y[1], duration);
}

function isFull() {
    for (let i = 0; i < 10; i++) {
        if (descContains("已达上限").findOnce() || textContains("已达上限").findOnce()) {
            console.log("今日已达上限");
            return 1;
        }
        sleep(1000);
    }
    return 0
}

function waitSwipe() {
    let swipeAppear;
    let shoppingFull;
    for (let i = 0; i < 3; i++) {
        swipeAppear = desc("滑动浏览得").findOne(1000);
        if (swipeAppear != null) break;
        shoppingFull = descContains("已达上限").findOne(1000);
        if (shoppingFull != null) return 0;
        console.log("i" + i);
    }

    sleep(1000);

    if (swipeAppear != null) {
        console.log("开始滑动");
        swipeUp();
        console.log("等待15s");
        sleep(1000 * 16);
    } else {
        console.log("slow");
        console.log("等待20s");
        sleep(1000 * 20);
    }

    let shoppingFinish = desc("任务完成").findOne(2000);
    if (shoppingFinish != null) {
        console.log("逛完,准备返回");
    } else {
        toastLog("未知逛完,返回");
    }

    return 1;
}

function browseFinish() {
    for (let i = 0; i < 10; i++) {
        let normalFinishDesc = descContains("已获得").findOnce();
        let normalFinishText = textContains("已获得").findOnce();
        let swipeFinish = desc("任务完成").findOnce();

        if (normalFinishDesc != null || swipeFinish != null || normalFinishText != null) {
            console.log("浏览结束");
            return 0;
        }
        sleep(250);
    }

    console.log("浏览未知");
    return -1;
}

function judgeWay() {
    let timeOut = 1000 * 7;
    let delay = 250;
    let loops = parseInt(timeOut / delay);
    for (let i = 0; i < loops; i++) {
        let swipeAppearDesc = descContains("滑动浏览得").findOnce();
        let swipeAppearText = textContains("滑动浏览得").findOnce();
        if (swipeAppearDesc != null || swipeAppearText != null) {
            console.log("已获取到滑动浏览模式");
            return 0;
        }

        let directBrowseDesc = desc("浏览").findOnce();
        let directBrowseText = text("浏览").findOnce();
        if (directBrowseDesc != null || directBrowseText != null) {
            if (descContains("00喵币").findOnce() != null || textContains("00喵币").findOnce() != null) {
                console.log("已获取到正常浏览模式");
                return 1;
            }
        }

        sleep(delay);
    }

    console.log("超时");
    return -1;
}

function reopenAgain() {
    console.log("reopen");
    let tbs = id("taskBottomSheet").findOnce();
    if (tbs == null) return -1;
    let close = tbs.child(1);
    if (close != null) {
        console.log("关闭");
        clickItemInCenter(close);
        sleep(1000);
        return ensureOpenBeginning(1000);
    }
    return -1;
}

function runGoShopping() {
    let isSuccess;

    for (let i = 0; i < 20; i++) {
        isSuccess = ensureOpenBeginning(1000);
        if (isSuccess !== 1) break;
        isSuccess = goShopping();

        let count = 0;
        while (isSuccess !== 1) {
            if (reopenAgain() === 1) {
                isSuccess = 1;
                break;
            }
            if (count++ >= 2) break;
        }

        if (isSuccess === -1) break;

        let st = waitSwipe();
        if (st === 0) {
            toastLog("已达上限,结束脚本");
            return 0;
        }

        back();
        sleep(1000);
    }

    if (isSuccess === 0) {
        toastLog("正常结束");
        return 0;
    } else if (isSuccess === -1) {
        toastLog("异常结束");
        return 1;
    }
}

function clickGoBrowse() {
    let browse = text("去浏览").findOne(1000);
    if (browse != null) {
        let guessYouLike = textContains("猜你喜欢").findOnce();
        if (guessYouLike != null) {
            console.log("出现猜你喜欢");
            let pp = browse.parent.bounds().top;
            let ppp = guessYouLike.parent.parent.bounds().top;
            if (ppp === pp) {
                console.log("跳过--猜你喜欢");
                let allBrowse = text("去浏览").find();
                for (let i = 0; i < allBrowse.length; i++) {
                    let item = allBrowse[i];
                    if (item.bounds().top !== browse.bounds().top) {
                        browse = item;
                    }
                }
            }
        }

        console.log("点击--去浏览");
        clickItemInCenter(browse);
        return 1;
    }
    return -1;
}

function runGoBrowse() {
    let isSuccess = 1;

    for (let i = 0; i < 40; i++) {
        isSuccess = ensureOpenBeginning(1000);
        if (isSuccess !== 1) break;

        for (let j = 0; j < 3; j++) {
            isSuccess = clickGoBrowse();
            if (isSuccess !== 1) {
                reopenAgain();
            } else break;
        }

        if (isSuccess === -1) break;

        let jw = judgeWay();

        sleep(1000);
        if (jw === 0) swipeUp();
        else if (jw === -1) {
            if (isFull() === 1) {
                console.log("已达上限");
                back();
                sleep(2000);
                reopenAgain();
                continue;
            }
            console.log("4s");
            sleep(1000 * 4);
        }
        console.log("15s");
        sleep(1000 * 15);

        let isF = browseFinish();
        if (isF === 0) {
            console.log("浏览结束,返回");
        } else if (isF === -1) {
            console.log("浏览未正常结束,返回");
        }

        back();
        sleep(2000);
    }
}

function removeFile(fileName) {
    if (files.exists(fileName)) {
        files.remove(fileName);
    }
}

function clearNewScript() {
    threads.start(function () {
        removeFile("/sdcard/脚本/淘宝喵币/script.js");
        removeFile("/sdcard/脚本/淘宝喵币/version.txt");
        toastLog("清除完成");
    });
}

function warning(n) {
    let items = ["不更新,但还是试试新脚本(不保证能用)", "清除本地下载的新脚本,使用默认脚本", "点击这里下载新APP"];

    let ch = dialogs.select("当前新版本不适用于此旧APP,请更新到新APP。", items, function (index) {

        if (index >= 0) {

            if (index === 0) {

                threads.start(function () {
                    sleep(1000);
                    runRun(n);
                });

            } else if (index === 1) {
                clearNewScript();
            } else if (index === 2) {
                alert("哪里下载的旧APP就去哪里下载新APP,我可没心思发布");
            }
        }
    });
}

function runRun(n) {
    sleep(500);

    let statue = runGoBrowse();
    toastLog("去浏览--浏览结束");
    alert("结束");
}

function moveFloating(n) {
    let i = -1;
    dialogs.confirm("由于需要,请将悬浮窗移动至靠左。", "点击确认表示已完成,直接运行脚本。\n点击取消则手动前去调整。\n" +
        "(中间浏览过程中可能会跳转到淘宝首页进行浏览,此时需要手动再次切回猫铺。)", function (clear) {
        if (clear) {
            console.log("直接运行");
            i = 1;
        } else {
            toastLog("请将悬浮窗移动至靠左");
            i = 0;
        }
    });

    while (i === -1) {
        slepp(100);
    }
    if (i === 1) {
        runRun(n);
    }
}

function runChoose(n) {
    let currentVersion = app.versionCode;
    if (currentVersion === 1) {
        warning(n);
    } else {
        moveFloating(n);
    }
}

module.exports = runChoose;

如果你不懂的话,就直接下载使用,记得开启悬浮窗,然后再切换到淘宝:

就完成自动刷楼啦!

作者:全栈开发者社区

更多资料关注公众号全栈开发者社区

原文地址:https://www.cnblogs.com/mumu2/p/11831114.html

时间: 2024-10-01 04:29:49

别再让我帮你盖楼了行不?给个脚本自动盖楼领喵币的相关文章

【非月结贴】.NET开发者不要再抱怨.NET工资了,你真的行吗?--从一个刚入行不久的角度看.NET工资

最近博客园里面很多人都说.NET不行,其实你们说的.NET不行也就是说.NET的工资比不上Java,PHP,移动开发等 本人性格还没有修炼到淡定,所以下面可能屡有偏激狂妄之词,也请同仁多多海涵. 咱们大多数人搞开发都是要赚钱养家的.我们都不说是为了中华软件而崛起的口号而编码,这样的口号我也喊不出来. 我们都是为了工资,为了赚钱养家.兴趣也是一部分.看了博客园这些喷.NET的文章,在这里我也想站在一个刚入门的人的立场上来谈一下这个问题 本人作为一个大四软件工程专业的学生,刚入行不久,.NET从大一

昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别?

Handler就是android中一个机制,主要是考虑到线程安全的! Handler是可以实现线程间通信的,LZ知道Android的UI线程不安全的吧,也就是说不可以在UI线程以外的其他线程对UI进行更新设置操作,但是有时候又不能再UI主线程进行一些耗时操作,那样UI会响应很迟钝的,这时候就会新开一个线程,新开的线程可以通过Handler来把处理的结果由消息传回UI主线程,在UI主线程里进行相关的UI更新等等~ 问: 还是有些不明白,意思是如果我自己写一个线程,把UI传进去,那再新线程中是不能操

datagrid 选中某行,翻页再翻回来,发现选中的行没有选中

不管有没有设置复选框,其实都是一样的,都是idField属性没有设置,加上去即可. 1 $(function(){ 2 $('#dg').datagrid({ 3 url:'ContactServlet', 4 toolbar:'#tb', 5 fit:true, 6 fitColumns:true, 7 rownumbers:true, 8 pagination:true, 9 idField : 'id',//没有设置,就会出现翻页不选中 10 columns:[[ 11 {field:'i

Windows PowerShell adb : 无法将“adb”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + adb devices

在 Windows PowerShell 中执行adb version命令出现错误: 原因是在任何Windows PowerShell路径中,空字符或空格都需要用一组引号或括号括起来 例如:adb "version" adb "devices" 原文地址:https://www.cnblogs.com/ymbd/p/10966555.html

Auto.js淘宝领喵币

最近,淘宝的新玩法,一直在充斥我的眼球,尤其是喵币的,盖楼... .... 于是就进去看了看,发现逛逛店铺,给好多喵币,但是要进20个,每个要15秒,好麻烦,于是就上网搜了一下,有没有脚本 因为之前搞过Selenium自动填写问卷调查-_-! 想想这个应该也不难吧! 早起看了一下,发现这个活动好像只有手机端的,有些悲催了,不过我发现了另外一个好玩的,Auto.js,简直是手机端的Selenium. 同时也发现了大佬写的领喵币的脚本-传送门 表示已经领完了,代码也拜读了一下,好玩 但是由于手机型号

学习web前端课程必掌握技能总结

前端开发是近几年来兴起的新兴行业,是IT行业中要求相对较低的职业,同时就业薪资相对较高,很多人通过参加web前端培训实现了高薪就业梦,那web前端课程到底包括哪些技术呢? Web前端开发技术包括三个要素:HTML.CSS和JavaScript,但随着RIA的流行和普及,Flash/Flex.Silverlight.XML和服务器端语言也是前端开发工程师应该掌握的.随着时代的发展,前端开发技术的三要素也演变成为现今的:html5,css3,jquery. 学习html,这个是最简单的,也是最基础的

“评论盖楼”的设计思路

这样的需求其实挺特殊,每个“楼”都是一个独立的“树”,每个“楼”都“几乎”不用依赖其他的“楼”. 最简单.最高效的方式是用文件来存 储每一个楼,每个新闻一个楼,使用xml.json等树形结构的文件格式来规范评论和新闻内容.这样每进一个楼只需要访问一个文件,发评论只是创建一个文 件,把楼盖高,只是给增加新内容.而新闻列表可以存储在数据库中,也可以用lucene做索引. 如果一定要用数据库实现,那么新闻(主贴)做一张表,评论(回贴)做一张表,评论表中添加新闻id字段作为与新闻表的外键关联即可.如果要

寒门再难出贵子

在越来越看清楚“性格决定命运”,性格这东西是熔透与骨髓的,性格的养成和学校教育没有多大关系,大多决定与家庭背景,和成长环境...从大学毕业出来的第一步往往起到至关作用的是家庭背景,也就是从起跑线普通家庭的孩子就输了一大截..  在一个物欲横流的时代,当金钱决定一切,成为人得终极信仰的时候,这时候也是“门阀”,阶层相应出现的年代. 结合我自己近半年来的观察, 我在商业银行人力资源部上班,去年年招了很多学校的实习生,实习可不是正式录用了,以前自己年龄也相对年轻,没有太多关注以往的实习生,今年正好我负

人生路上要念的那些经——转载《寒门再难出贵子》

写在前面的话 这篇文章我很熟悉,第一次读是在去徐医的动荡公交车上,我一口气看完才下的车.不管真实与否.有没有添油加醋,它是那么的吸引人,他像一把刀,毫不客气地剥开这个社会,不管里边是鲜活的肌肉还是恶性肿瘤.前几天跟恩庭在宿舍聊天再次说起来,觉得很有必要跟大家分享一下,因为这个社会不是一杯单纯的鲜牛奶,更不是一碗暖心的鸡汤,而是一锅纷杂的八宝粥.转载仅供大家参考,不代表本人观点,大家仁者见仁智者见智. 寒门在难出贵子 --永乐大帝二世 现在越来越看清楚"性格决定命运",性格这东西是熔透于