马上到“双十一”了,今年天猫推出了瓜分红包的活动,可以通过浏览店铺等方式赚取喵币,为记得更多获取红包的机会,而笔者做为程序员不愿意在京东、天猫上浪费时间。就到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上看到的惊喜,不知道对于各位读者能否有帮助。