本帖最后由 xiaolmimzD 于 2021-11-9 14:50 编辑
老更新代码太麻烦了,大家需要的自己下载吧,apk在github自己找咯
来源
作者:czj2369
网址:https://github.com/czj2369/jd_tb_auto
重要说明
JD部分较少任务无法判断是等待还是即刻返回,故有些任务需要等待30S自动返回,后续看能不能解决
JD如果没办法自动进入做任务界面,请手动进入
JD有个别活动是跳过的,比如需要开会员的,比如分享的,还有下单的
TB要先做好新手教程
TB个别活动是跳过的,比如施肥,比如喂鸡,具体看代码的这里忽略的任务
var IGNORE_LIST = ['农场', '芭芭农场','下单','蚂蚁','淘特','小互动','点淘','充话费','参与合伙'];
更新
2021年11月7日
[b]1.[23:03:19]【JDTB】最后一次更新,抱歉哈,这段时间比较忙,然后刚开游戏开了新赛季,就沉迷游戏了,我看着脚本能用就得过且过,没有怎么去做修改,然后再issue里看到有一些热心的大佬帮忙回复也很是感谢,这一次双十一莫名其妙star冲到了一千多个,也是让我惊讶,我没想到会有这么多人使用,也不是大佬哈, 就是写了个比较简单的脚本,能给大家带来便利就很好了,感谢各位的使用~
2021年10月28日
1.[21:58:17]【JD】优化浏览品牌墙活动逻辑(可能还是有问题)
2.[21:58:17]【TB】加入过滤任务:消消乐
2021年10月27日
1.[22:14:01]【JD】添加小程序和浏览品牌墙活动逻辑,因为测试样例不够多,暂时不发包
2021年10月26日
1.[22:22:09]【JDTB】 没大改,旧版依旧可用,进行小优化;去掉JD的参与城城活动(搞不定);TB加入一些过渡操作(比如”我知道了“这类控件)
2021年10月25日
1.[21:53:25]【JDTB】添加音量上键停止脚本,优化部分逻辑;添加apk到release中(发现小服务器顶不住下载的数量。。没想到这么多人)
2021年10月24日
1.[18:01:49]【TB】添加定时纠错功能;添加完成互动游戏;添加掷骰子功能;优化进入任务界面逻辑
2.[21:30:45]【JDTB】提供apk下载地址
2021年10月23日
1.[00:39:47]【JD】去除坐标点击法,发现没办法通用,改了逻辑,互动种草城还有领红包可能需要自己手动,剩下BUG再改了。。测试了两个账号,基本能稳定跑完(中途需要手动完成领红包任务)
2.[23:24:23]【JDTB】更新JDTB
2021年10月22日
1.[00:37:15]【JD】修复已知BUG,以及优化逻辑
2.[13:09:19]【TB】添加喂小鸡忽略任务,修复无法进入活动界面
2021年10月21日
1.[01:02:51]【JD】修复一些bug,目前已知bug:互动种草城和到底部点击商品问题
2.[13:16:49]【TB】TB的任务没做啥更新,我用618的代码修改了一点就能跑了,暂时提交第一版先
3.[20:50:50]【TBJD】修复已知BUG~
2021年10月20日
1.[23:02:50]【JD】提交第一版,目前存在许多BUG!!!
如何关闭
音量上键
其他
1.测试手机型号:Redmi K40
2.JD版本:9.2.0,TB版本:10.5.0
两个代码。先狗东,后某宝
[Asm] 纯文本查看 复制代码 /**
* JD双11赚汪汪币
*
* Author: czj
* Date: 2021/10/20
* Time: 23:02:50
* Versions: 1.9.0
* Github: https://github.com/czj2369/jd_tb_auto
*/
// 需要完成的任务列表
var TASK_LIST = ["浏览并关注", "浏览8s", "累计浏览","浏览并关注可得2000", "浏览可得", "去首页浮层进入", "浏览5个品牌墙店铺", "小程序", "品牌墙店铺","逛晚会页"];
// 过渡操作
var PASS_LIST = ['请选择要使用的应用', '我知道了', '取消', "京口令已复制"];
// 判断停留时间
var JUDGE_TIME = 0;
// 定时器
var interval;
// 已完成序号
var finished_task_num = new Array();
// 当前序号
var current_task_num = 0;
// 浏览就返回标记
var isBackFlag = false;
// 小程序标记
var isXcx = false;
var appName = "com.jingdong.app.mall";
var huodong_indexInParent_num = 9;
// 记录活动页面头部坐标
var headerXY;
init();
/**
* 初始化
*/
function init() {
// 子线程监听脚本
threads.start(function () {
events.setKeyInterceptionEnabled("volume_up", true);
//启用按键监听
events.observeKey();
//监听音量上键按下
events.onKeyDown("volume_up", function (event) {
console.log("脚本退出!")
exit();
});
});
start();
// 子线程开启计时
threads.start(function () {
if (interval == null) {
// 开启计时器,进行卡顿计时
// 启动定时器前,将计数器归为0
JUDGE_TIME = 0;
log("开启定时器");
interval = setInterval(function () {
JUDGE_TIME = JUDGE_TIME + 1;
}, 1000);
}
});
while (true) {
transitioPperation();
enterActivity();
recoverApp();
var flag = getNeedSelector();
viewTask(flag);
addMarketCar();
}
}
/**
* 启动京东
*/
function start() {
auto.waitFor()
if (launch(appName)) {
console.info("启动京东APP");
console.info("author:czj");
console.info("地址:https://github.com/czj2369/jd_tb_auto");
}
console.show();
}
/**
* 进入做任务界面
*/
function enterActivity() {
if (!text("累计任务奖励").exists()) {
sleep(4000);
if (text("累计任务奖励").exists()) {
console.info("已经在任务界面");
sleep(1000);
headerXY = id("a96").findOne().bounds();
} else {
if (desc("浮层活动").exists()) {
console.info("点击浮层活动");
var huodong = desc("浮层活动").findOne().bounds();
randomClick(huodong.centerX(), huodong.centerY());
sleep(1000);
}
// 获取进入做任务界面的控件
var button = className('android.view.View')
.depth(14)
.indexInParent(huodong_indexInParent_num)
.drawingOrder(0)
.clickable();
if (button.exists()) {
console.info("点击进入做任务界面")
var rect = button.findOne().bounds();
randomClick(rect.centerX(), rect.centerY());
sleep(1000);
headerXY = id("a96").findOne().bounds();
} else {
huodong_indexInParent_num = huodong_indexInParent_num + 1;
if (huodong_indexInParent_num == 10) {
console.info("无法自动进入做任务界面,请手动进入!");
huodong_indexInParent_num = 9;
}
}
}
sleep(1000);
}
}
/**
* 去完成任务
* @param {是否点击任务标识} flag
*/
function viewTask(flag) {
// 根据坐标点击任务,判断哪些需要进行
sleep(2000);
while (true && flag) {
if ((textStartsWith("获得").exists() && textEndsWith("汪汪币").exists()) || text("已浏览").exists()) {
console.info("任务完成,返回");
viewAndFollow();
// 重置计时
JUDGE_TIME = 0;
break;
} else if (text("任务已达上限").exists()) {
console.info("任务已达上限,切换已完成按钮");
// 将当前任务序号添加到列表中,防止后续点到
finished_task_num[finished_task_num.length] = current_task_num;
viewAndFollow();
// 重置计时
JUDGE_TIME = 0;
break;
} else if (textContains('会员授权协议').exists()) {
console.info("不授权加入会员,切换已完成按钮");
// 将当前任务序号添加到列表中,防止后续点到
finished_task_num[finished_task_num.length] = current_task_num;
viewAndFollow();
// 重置计时
JUDGE_TIME = 0;
break;
} else if (textContains('当前页点击浏览5个').exists() || textContains('当前页浏览加购').exists()) {
console.info("当前为加入购物车任务");
// 重置计时
JUDGE_TIME = 0;
break;
} else if (text("互动种草城").exists()) {
console.info("当前为互动种草城任务");
// 重置计时
JUDGE_TIME = 0;
if (interactionGrassPlanting()) {
back();
break;
}
break;
} else if (text("到底了,没有更多了~").exists() && !text("消息").exists() && !text("扫啊扫").exists()
&& !(textStartsWith("当前进度").exists() && textEndsWith("10").exists())) {
console.info("到底了,没有更多了~");
sleep(1000);
// 重置计时
JUDGE_TIME = 0;
var count = 0;
while (count <= 5) {
if (undefined === headerXY) {
headerXY = id("a96").findOne().bounds();
}
var rightx = headerXY.right;
var righty = headerXY.bottom + 300;
while (click(rightx, righty)) {
console.info("尝试点击坐标:", rightx, righty);
count = count + 1;
sleep(6000);
if (!text("到底了,没有更多了~").exists()) {
if (id("aqw").click()) {
sleep(2000);
console.info("尝试返回", count);
back();
break;
}
} else {
righty = righty + 50;
}
if(righty >= 800) {
break;
}
}
}
swipe(807, 314, 807, 414, 1);
sleep(2000);
break;
} else if (text("消息").exists() && text("扫啊扫").exists()) {
console.warn("因为某些原因回到首页,重新进入活动界面");
enterActivity();
} else if (text("天天都能领").exists()) {
sleep(2000);
console.info("天天都能领");
// 重置计时
JUDGE_TIME = 0;
var button = className('android.view.View')
.depth(16)
.indexInParent(3)
.drawingOrder(0)
.clickable().findOne().bounds();
if (randomClick(button.centerX(), button.centerY())) {
sleep(1000);
console.log("点我收下");
if (back()) {
break;
}
}
} else if (text("邀请新朋友 更快赚现金").exists()) {
sleep(2000);
console.info("邀请新朋友");
// 重置计时
JUDGE_TIME = 0;
var button = className('android.view.View')
.depth(20)
.indexInParent(0)
.drawingOrder(0)
.clickable().find()[0].bounds();
var y = button.bottom;
while (click(button.right, y)) {
if (!text("累计任务奖励").exists()) {
back();
sleep(3000);
break;
} else{
y = y + 100;
}
}
break;
} else if (text('京东11.11热爱环...').exists()) {
console.info("下单任务,跳过");
back();
} else if (isBackFlag) {
console.info("进入浏览就返回任务");
sleep(2000);
viewAndFollow();
isBackFlag = false;
break;
} else if (isXcx) {
console.info("进入小程序任务");
// 重置计时
JUDGE_TIME = 0;
sleep(2000);
launch(appName);
isXcx = false;
break;
} else {
if (recoverApp()) {
break;
}
}
}
}
/**
* 加入购物车
*/
function addMarketCar() {
if (textContains('当前页点击浏览5个').exists() || textContains('当前页浏览加购').exists()) {
const productList = className('android.view.View').indexInParent(5).clickable().find();
//const productList = className('android.widget.Button').depth(19).clickable().find()
var count = 0;
for (index = 0; index < productList.length; index++) {
if (count == 5) {
if (back()) {
sleep(3000)
count = 0;
break;
}
}
if (productList[index].click()) {
// 重置计时
JUDGE_TIME = 0;
log("加入购物车任务:正在添加第" + (index + 1) + "个商品");
sleep(2000);
while (true) {
if (text("购物车").exists() && back()) {
count = count + 1;
sleep(2000);
if (!text("购物车").exists()) {
break;
}
}
}
}
}
}
}
/**
* 互动种草城
* @returns
*/
function interactionGrassPlanting() {
var count = 0;
while (true) {
if (className('android.view.View').indexInParent(4).depth(14).findOne().click()) {
// 重置计时
JUDGE_TIME = 0;
console.info("去逛逛");
sleep(2000);
if (back()) {
sleep(2000);
count = count + 1;
if (count == 5) {
return true;
}
}
}
}
}
/**
* 获取需要进行的控件
* @returns
*/
function getNeedSelector() {
var allSelector = className('android.view.View')
.depth(19)
.indexInParent(3)
.drawingOrder(0)
.clickable()
.find();
for (let index = 0; index < allSelector.length; index++) {
for (var i = 0; i < TASK_LIST.length; i++) {
// 获取具有需要完成任务字符串的控件集合
var list = allSelector[index].parent().findByText(TASK_LIST[i]);
// 如果长度大于0则表示存在该控件
if (list.size() > 0) {
// 获取不在序列中的序号
if (finished_task_num.indexOf(index) < 0) {
console.info("当前已完成序列:", finished_task_num)
current_task_num = index;
} else {
continue;
}
// 如果是浏览就返回的任务,将标记设为true
isBackFlag = (TASK_LIST[i].indexOf("浏览可得") >= 0 || TASK_LIST[i].indexOf("浏览并关注可得2000") >= 0) ? true : false;
// 如果是小程序任务,将小程序标记设为true
isXcx = (TASK_LIST[i].indexOf("小程序") >= 0) ? true : false;
var rect = allSelector[current_task_num].bounds();
if (text("累计任务奖励").exists()) {
console.info("去完成任务,当前任务序列:", current_task_num)
randomClick(rect.centerX(), rect.centerY());
//console.info("开始任务:", allSelector[current_task_num].parent().findByText(TASK_LIST[i]).get(0).text());
return true;
}
}
}
}
}
/**
* 返回
*/
function viewAndFollow() {
sleep(1000);
back();
sleep(3000);
}
/**
* 自动判断程序是否卡顿,恢复方法
* 判断依据:1.不在活动界面 2.停留某个界面长达30s
* @returns
*/
function recoverApp() {
if (!text("累计任务奖励").exists() && JUDGE_TIME > 30) {
if (back()) {
// 计时器重置
JUDGE_TIME = 0;
console.warn("停留某个页面超过30s,自动返回,重置定时器。");
return true;
}
} else {
return false;
}
}
/**
* 过渡操作
*/
function transitioPperation() {
for (let index = 0; index < PASS_LIST.length; index++) {
if (text(PASS_LIST[index]).exists()) {
console.info("过渡操作:", PASS_LIST[index]);
if (PASS_LIST[index].indexOf("请选择要使用的应用") >= 0) {
back();
} else if (text("查看同款").exists()) {
text(PASS_LIST[index]).click();
} else if (PASS_LIST[index].indexOf("已复制") >= 0) {
className('android.widget.LinearLayout')
.depth(4)
.indexInParent(1)
.drawingOrder(2)
.clickable()
.findOne().click();
} else {
text(PASS_LIST[index]).click();
}
sleep(1000);
}
}
}
/**
* 点击
* @param {横坐标} x
* @param {纵坐标} y
*/
function randomClick(x, y) {
var rx = random(0, 5);
var ry = random(0, 5);
click(x + rx, y + ry);
sleep(2000);
return true;
}
/**
* Author: czj
* Date: 2021/10/20
* Time: 23:02:50
* Github: https://github.com/czj2369/jd_tb_auto
*/
[Asm] 纯文本查看 复制代码 /**
* TB双11
*
* Author: czj
* Date: 2021/10/21 13:01:32
* Versions: 1.6.0
* Github: https://github.com/czj2369/jd_tb_auto
*/
// 需要忽略的任务中包含的关键字
var IGNORE_LIST = ['农场', '芭芭农场', '下单', '蚂蚁森林', '淘特', '点淘', '充话费', '参与合伙', '喂小鸡', '斗地主', '续卡', '88VIP', '消消乐'];
// 过渡操作
var PASS_LIST = ['我再想想', '我知道了', '开心收下'];
var app_package = "com.taobao.taobao";
var app_name = "淘宝";
// 点击之后返回的任务
const BACK_LIST = [];
const GO_View = '去浏览';
const GO_FINISH = '去完成';
const GO_SEARCH = '去搜索';
// 返回标记
const FINISHED_TASK = ['任务完成', '全部完成啦', '喵糖已发放', '任务已完成'];
const VIEW_MOST = '去逛逛';
// 判定是否进入到喵糖总动员
var isEnterTaskUI = false;
// 判断停留时间
var JUDGE_TIME = 0;
// 定时器
var interval;
var options = ["做任务", "掷骰子"];
var i = dialogs.select("请选择一个选项", options);
if (i >= 0) {
console.info("您选择的是" + options[i]);
} else {
toast("您取消了选择");
}
init();
/**
* 初始化
*/
function init() {
// 子线程监听脚本
threads.start(function () {
events.setKeyInterceptionEnabled("volume_up", true);
//启用按键监听
events.observeKey();
//监听音量上键按下
events.onKeyDown("volume_up", function (event) {
console.log("脚本退出!")
exit();
});
});
start();
// 子线程开启计时
threads.start(function () {
if (interval == null) {
// 开启计时器,进行卡顿计时
// 启动定时器前,将计数器归为0
JUDGE_TIME = 0;
log("开启定时器");
interval = setInterval(function () {
JUDGE_TIME = JUDGE_TIME + 1;
}, 1000);
}
});
if (0 == i) {
while (true) {
recoverApp();
enterActivity();
viewTask();
transitioPperation();
}
} else {
while (!enterMiaoTang() && !textContains("骰子").exists()) {
}
var textContent = textContains("骰子").findOnce().text();
var count = textContent.split(",")[1];
console.info("获取当前骰子数:", count);
while (count > 0) {
if (textContains("骰子").findOnce().click()) {
// 计时器重置
JUDGE_TIME = 0;
count = count - 1;
console.info("掷骰子,剩余次数:", count);
sleep(5000);
}
}
console.info("掷骰子任务结束");
exit();
}
}
/**
* 启动淘宝
*/
function start() {
auto.waitFor()
console.info("author:czj");
console.info("地址:https://github.com/czj2369/jd_tb_auto");
if (launch(app_package)) {
console.info("启动" + app_name + "APP");
} else {
console.info("请手动启动" + app_name + "APP")
}
console.show();
}
/**
* 进入活动中心
*/
function enterActivity() {
const SIGN_IN = '签到';
const GET_REWARD = '领取奖励';
const CUT_TEN_BILION = '赚糖';
enterMiaoTang();
// 签到
if (text(SIGN_IN).exists()) {
text(SIGN_IN).findOne().click();
}
//领取奖励
if (text(GET_REWARD).exists()) {
text(GET_REWARD).findOne().click();
}
// 进入做任务界面
if (textContains(CUT_TEN_BILION).exists()) {
var button = textContains(CUT_TEN_BILION).findOnce().bounds();
click(button.centerX(), button.centerY());
}
if (isEnterTaskUI && !textContains(CUT_TEN_BILION).exists()) {
if (back()) {
isEnterTaskUI = false;
}
}
return false;
}
/**
* 进入喵糖总动员
* @returns
*/
function enterMiaoTang() {
if (className('android.widget.FrameLayout').depth(17).indexInParent(14).clickable().find().length == 1) {
console.info("进入喵糖总动员,稍等5s即刻开始任务");
var button = className('android.widget.FrameLayout').depth(17).indexInParent(14).clickable().find()[0].bounds();
click(button.centerX(), button.centerY());
isEnterTaskUI = true;
sleep(5000);
return true;
} else {
if (desc("我的淘宝").exists() && desc("我的淘宝").findOne().click()) {
sleep(3000);
if (descContains("赢20亿红包").exists() && descContains("赢20亿红包").findOne().click()) {
console.info("进入喵糖总动员,稍等7s即刻开始任务");
isEnterTaskUI = true;
sleep(7000);
return true;
}
}
}
}
/**
* 完成查看任务
*/
function viewTask() {
// 去完成
if (text(GO_FINISH).exists()) {
sleep(500);
// 获取多个'去完成' 或者 '去浏览'
var button = text(GO_FINISH).find();
for (index = 0; index < button.length; index++) {
var buttonParent = button[index].parent();
// 遍历'去完成'或者'去浏览'的父控件下面的子控件,判断是否存在IGNORE_LIST中包含的文字,如果存在,不执行该任务,否则执行
try {
if (!recursionControl(buttonParent)) {
var isViewAndFollow = false;
// 判断是否直接返回
buttonParent.child(0).children().forEach(element => {
print(element.text())
for (i = 0; i < BACK_LIST.length; i++) {
if (element.text().indexOf(BACK_LIST[i]) >= 0) {
isViewAndFollow = true;
}
}
});
log("正在进行任务:" + buttonParent.child(0).children()[0].text());
if (isViewAndFollow) {
viewAndFollow();
}
button[index].click();
sleep(4000);
if (id("titlebar").exists()) {
huDong();
}
// 计时器重置
JUDGE_TIME = 0;
sleep(500)
break;
}
} catch (error) {
console.error(error);
}
}
}
// 去浏览
if (text(GO_View).exists()) {
sleep(500);
text(GO_View).findOne().click();
// 计时器重置
JUDGE_TIME = 0;
log("正在进行任务:" + text(GO_View).findOne().parent().child(0).children()[0].text());
sleep(2000);
}
// 去搜索
if (text(GO_SEARCH).exists()) {
sleep(500);
text(GO_SEARCH).findOne().click();
// 计时器重置
JUDGE_TIME = 0;
log("正在进行任务:" + text(GO_SEARCH).findOne().parent().child(0).children()[0].text());
sleep(2000);
}
// 去逛逛
if (textContains(VIEW_MOST).exists()) {
textContains(VIEW_MOST).findOnce().click();
// 计时器重置
JUDGE_TIME = 0;
log("正在进行任务:" + textContains(VIEW_MOST).findOnce().parent().child(0).children()[0].text());
sleep(2000);
}
// 天天去领钱
if (text("打开链接").exists()) {
text("打开链接").findOne().click();
// 计时器重置
JUDGE_TIME = 0;
sleep(2000);
}
isFinshed(FINISHED_TASK);
}
function customBack() {
while (back()) {
break;
}
}
/**
* 互动任务
*/
function huDong() {
if (id("titlebar").exists()) {
console.info("进入互动任务");
var titleBarXY = id("titlebar").findOne().bounds();
var x = titleBarXY.centerX();
var y = titleBarXY.centerY();
while (!textContains("执行").exists() && click(x, y)) {
console.info("未点击到任务,重试");
y = y + 50;
}
y = titleBarXY.centerY();
while (textContains("喵糖+1").exists() && textContains("执行").exists() && click(x, y)) {
console.info("点击屏幕");
y = y + 50;
}
}
}
/**
* 判断是不是完成任务
* @param {控件名称} uiName
* @returns
*/
function isFinshed(uiName) {
for (i = 0; i < uiName.length; i++) {
if (textContains(uiName[i]).exists() || descContains(uiName[i]).exists()) {
back();
sleep(500);
break;
}
}
return false;
}
// 递归遍历控件是否包含忽略的关键词
function recursionControl(parentControl) {
var retFlag = false;
// 遍历子控件是否包含忽略关键词
parentControl.child(0).children().forEach(element => {
for (ignoreIndex = 0; ignoreIndex < IGNORE_LIST.length; ignoreIndex++) {
if (element.text().indexOf(IGNORE_LIST[ignoreIndex]) >= 0) {
retFlag = true;
}
}
});
return retFlag;
}
/**
* 返回
*/
function viewAndFollow() {
sleep(1000);
back();
sleep(1000);
}
/**
* 自动判断程序是否卡顿,恢复方法
* 判断依据:1.不在活动界面 2.停留某个界面长达30s
* @returns
*/
function recoverApp() {
if (!text("查看红包").exists() && JUDGE_TIME > 45) {
if (back()) {
// 计时器重置
JUDGE_TIME = 0;
console.warn("停留某个页面超过45s,自动返回,重置定时器。");
return true;
}
} else {
return false;
}
}
/**
* 过渡操作
*/
function transitioPperation() {
for (let index = 0; index < PASS_LIST.length; index++) {
if (text(PASS_LIST[index]).exists()) {
text(PASS_LIST[index]).click();
console.info("过渡操作:", PASS_LIST[index]);
sleep(500);
}
}
}
/**
* Author: czj
* Date: 2021/10/21 13:01:32
* Github: https://github.com/czj2369/jd_tb_auto
*/ |