【2024年最新】autoXJS自动化刷币任务实战训练,ks极速版 2.0自动化迭代
文章目录
引言
-
上一个版本:上个模板
-
相比上版本变化了什么:
-
代码优化:
- 设置任务模块:采用对象方式,将不同的任务对象装进任务数组里exports出去,当任务的state属性为成功或者 不可执行时 从数组pop出去
- 新增工具类部分方法
-
新增5个任务 (目前13个)
-
新加入部分弹窗识别关闭
-
效果图
代码
注意模块导入的路径
这里直接贴代码吧
有什么问题和建议欢迎留言😁
主程序代码 main.js
/*
* @Descripttion: 用于快手极速版刷金币的脚本
* @Author: 菜鸟黄某
* @AutoXjs版本:6.5.7
* @快手极速版版本:12.0.40.7282 (2024-02-02 最新版)
* @Date: 2024-02-02
*/
//导入模块
const tools = require('Tools2.0.js');
// const tools = require('Tools2.0.js');
let tasksarr = require('Tasks.js');
log("快手极速版脚本 启动")
const h = device.height || 2400,
w = device.width || 1080;
//手机 数字类型的锁屏密码
var password = "751953",
//汇报邮箱
targetEmail = "mailto:2245334490@qq.com",
//完成状况
scriptstate = "",
//程序最大重试次数
scripMaxRetryCount = 3,
//脚本最大运行时间 单位:分钟
maxRuntime = 40,
//脚本启动时的时间
startDate = new Date().getTime() + 8 * 60 * 60 * 1000,
//不存在的任务
unfindTasks = 0,
unfindTasksName = "",
appname = "快手极速版",
_packageName = getPackageName(appname),
//获取得金币数量
begin_coinNum = 0,
end_coinNum = 0;
//脚本结尾操作 sync() 把里面的函数加上同步锁,使得在同一时刻最多只能有一个线程执行这个函数
//@是否发送【qq邮箱通知】 @邮箱内容
var exitEnd = sync(function (content, is_sendemail) {
log(">>>>>>>>>>>>>>退出脚本准备<<<<<<<<<<<<<<<")
begin_coinNum = tasksarr[0].begin_coinNum
end_coinNum = tasksarr[0].end_coinNum
//is_sendemail 默认为false
is_sendemail = !!is_sendemail
content += `脚本已运行:${Math.floor((new Date().getTime() + 8 * 60 * 60 * 1000 - startDate) / (60 * 1000))}分钟 \n剩余未完成任务:${tasksarr.length}\n其中无法执行的任务(无此任务/任务app未装)有:${unfindTasksName}\n脚本开始时的金币:${begin_coinNum}\n脚本结束时的金币:${end_coinNum}\n本次获取金币数量为:${end_coinNum - begin_coinNum}\n`
log("脚本完成情况:\n" + content)
//qq邮箱汇报 必须是qq邮箱app 微信关联qq邮箱即可在微信上直接查看脚本情况
is_sendemail && tools.email(targetEmail, appname, content)
sleep(3000)
tools.killApp(appname)
home()
device.cancelKeepingAwake()//取消屏幕常亮
threads.shutDownAll()//关闭所有子线程
engines.myEngine().forceStop()//关闭当前脚本
})
//新建线程 专门处理广告倒计时
let thread1 = threads.start(function () {
try {
while (true) {
let ad1 = id("com.kuaishou.nebula.commercial_neo:id/video_countdown").findOne(300)
if (ad1 && ad1.text() == "已成功领取奖励") {
log(`【找到[${ad1.text()}]并点击】:${tools.superClick(ad1)}`)
}
let ad2 = id("com.kuaishou.nebula:id/neo_count_down_text").findOne(400) || id("com.kuaishou.nebula.commercial_neo:id/reward_merchant_text").findOne(200) || id("com.kuaishou.nebula:id/pendant_task_status").findOne(200)
if (ad2 && ad2.text().search(/[1-4]秒|00:0[1-4]|已领取|倒计时 00:0[1-4]/) == 0) {
log(`[广告线程]-->" ${ad2.text()}\n`)
sleep(5000);
back()
sleep(3000);
}
let ad3 = packageName(_packageName).textMatches(/(领取|奖励|立即|任务|退出|仍要|直播间|放弃){1,2}/).findOne(300) || className("android.widget.TextView").textStartsWith("看内容最高可得").findOne(200) || className("android.widget.Button").textStartsWith("看内容最高可得").findOne(200)
if (ad3) {
if (tools.superClick(ad3)) {
log(`【找到[${ad3.text()}]并点击】:true`)
} else if (ad3.bounds().centerX() > 0 && ad3.bounds().centerY() > 0) {
click(ad3.bounds().centerX(), ad3.bounds().centerY());
}
}
}
} catch (e) {
if (e.name == "JavaException") {
log(">>>>>>>>>>>>>>>>广告线程退出<<<<<<<<<<<<<<<<<<<<")
} else {
scriptstate += `广告线程异常: 【${e.name}】\n${e.message}\n`
log(`广告线程异常: 【${e.name}】\n${e.message}\n`)
exitEnd(scriptstate, true)
}
}
});
try {
init() && main()
} catch (error) {
scriptstate += `主线程异常: 【${error.name}】\n${error.message}\n`
log(`主线程异常: 【${error.name}】\n${error.message}\n`)
//错误类型为 JavaException时 跳过重启任务 因为这是engines.stopAll()抛出异常导致的
} finally {
exitEnd(scriptstate, true)
}
function main() {
while (true) {
let failcount = 0; //失败次数
for (let i = 0; i < tasksarr.length; i++) {
if (tools.backTo(text("任务中心"), 4)) {
tasksarr[i].running();
} else {
failcount++;
}
}
//失败次数太多
if (failcount > 4) {
log(`失败次数过多--> ${failcount}`)
scriptstate += `失败次数过多--> ${failcount}\n`
break;
}
//删掉已完成的数组元素
tasksarr = tasksarr.filter(item => {
if (item.state == "成功") {
log(`<<<<<<<<<<<任务:${item.name}已从数组删除>>>>>>>>>>>>>>`)
}
if (item.state == "无法执行") {
log(`<<<<<<<<<<<任务:${item.name}已从数组删除>>>>>>>>>>>>>>`)
unfindTasks += 1;
unfindTasksName += `${item.name} , `
}
return item.state != "成功" && item.state != "无法执行";
});
//剩余未完成任务 过少
if (tasksarr.length - unfindTasks < 4) {
throw new tools.UserErroyInfo("剩余任务过少", "剩余任务过少,脚本结束")
}
}
// 重启任务
tools.killApp(appname)
if (thread1.isAlive()) {
tools.killApp(appname)
init()
}
}
//初始操作
function init() {
if (!!scripMaxRetryCount) {
log(`>>>>>>>>>>>>>>剩余重试次数${scripMaxRetryCount}<<<<<<<<<<<<<`);
scripMaxRetryCount--;
//检测是否熄屏并开锁
tools.openPhone(password);
sleep(2000);
//保持屏幕常亮
device.keepScreenOn()
tools.openApp(appname, 5000);
sleep(2000)
//任务中心
if (tools.backTo(text("首页"), 3)) {
let taskcenter = className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
if (taskcenter) {
log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
sleep(8000)
} else {
log("未找到任务中心入口 , 尝试坐标点击")
tools.clicks(760, 2345)
}
return true
}
} else {
exitEnd(scriptstate, true)
}
}
工具类模块代码 Tools.js
var tools = {};
//手机屏幕唤醒 适合数字密码锁屏
//@密码 [type]:str
tools.openPhone = function (password) {
log("openPhone()----------------->")
sleep(2000)
if (!device.isScreenOn()) {
log("openPhone()-->熄屏状态,尝试唤醒&输入密码")
device.wakeUp()
//让设备一直亮屏
// device.keepScreenOn()
sleep(2000)
swipe(device.width / 2, device.height / 1.3, device.width / 2, device.height / 8, 200)
sleep(1000)
//有密码则
log("openPhone()-->输入密码中")
if (text("1").findOne(2000)) {
for (var i = 0; i <= password.length; i++) {
click(password[i])
sleep(100)
}
} else if (desc("1").findOne(2000)) {
for (var i = 0; i <= password.length; i++) {
var p = desc(password[i]).findOne(1000)
if (p) {
p.click()
}
sleep(100)
}
} else {
log("openPhone()-->未找到密码锁")
}
}
};
//在"Autox.js v6"app页面 打开其他应用成功率高,提高容错
//@app名字 @打开app后休眠时间
tools.openApp = function (name, time) {
log(`openApp()----------------->${name}`)
home()
sleep(1000)
launchApp("Autox.js v6")
sleep(5000)
if (app.getPackageName(name)) {
launchApp(name)
} else {
log("未安装:" + name)
}
sleep(time)
};
//自动化 杀死app后台
//@app包名
tools.killApp = function (appName) {
var pagename = getPackageName(appName);
if (!pagename) {
return false;
}
home()
sleep(1000)
app.openAppSetting(pagename);
sleep(2000);
let is_sure = textMatches(/(强行|停止|结束|强制|运行){2}/).findOne(2000);
if (is_sure && is_sure.enabled()) {
click(is_sure.text())
sleep(2000);
let next = text("确定").findOne(3000) || textMatches(/(强行|停止|结束|强制|运行){2}/).findOne(2000)
if (next && next.enabled()) {
click(next.text())
log(`killApp()---------->应用已被关闭`);
sleep(2000);
} else {
log(`killApp()---------->应用不能被正常关闭或不在后台运行`);
}
} else {
log(`killApp()---------->应用不能被正常关闭或不在后台运行`);
}
home()
}
//返回到某个页面
//@控件条件 @最大返回/查找次数 return{bool}
tools.backTo = function (_uiselector, maxFind) {
log("backTo()----------------->" + _uiselector)
while (!_uiselector.findOne(2000)) {
if (maxFind > 0) {
back()
maxFind--;
sleep(3000)
} else {
log("backTo()-->失败")
return false;
}
}
log("backTo()-->成功")
return true;
}
//截屏权限获取
tools.getScreenCapture = function () {
log("请求截屏权限");
let Thread = null
if (device.sdkInt > 28) {
//等待截屏权限申请并同意 线程多开
Thread = threads.start(function () {
// sleep(500)
// click(846, 1553) 如果无法自动点击 可用坐标
packageName('com.android.systemui').text(/(允许|立即开始|统一)/).waitFor();
text(/(允许|立即开始|统一)/).click();
});
}
//申请截屏权限
if (!requestScreenCapture()) {
log("请求截图失败");
exit();
return false;
} else {
Thread.interrupt()
log("已获得截图权限");
return true;
}
}
//截屏
tools.ScreenCapture = function () {
log("ScreenCapture()----------------->")
// captureScreen("/sdcard/结果图.png"); -->不会保存到系统相册
takeScreenshot()//模拟电源+音量键 进行截图-->保存到系统相册
sleep(4000)
}
//qq邮箱发送
//@目标邮箱 @标题 @正文
tools.email = function (targetEmail, tag, content) {
if (app.getPackageName("QQ邮箱")) {
log("email()----------------->" + targetEmail)
let intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(android.net.Uri.parse(targetEmail));
intent.putExtra(Intent.EXTRA_SUBJECT, tag);
intent.putExtra(Intent.EXTRA_TEXT, content);
app.startActivity(intent);
sleep(4000)
click("发送")
} else {
log("未安装qq邮箱")
}
}
//随机时间 随机坐标滑动
//@设备宽度 @设备像素高度 @方向 @最小随机时间 @最大随机时间
tools.randomSwipe = function (w, h, dir, sleeptiemMin, sleeptiemMax) {
let _swipe = {
offset: random(-55, 55),
x_l: random(w / 6, w / 5),
x_r: random(w * 0.85, w * 0.75),
y_up: random(h / 6, h / 5),
y_down: random(h * 0.85, h * 0.75),
time: random(320, 450),
sleep_time: random(sleeptiemMin, sleeptiemMax)
}
var x1, x2, y1, y2
switch (dir) {
case "右":
x1 = _swipe.x_r
x2 = _swipe.x_l
y1 = h / 2 + _swipe.offset
y2 = h / 2 - _swipe.offset
break;
case "下":
x1 = w / 2 + _swipe.offset
x2 = w / 2 - _swipe.offset
y1 = _swipe.y_down
y2 = _swipe.y_up
break;
case "上":
x1 = w / 2 - _swipe.offset
x2 = w / 2 + _swipe.offset
y1 = _swipe.y_up
y2 = _swipe.y_down
break;
case "左":
x1 = _swipe.x_l
x2 = _swipe.x_r
y1 = h / 2 - _swipe.offset
y2 = h / 2 + _swipe.offset
break;
default:
log("模拟滑动的方向错误")
}
log(`${_swipe.sleep_time / 1000}秒后将向${dir}滑`)
sleep(_swipe.sleep_time)
var xxy = [_swipe.time];
var point = [];
var dx0 = {
"x": x1,
"y": y1
}
var dx1 = {
"x": random(x1 - 100, x1 + 100),
"y": random(y1, y1 + 50)
}
var dx2 = {
"x": random(x2 - 100, x2 + 100),
"y": random(y2, y2 + 50),
}
var dx3 = {
"x": x2,
"y": y2
}
for (var i = 0; i < 4; i++) {
eval("point.push(dx" + i + ")");
}
for (let i = 0; i < 1; i += 0.08) {
xxyy = [parseInt(bezier_curves(point, i).x), parseInt(bezier_curves(point, i).y)]
xxy.push(xxyy);
}
gesture.apply(null, xxy);
}
//点击 在当前页面的控件
//@uiSelects 控件条件 @rangeTop/rangebottom 控件出现得上下范围 有默认值 return{bool}
tools.clickBounds = function (ui_select, findtime, rangeTop, rangebottom) {
rangeTop = rangeTop || 0
rangebottom = rangebottom || device.height
while (true) {
let uiObj = ui_select.findOne(findtime)
if (uiObj) {
if (uiObj.bounds().centerY() < rangeTop) { //得向下滑动
log(`clickBounds()------->${uiObj.text()}控件在屏幕上方`)
swipe(w / 2, h / 2, w / 2, h / 1.2, 300)
} else if (uiObj.bounds().centerY() > rangebottom) { //得向上滑动
log(`clickBounds()------->${uiObj.text()}控件在屏幕下方`)
swipe(w / 2, h / 1.2, w / 2, h / 2, 300)
} else {
log(`点击--->${uiObj.text()}`)
click(uiObj.bounds().centerX(), uiObj.bounds().centerY())
return true;
}
} else {
log(`clickBounds()---------->未找到${ui_select}`)
return false;
}
}
}
//主线程 在一定时间内 执行fn() 直到目标控件出现 或者时间结束
//@uiselector控件条件 @maxWaitCount 最大执行fn()次数
tools.waitforUi = function (uiSelector, maxWaitCount, fn) {
let i = 1
do {
//最大等待次数
if (i > maxWaitCount) {
return tools.backTo(uiSelector, 3);
}
log(`主线程第${i}/${maxWaitCount}次等待`)
fn()
i++
}
while (!uiSelector.exists())
return true
}
//停止出自己之外的所有脚本
tools.stopOtherScript = function () {
engines.all().map((ScriptEngine) => {
if (engines.myEngine().toString() !== ScriptEngine.toString()) {
ScriptEngine.forceStop();
}
});
}
//超级点击
//@要点击的控件 return{bool}
tools.superClick = function (node) {
try {
if (node) {
if (node.click()) {
return true
} else if (node.parent().click()) {
return true
} else if (node.parent().parent().click()) {
return true
} else if (node.parent().parent().parent().click()) {
return true
} else if (node.parent().parent().parent().parent().click()) {
return true
} else if (node.parent().parent().parent().parent().parent().click()) {
return true
} else if (node.parent().parent().parent().parent().parent().parent().click()) {
return true
}
}
} catch (e) { }
return false
}
//用户信息报错时的构造函数
tools.UserErroyInfo = function (name, message) {
this.message = message;
this.name = name;
}
//适配不同设备的点击方法
//注意,测试机型为1080*2400,
tools.clicks = function (x, y) {
x1 = device.width / 1080
y1 = device.height / 2400
click(x * x1, y * y1)
}
function bezier_curves(cp, t) {
cx = 3.0 * (cp[1].x - cp[0].x);
bx = 3.0 * (cp[2].x - cp[1].x) - cx;
ax = cp[3].x - cp[0].x - cx - bx;
cy = 3.0 * (cp[1].y - cp[0].y);
by = 3.0 * (cp[2].y - cp[1].y) - cy;
ay = cp[3].y - cp[0].y - cy - by;
tSquared = t * t;
tCubed = tSquared * t;
result = {
"x": 0,
"y": 0
}
result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
return result;
}
//暴露模块
module.exports = tools;
任务模块 Task.js
function Task(name) {
this.name = name;
//任务状态 :未开始 成功 进行中 失败 无法执行
this.state = "未开始";
//入口按钮
this.enterbtn = null;
}
let openBox = new Task("开宝箱")
let lookAD = new Task("看广告")
let lookProduct = new Task("逛街浏览商品")
let lookzbj = new Task("看直播间")
let lookvd = new Task("刷短视频")
let findLook = new Task("搜素浏览")
let eatTime = new Task("每日餐补")
let sleepgetup = new Task("早睡早起")
let getCoinNum = new Task("获取金币数量")
let looktv = new Task("看短剧")
let readNovel = new Task("爽读小说")
let toOpenApp = new Task("打开app")
let lokzbj2 = new Task("去金币购赚更多")
lookAD.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").textMatches(/看广告得.+|看视频得.+/).findOne(2000)
if (this.enterbtn) {
let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
if (state1) {
let num = state1.text().match(/(\d+)\/(\d+)/)
if (num[1] == num[2]) {
log(`已完成:${num[1]}/${num[2]}`)
this.state = "成功"
return;
}
}
if (this.enterbtn.parent().findOne(textStartsWith("明天看广告"))) {
this.state = "成功"
return;
}
sleep(2000)
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(4000)
//等待
if (!tools.waitforUi(text("任务中心"), 30, () => sleep(10000))) { return }
} else {
log("未找到广告任务入口")
this.state = "无法执行"
}
}
openBox.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = textMatches(/treasurebox|开宝箱得金币|点就领.+/).findOne(2000)
if (this.enterbtn) {
click(this.enterbtn.bounds().centerX(), this.enterbtn.bounds().centerY());
if (!tools.waitforUi(text("任务中心"), 20, () => sleep(10000))) { return }
} else {
log("暂无宝箱")
}
}
lookProduct.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").text("逛街领金币").findOne(2000)
if (this.enterbtn) {
if (this.enterbtn.parent().findOne(textStartsWith("今日福利已领取"))) {
log("逛街领金币已完成")
this.state = "成功"
return;
}
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(3000)
if (!tools.waitforUi(text("任务中心"), 13, () => {
tools.randomSwipe(w, h, "上", 2000, 3200);
tools.randomSwipe(w, h, "上", 2000, 3200)
tools.randomSwipe(w, h, "下", 2000, 3200)
})) { return }
} else {
this.state = "无法执行"
log("未找到入口")
}
}
lookzbj.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").textMatches(/.+次直播领金币/).findOne(2000)
if (this.enterbtn) {
let num = [0, 0]
let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
if (state1) {
num = state1.text().match(/(\d+)\/(\d+)/)
if (num[1] == num[2]) {
log(`已完成:${num[1]}/${num[2]}`)
this.state = "成功"
return;
}
}
if (this.enterbtn.parent().findOne(text("今日已成功领取直播奖励金币"))) {
this.state = "成功"
return;
}
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(3000)
tools.randomSwipe(w, h, "下", 0, 0)
tools.randomSwipe(w, h, "下", 1000, 2000)
sleep(1000)
let maxcount = num[2] - num[1]
for (let i = 0; i < maxcount; i++) {
let zbj = id("recycler_view").findOne(2000)
if (zbj && i < zbj.childCount()) {
sleep(1000)
log(`第${i + 1}/${maxcount}次进入直播间`)
tools.superClick(zbj.child(i))
if (!tools.waitforUi(text("看直播领金币"), 9, () => sleep(10000))) { return }
} else {
log("未找到直播间控件/已看完")
break;
}
}
} else {
log("未找到入口")
this.state = "无法执行"
}
}
lookvd.running = function () {
log(`\n【${this.name}任务】`)
sleep(2000)
if (textMatches(/今日已领.+明日可领.+金币/).exists()) {
log("刷视频任务已完成")
this.state = "成功"
return;
}
this.enterbtn = textMatches(/看视频额外得\d+金币|看视频赚金币|首页/).findOne(2000)
if (this.enterbtn) {
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(2000)
let i = 0;
while (i < 20) {
log(`浏览视频第 ${i}/2020次`)
tools.randomSwipe(w, h, "下", 5000, 8000)
tools.randomSwipe(w, h, "下", 6000, 7000)
tools.randomSwipe(w, h, "上", 8000, 10000)
i++;
}
//回到任务中心
if (tools.backTo(id("android:id/text1").text("首页"), 3)) {
let taskcenter = id("float_background").findOne(2000) || className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
if (taskcenter) {
log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
sleep(4000);
} else {
log("未找到 任务中心")
}
}
} else {
log("未找到入口")
this.state = "无法执行"
}
}
findLook.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").textMatches(/搜索.+/).findOne(2000)
if (this.enterbtn) {
let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
if (state1) {
let num = state1.text().match(/(\d+)\/(\d+)/)
if (num[1] == num[2]) {
log(`已完成:${num[1]}/${num[2]}`)
this.state = "成功"
return;
}
}
//要输入的内容
let context = this.enterbtn.text().match(/“(.+?)”/) || this.enterbtn.text().match(/\"(.+?)\"/)
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
log(context)
sleep(2000)
let state = text("任务中心").findOne(2000)
if (state) {
log(`倒计时结束后可看`)
return;
}
let btn = className("android.widget.TextView").text("搜索").findOne(2000)
if (btn && context) {
log("输入:" + context[1])
setText(context[1])
sleep(1000)
log(`【找到[${btn.text()}]并点击】:${tools.superClick(btn)}`)
sleep(22000)
back()
} else {
log("未找到搜索按钮")
}
//回到任务中心
if (tools.backTo(id("android:id/text1").text("首页"), 3)) {
let taskcenter = id("float_background").findOne(2000) || className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
if (taskcenter) {
log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
sleep(4000);
} else {
log("未找到 任务中心")
}
}
} else {
log("未找到入口")
this.state = "无法执行"
}
}
eatTime.running = function () {
log(`\n【${this.name}任务】`)
// 获取当前北京时间的时间戳(单位为毫秒)
var stamp = new Date().getTime() + 8 * 60 * 60 * 1000;
// 格式化北京时间为"YYYY-MM-DD HH:mm:ss"
//replace() -->字符串分割 substring(0, 10); -->取 年月日
var beijingTime = new Date(stamp).toISOString().replace(/T/, ' ').replace(/\..+/, '').substring(0, 10);
//当前小时 Date.parse( )-->转化成时间戳 向下取整
let date = Math.floor((stamp - Date.parse(beijingTime)) / (60 * 60 * 1000))
switch (date) {
case 1:
case 2:
case 3:
case 4:
case 9:
case 10:
case 14:
case 20:
case 0:
log(`未到餐补时间--》目前:${date}点`)
this.state = "无法执行"
break
default:
log(`餐补时间--》目前:${date}点`)
this.enterbtn = className("android.widget.TextView").text("到饭点领饭补").findOne(2000)
if (this.enterbtn) {
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(3000)
//点击领取
let next1 = text("领取饭补").findOne(2000) || textMatches(/(.+?)领取(.+?)补贴/).findOne(2000)
if (next1) {
log(`【找到[${next1.text()}]并点击】:${tools.superClick(next1)}`)
this.state = "成功"
} else {
log("未找到 领取控件")
}
sleep(2000)
let next2 = textEndsWith("待补签").find()
if (next2) {
for (let i = 0; i < next2.length; i++) {
log(`【第${i}次找到[${next2[i].text()}]并点击】:${tools.superClick(next2[i])}`)
sleep(40000)
}
} else {
log("未找到 补签控件")
}
return;
} else {
log("未找到饭补入口");
this.state = "失败"
}
}
}
sleepgetup.running = function () {
log(`\n【${this.name}任务】`)
// 获取当前北京时间的时间戳(单位为毫秒)
var stamp = new Date().getTime() + 8 * 60 * 60 * 1000;
// 格式化北京时间为"YYYY-MM-DD HH:mm:ss"
//replace() -->字符串分割 substring(0, 10); -->取 年月日
var beijingTime = new Date(stamp).toISOString().replace(/T/, ' ').replace(/\..+/, '').substring(0, 10);
//当前小时 Date.parse( )-->转化成时间戳 向下取整
let date = Math.floor((stamp - Date.parse(beijingTime)) / (60 * 60 * 1000))
switch (date) {
case 5:
case 6:
case 7:
case 8:
case 9:
log(`起床时间--》目前:${date}点`)
this.enterbtn = className("android.widget.TextView").textMatches(/起床赚金币|睡觉赚金币/).findOne(2000)
if (this.enterbtn) {
sleep(2000)
if (text("已起床").exists()) {
log("已起床")
this.state = "成功"
return;
}
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(2000)
//点击领取
let next = text("开始起床").findOne(2000)
if (next) {
log(`【找到[${next.text()}]并点击】:${tools.superClick(next)}`)
} else {
log("未找到 领取控件")
}
} else {
log("未找到入口");
this.state = "失败"
}
break
case 20:
case 21:
case 22:
case 23:
log(`睡觉时间--》目前:${date}点`)
this.enterbtn = className("android.widget.TextView").textMatches(/起床赚金币|睡觉赚金币/).findOne(2000)
if (this.enterbtn) {
sleep(2000)
if (text("已睡觉").exists()) {
log("已睡觉")
this.state = "成功"
return;
}
sleep(2000)
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
//点击领取
let next = text("开始睡觉").findOne(2000)
if (next) {
log(`【找到[${next.text()}]并点击】:${tools.superClick(next)}`)
} else {
log("未找到 领取控件")
}
} else {
log("未找到入口");
this.state = "无法执行"
}
break
default:
log("时间未到")
this.state = "无法执行"
}
}
getCoinNum.begin_coinNum = 0
getCoinNum.end_coinNum = 0
getCoinNum.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").text("我的金币").findOne(2000)
if (this.enterbtn) {
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(4000)
if (text("我的收益").exists()) {
let coin = textMatches(/(\d?\.?\d+)w?金币/).findOne(2000)
if (this.state == "未开始") {
this.begin_coinNum = this.end_coinNum = coin.text().match(/(\d?\.?\d+)/)[0]
this.begin_coinNum.toString().search(/\./) != -1 && (this.begin_coinNum = Math.ceil(this.begin_coinNum * 10000))
} else {
this.end_coinNum = coin.text().match(/(\d?\.?\d+)/)[0]
this.end_coinNum.toString().search(/\./) != -1 && (this.end_coinNum = Math.ceil(this.end_coinNum * 10000))
}
log("this.begin_coinNum-->" + this.begin_coinNum, "this.end_coinNum-->" + this.end_coinNum)
this.state = "进行中"
} else {
log("未进入 金币详情页面")
}
} else {
log("未找到 -- 我的金币")
}
}
looktv.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").textMatches(/看短剧得.+金币/).findOne(2000)
if (this.enterbtn) {
let state1 = this.enterbtn.parent().findOne(textMatches(/.+(\d+)\/(\d+)/)) //已经完成 2/6
if (state1) {
let num = state1.text().match(/(\d+)\/(\d+)/)
if (num[1] == num[2]) {
log(`已完成:${num[1]}/${num[2]}`)
this.state = "成功"
return;
}
}
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(2500)
//等待
if (!tools.waitforUi(text("任务中心"), 6, () => sleep(10000))) { return }
} else {
log("未找到广告任务入口")
this.state = "无法执行"
}
}
readNovel.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").text("爽读小说咔咔赚金币").findOne(2000)
if (this.enterbtn) {
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(10000)
let book = className("android.view.View").textMatches(/.*每读\(\d+\/\d+\)(分|章)/).findOne(2000)
if (book) {
sleep(4000)
tools.randomSwipe(w, h, "右", 0, 0)
tools.randomSwipe(w, h, "右", 500, 1000)
tools.randomSwipe(w, h, "右", 500, 1000)
log(`【找到[${book.text()}]并点击】:${tools.superClick(book)}`)
sleep(1400)
if (!
tools.waitforUi(text("任务中心"), 130, () => {
tools.randomSwipe(w, h, "右", 2500, 5200)
})) { return }
} else {
tools.backTo(text("任务中心"), 3)
}
} else {
this.state = "无法执行"
log("未找到入口")
}
}
toOpenApp.running = function () {
log(`\n【${this.name}任务】`)
if (this.state == "成功") {
return;
}
this.state = "成功"
let app_arr = ["快影", "淘宝", "一淘", "点淘", "闲鱼", "支付宝", "七猫", "京东", "京东金融"]
for (let i = 0; i < app_arr.length; i++) {
let appbtn = className("android.widget.TextView").textContains(app_arr[i]).findOne(2000)
if (appbtn) {
if (appbtn.text().search(/登录|打开|去/) == 0) {
if (appbtn.text().search(/施肥/) != -1) {
//去施肥 ,如果是小米 小窗开启的坐标为(540 1160)
// tools.clicks(540, 1940)
continue;
}
if (appbtn.parent().parent().findOne(text("已完成"))) {
log(`打开${app_arr[i]}任务 已完成`)
continue;
} else {
log("任务开始:打开" + app_arr[i])
if (tools.superClick(appbtn)) {
sleep(10000)
tools.killApp(app_arr[i])
sleep(2000)
launchApp(appname)
if (!tools.backTo(text("任务中心"), 4)) { return }
}
}
}
} else {
log(`打开${app_arr[i]}任务未找到`)
}
}
}
lokzbj2.running = function () {
log(`\n【${this.name}任务】`)
this.enterbtn = className("android.widget.TextView").text("去金币购赚更多金币").findOne(2000)
if (this.enterbtn) {
log(`【找到[${this.enterbtn.text()}]并点击】:${tools.superClick(this.enterbtn)}`)
sleep(4000)
let btn = textContains("今日签到").findOne(2000)
if (btn) {
log(`【找到[${btn.text()}]并点击】:${tools.superClick(btn)}`)
}
sleep(1400)
let btn1 = textContains("看直播可领").findOne(2000)
if (btn1) {
if (btn1.text() == "明日看直播可领") {
log("任务已完成")
this.state = "成功"
return;
}
log(`【找到[${btn1.text()}]并点击】:${tools.superClick(btn1)}`)
sleep(4000)
let a = text("直播间下单还能返金币").findOne(2000)
if (a) {
let zbjs = a.parent().parent().child(2)
for (let i = 0; i < 3; i++) {
if (zbjs && i < zbjs.childCount()) {
log(`第${i + 1}/3次进入直播间`)
zbjs.child(i).click()
if (!tools.waitforUi(text("直播间下单还能返金币"), 11, () => sleep(10000))) { return }
} else {
log("未找到直播间控件/已看完")
this.state = "成功"
return;
}
}
} else {
log("未找到控件")
}
}
} else {
log("未找到入口")
this.state = "无法执行"
}
}
// 爽读小说咔咔赚金币
var tasksarr = [getCoinNum, openBox, lookAD, sleepgetup, eatTime, lookProduct, looktv, lokzbj2, getCoinNum, toOpenApp, lookzbj, findLook, lookvd]
//暴露模块
module.exports = tasksarr;