別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

目錄

  • 煩人的前奏
  • 用代碼自動蓋樓
  • 如何使用
  • 技術分析

煩人的前奏

私信我回復:蓋樓apk 即可獲取文中的軟件安裝包

最近雙十一,想必你一定會收到以下信息:

別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

最怕的是,你收到了女神的求助信息,你幫也不是,不幫也不是。

別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

用代碼自動蓋樓

要告訴你的好消息是,勤奮的程序員小哥哥已經開發出使用代碼來進行蓋樓的程序了。

一開始還沒有人關注這個APP,慢慢地蓋樓的人多了,這個項目也就火起來了,現在已經有 770 多個 start 了。

別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

那麼這麼神奇的 APP 是使用了什麼技術呢?這個技術是基於 auto.js 框架來實現的。以控件為基礎,能自動運行一些操作,實現懸浮窗錄製和運行。

使用方法

私信我回復:蓋樓apk 即可獲取文中的軟件安裝包

安裝好 APP 之後,記得開啟懸浮窗

別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

注意事項:你要點到領喵幣那,然後他就會開始自動瀏覽了,但是如果碰到不是瀏覽的任務,它好像就自動結束了,你只能在繼續點開始。好多網友都成功了,你也試試吧?

別再讓我幫你蓋樓了好嗎?用代碼自動蓋樓領喵幣,附APK

技術分析

其核心代碼為:(如果你看不懂的話,直接使用 APK 安裝包就可以了)

toastLog("開始");
let deviceWidth = device.width;
let deviceHeight = device.height;
let isCheckIn = false;
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);
}
/**
* 點擊領喵幣的按鈕
* @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(n) {
console.log("滑動屏幕");
let x = parseInt(deviceWidth / 2);
let duration = 500;
let y = [parseInt(deviceHeight * 0.75), parseInt(deviceHeight * 0.25)];
for (let i = 0; i < n; i++) {
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(n) {
// 尋找-去瀏覽-的按鈕
let browse = text("去瀏覽").findOne(1000);
if (browse != null) {

let guessYouLike = textContains("猜你喜歡").findOnce(); //尋找-猜你喜歡-的按鈕
//如果出現了-猜你喜歡,那就點擊下一個-去瀏覽-的按鈕
if (guessYouLike != null) {
console.log("出現猜你喜歡");
// 這裡判斷控件的 top 座標是否一樣(其實我也不知道直接判斷控件是否一樣行不行)
let pp = browse.parent().bounds().top;
let ppp = guessYouLike.parent().parent().bounds().top;
if (ppp === pp) {
console.log("跳過--猜你喜歡");
let allBrowse = text("去瀏覽").find();
// 如果僅剩下一個-去瀏覽-的按鈕,並且外圈循環重複不到 2 次,那就進行返回 0 進行 reopen()
if (allBrowse.length <= 1 && n <= 1) {
return 0;
}
// 循環找到一個 top 座標不是和-猜你喜歡-一樣的
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 clickSkip() {
let skip = descMatches("^[0-6]\\\\d{0}s$").findOnce();
if (skip != null) {

console.log("滑動跳過");
swipeUp(1);
}else console.log("無廣告");
}
/**
* 循環執行瀏覽操作
*/
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(j);
if (isSuccess !== 1) {
reopenAgain();
} else break;
}
if (isSuccess === -1) break; //如果 3 次之後還是不行,那就 -1
toastLog(i); // 第幾次循環
sleep(2000);
clickSkip(); // 判斷廣告跳過,向上滑動
let jw = judgeWay(); //去瀏覽之後,判斷是不是滑動瀏覽。這裡最多延時 7s
// 進行滑動。如果是滑動的話,就是店鋪,判斷是否有店鋪簽到的操作。
if (jw === 0) {
checkIn(isCheckIn);
swipeUp(2);
} else if (jw === -1) { //如果沒有滑動瀏覽,那就可能不需要,或者瀏覽到上限了

if (isFull() === 1) { // 這裡的最多延時 2s
console.log("已達上限");
backToBefore();
reopenAgain();
continue;
}
}
// 這裡通過不同的情況區分不同的延時
if (jw === -1) {
console.log("10s");
sleep(1000 * 10);
} else {
console.log("14s");
sleep(1000 * 14);
}
let isF = browseFinish(); //右下角是否出現瀏覽完成類似的字樣。最多延時 2.5s
if (isF === 0) {
console.log("瀏覽結束,返回");
} else if (isF === -1) {
console.log("瀏覽未正常結束,返回");
}
backToBefore();
}
}
/**
* 可能存在需要兩次返回的情況
*/
function backToBefore() {
back();
sleep(2000);
let isGoingTo = text("正在前往會場").findOnce();
if (isGoingTo != null) {
back();
sleep(2000);
} else {
isGoingTo = desc("正在前往會場").findOnce();
if (isGoingTo != null) {
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 runRun() {
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 oldVersionWarning(v) {
let items = ["依舊嘗試繼續", "清除本地下載的新腳本,使用默認腳本", "新APP"];
let choice = -10;

dialogs.select("當前新版本可能不適用於此舊APP,請更新到新APP。", items, function (index) {
choice = index;
});
while (choice === -10) {
sleep(100);
}
if (choice === -1) {
toastLog("未選擇!");
} else if (choice === 0) {
if (v <= 6) {
console.log(v);
moveFloating();
}
runRun();
} else if (choice === 1) {
clearNewScript();
} else if (choice === 3) {
alert("暫沒有開放下載新 APP 的功能,請自行下載");
}
}
function versionChoice(v) {
let vv = parseInt(v);
let minSuitVersion = 10;
console.log("適合運行的最低版本" + minSuitVersion);
if (vv < minSuitVersion) {
oldVersionWarning(vv);
} else {
runRun();
}
}
function runChoose(n) {
if (n === 1) isCheckIn = true;
let currentVersion = app.versionCode;
console.log("當前版本:" + currentVersion);
versionChoice(currentVersion);
}
module.exports = runChoose;


分享到:


相關文章: