用Github上的高星專案,告訴你程式設計師過雙十一的正確姿勢

beyondma發表於2020-02-01

馬上到“雙十一”了,今年天貓推出了瓜分紅包的活動,可以通過瀏覽店鋪等方式賺取喵幣,為記得更多獲取紅包的機會,而筆者做為程式設計師不願意在京東、天貓上浪費時間。就到Github上去逛了逛,沒想到發現一個可以自動刷喵幣的專案,筆者親測成功,現在把攻略推薦給大家。這個專案整體上說和我之前那個《如何用爬蟲技術幫助孩子秒到心儀的幼兒園》https://blog.csdn.net/BEYONDMA/article/details/87902276的思路類似,都是使用自動按鍵的方式來達到與人工點選相同的效果,並且防止底層的注入帶來的風險。雖然實現不難,但是思路很好。

1.使用攻略

1.下載安裝包

到github上把相關的安裝包下載到手機上https://github.com/sleepybear1113/taobaoVisitingVenues/blob/master/%E6%B7%98%E5%AE%9D%E5%96%B5%E5%B8%81_v1.1.0.apk

2.嵌入懸浮視窗許可權,這個各個手機不一樣,程式安裝完成後一般都有正確揭示。

3.選擇功能方式:啟動程式,這時會有懸浮視窗出現,先在選擇功能項中選擇“去瀏覽+去逛店”的方式。

4.開啟淘寶,進入喵幣頁面:一般每天首次登陸淘寶APP的“雙十一合夥人”也就是攢喵幣的頁面時,都會有彈出有以下頁面。這個頁面需要大家手工關閉後APP才能正常開始。

 4.點選啟動:在懸浮窖上點選開始,就能自動逛淘寶得喵幣了。

5.程式結束:程式執行完成後就自動退出了。

 

2.程式碼初探

本身這個專案是基於auto.js pro 7.0,其實就是手機版本的按鍵精靈。其中主邏輯都在https://github.com/sleepybear1113/taobaoVisitingVenues/blob/master/src_code/script.js這個指令碼中實現,擷取主要部分說明如下:

toastLog("開始");


/**
 * 點選領喵幣的按鈕
 * @param delay 點選之後延遲多久進行下一個函式
 * @returns {number}
 */
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;
    }


    if (items.length === 0) {
        let go = text("領喵幣").findOne(1000);
        if (go != null) {
            console.log("點選--領喵幣");
            clickItemInCenter(go);
            sleep(delay);
            return 1;
        }
    }
    return -1;
}

/**
 * 判斷是否開啟領取中心
 * @returns {number}
 */
function isOpenBeginning() {
    let signIn = textContains("簽到").findOnce();
    if (signIn != null) {
        console.log("成功--開啟領取中心");
        return 1;
    }
    return -1;
}

/**
 * 確保開啟領取中心
 * @param waitDelay
 * @returns {number}
 */
function ensureOpenBeginning(waitDelay) {
    if (isOpenBeginning() === -1) {
        openBeginningBtnItem(waitDelay);
    }
    if (isOpenBeginning() === 1) return 1;

    console.error("失敗--開啟領取中心");
    toast("失敗--開啟領取中心");
    return -1;
}

function checkIn(flag) {
    console.log("判斷店鋪簽到");
    if (flag === true) {
        let getMoney = desc("簽到領喵幣").findOne(500);
        if (getMoney != null) {
            clickItemInCenter(getMoney);
            console.log("點選簽到");
            sleep(2000);

            let happyToGet = desc("開心收下").findOnce();
            clickItemInCenter(happyToGet);
            console.log("店鋪簽到獲得喵幣");
            sleep(500);
        }
    }

}

/**
 * 向上滑動
 */
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);
}

/**
 * 逛店有沒有滿
 * @returns {number}
 */
function isFull() {
    for (let i = 0; i < 10; i++) {
        if (descContains("已達上限").findOnce() || textContains("已達上限").findOnce()) {
            console.log("今日已達上限");
            return 1;
        }
        sleep(200);
    }
    return 0
}

/**
 * 執行瀏覽結束的判斷操作
 * @returns {number}
 */
function browseFinish() {
    for (let i = 0; i < 10; i++) {
        let normalFinishDesc = descContains("已獲得").findOnce();
        let normalFinishText = textContains("已獲得").findOnce();
        let swipeFinishDesc = descContains("任務完成").findOnce();
        let swipeFinishText = textContains("任務完成").findOnce();

        if (normalFinishDesc != null || swipeFinishDesc != null || normalFinishText != null || swipeFinishText != null) {
            console.log("瀏覽結束");
            return 0;
        }
        sleep(250);
    }

    console.log("瀏覽未知");
    return -1;
}

/**
 * 判斷進入瀏覽的時候是否需要滑動
 * @returns {number}
 */
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;
}

/**
 * 關閉領取中心再開啟
 * @returns {number}
 */
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(2000);
    }
    return -1;
}

/**
 * 點選-去瀏覽 按鈕
 * @returns {number}
 */
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 < 50; i++) {
        isSuccess = ensureOpenBeginning(2000); // 開啟領取中心
        if (isSuccess !== 1) break; //開啟失敗就 -1

        // 每 5 次重新開關領取中心進行重新整理
        if (i % 5 === 0) {
            reopenAgain();
        }

        // 點選去瀏覽,如果沒找到 去瀏覽 的按鈕,那就關閉領取中心再開啟,三次
        for (let j = 0; j < 3; j++) {
            isSuccess = clickGoBrowse();
            if (isSuccess !== 1) {
                reopenAgain();
            } else break;
        }

        if (isSuccess === -1) break; //如果 3 次之後還是不行,那就 -1

        toastLog(i);

        let jw = judgeWay(); //去瀏覽之後,判斷是不是滑動瀏覽。這裡最多延時 7s

        sleep(1000);

        // 進行滑動。如果是滑動的話,就是店鋪,判斷是否有店鋪簽到的操作。
        if (jw === 0) {
            checkIn(isCheckIn);
            swipeUp();
        } else if (jw === -1) { //如果沒有滑動瀏覽,那就可能不需要,或者瀏覽到上限了
            if (isFull() === 1) { // 這裡的最多延時 2s
                console.log("已達上限");
                backToBefore();
                reopenAgain();
                continue;
            }
        }


        // 這裡通過不同的情況區分不同的延時
        if (jw === -1) {
            sleep(1000 * 10);
            console.log("10s");

        } else {
            sleep(1000 * 14);
            console.log("14s");
        }




        let isF = browseFinish(); //右下角是否出現瀏覽完成類似的字樣。最多延時 2.5s
        if (isF === 0) {
            console.log("瀏覽結束,返回");
        } else if (isF === -1) {
            console.log("瀏覽未正常結束,返回");
        }

        backToBefore();
    }
}

以上就是我今天在Github上看到的驚喜,不知道對於各位讀者能否有幫助。

 

 

相關文章