白嫖使我快乐!
2023.12.27:增加跳过订阅任务。
2023.12.30:修正BUG,增加兼容性。
2023.12.31:根据酷安大佬三两竹外桃花的脚本增加如下内容
1.自动补签;
2.自动周末兑换章节卡;
3.自动完成游戏任务;
4.增加屏幕比例修正。
2024.2.19:1.抽奖改为OCR文字识别;
2.支持双账号签到。需要增加account.txt文件添加账号密码及用户名信息。
格式为:账户 密码 用户名(中间为空格多个账号回车换行,目前仅支持最多2个账号)
基于最新版本 起点读书7.9.333.1186(af514340)
2024.6.23:1.修复BUG,适用7.9.354.1296(4612cb83);
2024.11.22:1.适配最新版本;
2024.12.8:1.适配最新版本;
2.兼容Autojs6 6.5.0版本。
2025.1.16:1.适配最新版本;
2.兼容Autojs6 6.6.1版本。
屏幕分辨率为2340x1080直接可使用,伸手党勿扰。
JavaScript代码:
"auto"; //系统配置初始化 auto.waitFor(); if (auto.service == null) { log("请先开启无障碍服务!"); } else { log("无障碍已开启"); } let exchanges = true; //是否周末兑换章节卡 let state = false; //是否执行成功状态 const KX = device.width / 1080; //横坐标比例系数 const KY = device.height / 2340; //纵比例系数 const CENTER = "com.qidian.QDReader.ui.activity.QDBrowserActivity"; const adLoadTimeout = 3000; step = 1600 * KY; //无活动窗口1500,有活动窗口1610 //bounds(828, 123, 924, 219) //bounds(948, 123, 1044, 219) let findview1 = id("ivSearch").bounds(708, 123, 804, 219); let findview2 = id("ivMoreView").bounds(948, 123, 1044, 219); let Account; let leftTime = 10; //文件路径 var path = "/sdcard/脚本/Signin/data/account.txt"; //打开文件 var file = open(path); //读取文件的所有内容 var textfile = file.read(); //释放txt file.close(); console.show(); //存储记录初始化 currentTime = new Date(); var currentDate = currentTime.getFullYear() + "." + (currentTime.getMonth() + 1) + "." + currentTime.getDate() + " " + currentTime.getHours() + ":" + currentTime.getMinutes() + ":" + currentTime.getSeconds(); currentDate.toString(); console.setGlobalLogConfig({ file: `/sdcard/脚本/log/${currentTime.getFullYear()}${ currentTime.getMonth() + 1 }${currentTime.getDate()}.log`, filePattern: "%m%n", maxBackupSize: 16, maxFileSize: 512 * 1024 /* 384 KB. */, }); sleep(500); console.setSize(800 * KX, 500 * KY); sleep(500); console.setPosition(0 * KX, 1400 * KY); //关闭同名脚本 onlyOne(); wakeup(); unlock(); device.setBrightnessMode(0); device.setBrightness(0); device.setMusicVolume(0); clearrecents(); sleep(1000); netcheck(); log("初始化完毕"); log("\n" + "检查当前日期:" + currentDate); array = textfile.split("\n"); log("共有" + array.length + "个账号需要签到"); account1 = array[0].split(" "); account2 = array[1].split(" "); //启动起点读书开始执行脚本功能 launch("com.qidian.QDReader"); waitForPackage("com.qidian.QDReader"); text("书架").untilFind(); log("起点读书启动完毕"); console.hide(); if (!requestScreenCapture()) { toastLog("请求截图权限失败"); Abnormalexit(); } else { toastLog("请求截图权限成功"); } sleep(1000); var btnOk = id("btnOk").findOnce(); if (btnOk != null) { btnOk.click(); sleep(1000); } var imgclose = id("imgClose").findOnce(); if (imgclose != null) { imgclose.click(); sleep(1000); } accountverify(); if (Account == account1[0]) { toastLog(account1[0] + "签到开始"); Signin(); toastLog(account1[0] + "签到完成"); backhome(); Switchaccount(); var youngmode = id("btnEnterTeen").findOne(5000); if (youngmode != null) { log("点击我知道了"); click(540, 1479); } backhome(); toastLog(account2[0] + "签到开始"); Signin(); toastLog(account2[0] + "签到完成"); home(); sleep(1000); clearrecents(); sleep(1000); engines.stopAllAndToast(); device.cancelKeepingAwake(); lock(); } else if (Account == account2[0]) { toastLog(account2[0] + "签到开始"); Signin(); toastLog(account2[0] + "签到完成"); backhome(); Switchaccount(); var youngmode = id("btnEnterTeen").findOne(5000); if (youngmode != null) { log("点击我知道了"); click(540, 1479); } backhome(); toastLog(account1[0] + "签到开始"); Signin(); toastLog(account1[0] + "签到完成"); home(); sleep(1000); clearrecents(); sleep(1000); engines.stopAllAndToast(); device.cancelKeepingAwake(); lock(); } else { log("未识别到账号,退出"); Abnormalexit(); } console.hide(); //签到主程序 function Signin() { backhome(); //去签到页 checkInAndToCenter(); var signedin = className("android.widget.TextView") .text("今日已签到") .findOne(1000); if (signedin != null) { click(signedin.bounds().centerX(), signedin.bounds().centerY()); } sleep(2000); //免费补签 freeReSignin(); sleep(3000); //周日兑换奖励 exchange(); var signedin = className("android.widget.TextView") .text("今日已签到") .findOne(1000); if (signedin != null) { click(signedin.bounds().centerX(), signedin.bounds().centerY()); } //抽奖 lottery(); backhome(); zuorichang(); Dailytask(); } //做日常 function zuorichang() { toastLog("做日常中"); Fulicenter(); AutoRW(); toastLog("看视频得章节已完成"); sml_move(540 * KX, 1800 * KY, 540 * KX, 400 * KY, 200); sleep(2000); } //关闭广告 function closeAD() { waitForActivity("com.qq.e.tg.RewardvideoPortraitADActivity"); for (let i = 0; i < 31; i++) { var a1 = text("跳过广告").exists(); var b1 = textMatches(/观看视频.+|看.*/).exists(); if (i == 30) { log("关闭广告失败退出"); exit(); } if (a1 || b1) { log("广告加载完毕,播放中…"); } var a = text("跳过广告").findOnce(); var b = textMatches(/观看视频.+|看.*/).findOnce(); while (a == null && b == null) { sleep(1000); log("关闭广告重试"); } if (a != null || b != null) { closescreen(); for (let j = 0; j < 18; j++) { sleep(1000); } floaty.closeAll(); log("广告播放中..."); autoclose(); break; } } } //自动任务 function AutoRW() { //log("等待进入福利中心…");132,1401,948,1524 var c1 = text("规则").exists(); var d1 = text("看视频得奖励").exists(); if (c1 || d1) { log("已进入福利中心…"); } var c = text("规则").findOnce(); var d = text("看视频得奖励").findOnce(); while (c == null && d == null) { sleep(1000); AutoRW(); break; } while (c != null || d != null) { watchVideos(); otherVideoTask(); break; } sleep(1000); } function isAtADWeb() { return ( textMatches(/.*跳过广告.*|.*广告正在加载.*|.*网络不佳.*/).findOne(1300) || currentActivity() != CENTER ); } function _watchVideos_(uiObjectFunc, count) { for (let i = 0; i < count; i++) { try { let btn = uiObjectFunc(); if (btn && btn.text() == "已领取") { log(`${count}次视频已完成,跳过`); break; } if (clicks(btn)) { log("看视频", i); closeAD(); iKnow(2300) && sleep(300); } } catch (e) { log(e); } } } function iKnow(t) { return clicks(visibleToUser().text("知道了").findOne(t), 0); } function findOne(o, s, c) { if (!o || !c) return null; return o.findOne(s) || findOne(o.parent(), s, c - 1); } //看8次视频 function watchVideos() { let btnSel = textMatches(/看视频|已领取/); _watchVideos_( () => findOne(text("激励视频任务").findOne(5000), btnSel, 3), 8 ); swipe( device.width / 2, device.height * 0.9, device.width / 2, device.height * 0.5, 800 ); sleep(200); _watchVideos_( () => findOne(textContains("额外看3次").findOne(5000), btnSel, 3), 3 ); } //其他视频 function otherVideoTask() { log("其他视频任务:"); _watchVideos_(() => visibleToUser().text("看视频").findOnce(), 5); //冗余设计 } //检查是否有网络 function netcheck() { var r = http.get("www.baidu.com"); html = r.body.string(); var reg = new RegExp("百度一下,你就知道"); if (reg.test(html)) { toastLog("网络正常"); } else { toastLog("无网络打开GWIFI联网"); launch("com.gbcom.gwifi"); waitForPackage("com.gbcom.gwifi"); log("GWIFI启动完成"); sleep(12000); home(); sleep(1000); } } //唤醒屏幕 function wakeup() { for (let i = 1; i < 11; i++) { if (!device.isScreenOn()) { device.wakeUp(); // 唤醒设备 log("亮屏" + i + "次"); sleep(1000); } else if (i == 10) { log("亮屏失败退出"); exit(); } else { log("已亮屏"); device.keepScreenOn(4800 * 1000); // 保持亮屏 break; } } } //判断是否有屏幕锁 function isDeviceLocked() { importClass(android.app.KeyguardManager); importClass(android.content.Context); var km = context.getSystemService(Context.KEYGUARD_SERVICE); return km.isKeyguardLocked(); } // 输入密码 function password_input() { var password = "******"; //输入你的6位解锁密码 for (var i = 0; i < password.length; i++) { var p = text(password[i].toString()).findOne(1000); longClick(p.centerX(), p.centerY()); sleep(100); } log("解锁成功"); } //解锁屏幕 function unlock() { for (let l = 1; l < 6; l++) { if (isDeviceLocked()) { sml_move(540 * KX, 1800 * KY, 600 * KX, 1000 * KY, 500); log("滑动屏幕" + l + "次"); var mima = text("输入密码").findOne(2000); if (mima != null) { log("输入密码"); password_input(); break; } } else if (l == 5) { log("解锁失败退出"); exit(); } else { log("无需解锁"); break; } } } //翻倍 function doubleReward(state) { let times = 2; while (state && times > 0) { sleep(600); //点击今日奖励翻倍 let btn = id("btnVideoCheckIn").findOne(2000); if (btn) { if (btn.findOne(text(".*福利"))) return false; toastLog("点击今日奖励翻倍"); btn.click(); sleep(600); let btnRight = id("btnRight").findOne(1800); if (btnRight) { btnRight.click(); log("点击播放"); } closeAD(); return true; } else { btn = idContains("btnToCheckIn").findOne(1500); if (btn) { toastLog("无双倍奖励,去签到页"); if (!btn.click()) btn.parent().click(); sleep(3 * 1000); return false; } if (id("browser_title").text("签到").exists()) { toastLog("已到签到页"); return false; } times--; if (!times) { toastLog("重试超限,跳过奖励翻倍任务"); return false; } back(); } } } //签到页 function videoCheckIn(state) { let times = 6; let btn = null; while (times-- > 0 && !id("browser_title").text("签到").exists()) { if (!times) { toastLog("重试超限,退出"); return; } btn = id("btnVideoCheckIn").findOne(1.7 * 1000); if (!btn) { btn = id("btnCheckIn").findOne(1.7 * 1000); } if (btn) { if (btn.findOne(textContains("奖励"))) { back(); continue; } toastLog("去签到页"); btn.click(); sleep(3 * 1000); } else { toastLog("找不到按钮,重试"); back(); sleep(1000); } } if (!state) { sleep(1500); btns = text("去翻倍").findOnce(); if (btns != null) { btns.forEach(function (btn) { toastLog("去翻倍"); btn.click(); closeAD(); }); } } toastLog("查找按钮领点币"); btn = desc("看视频再领起点币,最高10点").findOne(5 * 1000); if (btn) { toastLog("点击看视频领点币"); btn.click(); closeAD(); } else { toastLog("找不到视频按钮,退出任务"); return; } } //抽奖 function lottery() { //toastLog("查找抽奖弹窗按钮"); let bt = textMatches(/去抽奖 ×1|看视频得抽奖机会/).findOne(3000); if (bt) { if (!/详情|明/.test(bt.text())) { bt.click(); id("layoutMainView").waitFor(); sleep(3000); for (let i = 0; i < 8; i++) { let bt2 = OCRFindText(390 * KX, 1018 * KY, 300 * KX, 120 * KY); if (bt2) { if (bt2 == "明天再来") { toastLog("无抽奖机会,退出1"); break; } else if (bt2 == "抽奖") { toastLog("抽奖"); click(541 * KX, 1075 * KY); sleep(7000); } else if (bt2 == "看视频抽奖机会+1" || "看视频抽奖喜+1") { toastLog("增加抽奖次数"); for (i = 0; i < 10; i++) { click(541 * KX, 1075 * KY); sleep(1000); var adin = className("android.widget.RelativeLayout") .depth(4) .findOne(500); if (adin != null) { closeAD(); sleep(4000); break; } } } else { toastLog("无抽奖机会,退出2"); break; } } else { toastLog("识别不到控件,退出任务"); break; } } } else { toastLog("无抽奖机会,退出3"); } } else { toastLog("识别不到抽奖弹窗按钮,退出任务"); } sleep(1000); back(); } //只允许有一个同名脚本运行 function onlyOne() { let g = engines.myEngine(); var e = engines.all(), n = e.length; let r = g.getSource() + ""; 1 < n && e.forEach((e) => { var n = e.getSource() + ""; g.id !== e.id && n == r && e.forceStop(); }); } //清理后台 function clearrecents() { recents(); sleep(1000); var clearbox = id("clearbox").findOne(1000); if (clearbox != null) { click(clearbox.bounds().centerX(), clearbox.bounds().centerY()); sleep(1000); home(); } else { home(); } } function lock() { var success = runtime.accessibilityBridge .getService() .performGlobalAction( android.accessibilityservice.AccessibilityService .GLOBAL_ACTION_LOCK_SCREEN ); } //关闭屏幕 function closescreen() { var w = floaty.rawWindow(<frame gravity="center" bg="#000000" />); w.setSize(device.width, device.height); w.setPosition(0, -105 * KY); w.setTouchable(false); //保持脚本运行 setInterval(() => {}, 1000); } //每月福利 function monthfuli() { //log("等待进入福利广场"); var f1 = text("规则").exists(); var g1 = text("看视频得奖励").exists(); var f = text("规则").findOnce(); var g = text("看视频得奖励").findOnce(); while (f == null && g == null) { sleep(500); log("正在进入福利中心"); monthfuli(); break; } while (g != null) { var kanship = text("看视频").findOnce(); if (kanship != null) { click(kanship.bounds().centerX(), kanship.bounds().centerY()); closeAD(); var happyget = text("知道了").findOne(5000); if (happyget != null) { toastLog("自动点击"); click(happyget.bounds().centerX(), happyget.bounds().centerY()); backhome(); sleep(2000); EnterFuli(); } } else { break; } } } //仿真曲线滑动 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; } //仿真随机带曲线滑动 //qx, qy, zx, zy, time 代表起点x,起点y,终点x,终点y,过程耗时单位毫秒 function sml_move(qx, qy, zx, zy, time) { var xxy = [time]; var point = []; var dx0 = { x: qx, y: qy, }; var dx1 = { x: random(qx - 100, qx + 100), y: random(qy, qy + 50), }; var dx2 = { x: random(zx - 100, zx + 100), y: random(zy, zy + 50), }; var dx3 = { x: zx, y: zy, }; for (var i = 0; i < 4; i++) { eval("point.push(dx" + i + ")"); } //log(point[3].x) 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); } //log(xxy); gesture.apply(null, xxy); } //返回主界面 function backhome() { log("检测是否在主界面"); for (let i = 1; i < 21; i++) { //bounds(792, 114, 912, 234) //bounds(936, 111, 1056, 231) var homepage = findview1.findOnce() && findview2.findOnce(); if (homepage != null) { log("已在主界面"); break; } else if (i == 20) { log("返回主界面失败退出"); Abnormalexit(); break; } else { back(); log("正在返回主界面中..."); sleep(1000); } } } //广告自动关闭 function autoclose() { for (let i = 1; i < 11; i++) { //bounds(45, 150, 135, 243) //bounds(66, 171, 114, 222) //63,168,117,225 //bounds(66, 261, 117, 309) //bounds(45, 240, 138, 333) //36,165,129,258 //60,186,108,237 //bounds(60, 150, 150, 240) //bounds(33, 171, 126, 264) var closead1 = text("跳过广告").findOnce(); var closead2 = bounds(36 * KX, 165 * KY, 129 * KX, 258 * KY).findOnce(); var closead3 = bounds(60 * KX, 150 * KY, 150 * KX, 240 * KY).findOnce(); var closead4 = bounds(66 * KX, 261 * KY, 117 * KX, 309 * KY).findOnce(); var closead5 = bounds(33 * KX, 171 * KY, 126 * KX, 264 * KY).findOnce(); if ( closead1 != null || closead2 != null || closead3 != null || closead4 != null || closead5 != null ) { //全不为空 if (closead1 != null) { log("点击1退出按钮" + i + "次"); click(closead1.bounds().centerX(), closead1.bounds().centerY()); sleep(1000); } else if (closead2 != null) { log("点击2退出按钮" + i + "次"); click(closead2.bounds().centerX(), closead2.bounds().centerY()); sleep(1000); } else if (closead3 != null) { log("点击3退出按钮" + i + "次"); click(closead3.bounds().centerX(), closead3.bounds().centerY()); sleep(1000); } else if (closead4 != null) { log("点击4退出按钮" + i + "次"); click(closead4.bounds().centerX(), closead4.bounds().centerY()); sleep(1000); } else { log("点击5退出按钮" + i + "次"); click(closead5.bounds().centerX(), closead5.bounds().centerY()); sleep(1000); } } else if (i == 10) { log("关闭广告失败退出"); Abnormalexit(); break; } var signal1 = text("签到").findOnce(); var signal2 = text("福利中心").findOnce(); var signal3 = text("我知道了").findOnce(); if (signal1 != null || signal2 != null || signal3 != null) { break; } else { log("广告未关闭重试"); sleep(500); } var keepview = className("android.widget.TextView") .text("继续观看") .findOnce(); if (keepview != null) { click(keepview.bounds().centerX(), keepview.bounds().centerY()); closescreen(); sleep(5000); floaty.closeAll(); log("保持观看点击退出"); } } } //自动完成阅读任务 function Aread() { let j = 0; sleep(1000); for (let i = 1; i < 7; i++) { text("任务书单").untilFind(); var reading = className("android.widget.Button").text("阅读").findOne(5000); if (reading != null) { click(reading.centerX(), reading.centerY() + j); sleep(3000); log("第" + i + "次阅读开始"); for (let n = 0; n < 6; n++) { sml_move(900 * KX, 1334 * KY, 300 * KX, 1340 * KY, 200); sleep(500); if (n == 0) { click(543 * KX, 1230 * KY); sleep(1000); click(146 * KX, 2217 * KY); sleep(1000); for (let m = 0; m < 7; m++) { sml_move(540 * KX, 800 * KY, 540 * KX, 1900 * KY, 200); } sleep(1000); click(550 * KX, 476 * KY); var quxiao = text("取消").findOne(1000); if (quxiao != null) { click(quxiao.bounds().centerX(), quxiao.bounds().centerY()); } } closescreen(); sleep(20000); floaty.closeAll(); sleep(500); } log("第" + i + "次阅读结束"); back(); sleep(500); var quxiao = text("取消").findOne(2000); if (quxiao != null) { click(quxiao.bounds().centerX(), quxiao.bounds().centerY()); } j += 246; } } backhome(); sleep(1000); EnterFuli(); sml_move(540 * KX, step * KY, 540 * KX, 900 * KY, 200); sleep(5000); } //自动完成听书任务 function Alisten() { sleep(3000); var books = textEndsWith("万字").findOne(3000); if (books != null) { click(books.bounds().centerX(), books.bounds().centerY()); sleep(3000); var tingbook = id("tvAiAUdio").findOne(1000); if (tingbook != null) { click(tingbook.bounds().centerX(), tingbook.bounds().centerY()); sleep(3000); } } else { click(555, 1110); sleep(3000); var tingbook = id("tvAiAUdio").findOne(1000); if (tingbook != null) { click(tingbook.bounds().centerX(), tingbook.bounds().centerY()); sleep(3000); } } for (let i = 1; i < 5; i++) { var play = id("ivAddBook").findOne(5000); if (play != null) { var download = id("btnRight").findOne(2000); if (download != null) { log("等待下载语音包"); sleep(15000); } } else { var download = id("btnRight").findOne(2000); if (download != null) { log("等待下载语音包"); sleep(15000); } } sleep(2000); Imagecompare(); if (p) { closescreen(); log("听书开始"); for (let j = 0; j < 61; j++) { sleep(1000); } log("听书结束"); floaty.closeAll(); back(); var canceljoin = id("button_text_id") .className("android.widget.TextView") .text("取消") .findOne(3000); if (canceljoin != null) { click(canceljoin.bounds().centerX(), canceljoin.bounds().centerY()); } sleep(500); backhome(); id("ivClose").findOne().click(); sleep(2000); EnterFuli(); break; } else { log("未播放重试"); click(543 * KX, 1949 * KY); sleep(2000); } } } //每日任务 function Dailytask() { for (let u = 0; u < 8; u++) { sleep(3000); var tofinish = text("去完成").findOnce(u); let gametxt = textMatches(/当日玩游戏\d+分钟/).findOnce(); let btn = findOne(gametxt, textMatches(/领奖励|去完成|已领取/), 3); if (btn.text() == "去完成") { let leftTimeTips = findOne(gametxt, textContains("再玩"), 3); leftTime = parseInt(leftTimeTips.text().match(/\d+/)[0]); } if (tofinish != null) { click(tofinish.bounds().centerX(), tofinish.bounds().centerY()); sleep(4000); var tingshu = id("mTitleTextView").text("听原创小说").findOnce(); var gamecenter = id("browser_title").text("游戏中心").findOnce(); var huodong = className("android.widget.TextView") .text("分享任务") .findOnce(); var cartoon = id("search") .bounds(972 * KX, 141 * KY, 1044 * KX, 213 * KY) .findOnce(); var mainpage = findview1.findOnce() && findview2.findOnce(); var browseactivities = text("去阅读").findOnce(); if (browseactivities != null) { log("执行浏览任务"); sleep(5000); back(); sleep(2000); EnterFuli(); } if (mainpage != null) { log("跳过订阅任务"); sleep(1000); EnterFuli(); } else if (tingshu != null) { log("执行听书任务"); Alisten(); u = u - 1; } else if (gamecenter != null) { log(tofinish.bounds().centerY()); log(gametxt.bounds().centerY()); if (tofinish.bounds().centerY() - gametxt.bounds().centerY() < 40) { log("执行游戏任务"); log("游戏任务剩余时间:" + leftTime); playgame(); u = u - 1; } else { log("跳过充值任务"); back(); sleep(1000); } } else if (cartoon != null) { log("执行漫画任务"); Acartoon(); u = u - 1; } else if (huodong != null) { log("跳过活动任务"); back(); sleep(1000); } else { log("跳过任务"); sleep(5000); var morefuli = text("福利中心") .bounds(426, 111, 642, 192) .depth(16) .findOnce(); if (morefuli == null) { back(); } sleep(1000); } } } getjl(); } //获取奖励 function getjl() { let j = 0; for (let i = 0; i < 6; i++) { var LJL = text("领奖励").findOnce(i); if (LJL != null) { click(LJL.bounds().centerX(), LJL.bounds().centerY()); var get = text("知道了").findOne(5000); if (get != null) { click(get.bounds().centerX(), get.bounds().centerY()); i = i - 1; j++; log("已领取奖励" + j + "次"); sleep(2000); } } else { log("已无奖励退出"); break; } } } function Fulicenter() { sleep(1000); var dianjiwo = id("view_tab_title_title") .className("android.widget.TextView") .text("我") .findOne(1000); if (dianjiwo != null) { click(dianjiwo.bounds().centerX(), dianjiwo.bounds().centerY()); } sleep(1000); var fulizx = text("福利中心").findOne(5000); if (fulizx != null) { click(fulizx.bounds().centerX(), fulizx.bounds().centerY()); } sleep(3000); var tiaoguo = text("跳过教程").findOne(1000); if (tiaoguo != null) { click(tiaoguo.bounds().centerX(), tiaoguo.bounds().centerY()); } var openbox = text("1次免费开宝箱机会").findOnce(5000); if (openbox != null) { clickButton(waitView("立即开启")); clickButton(waitView("看视频再领取一次")); closeAD(); autoclose(); sleep(3000); } text("看视频得奖励").untilFind; sleep(3000); } //进入福利中心 function EnterFuli() { sleep(1000); var dianjiwo = id("view_tab_title_title") .className("android.widget.TextView") .text("我") .findOne(1000); if (dianjiwo != null) { click(dianjiwo.bounds().centerX(), dianjiwo.bounds().centerY()); } sleep(1000); var fulizx = text("福利中心").findOne(5000); if (fulizx != null) { click(fulizx.bounds().centerX(), fulizx.bounds().centerY()); } sleep(3000); var tiaoguo = text("跳过教程").findOne(1000); if (tiaoguo != null) { click(tiaoguo.bounds().centerX(), tiaoguo.bounds().centerY()); } text("每日福利").untilFind; var unfold = className("android.widget.TextView").text("展开").findOne(1000); if (unfold != null) { click(unfold.bounds().centerX(), unfold.bounds().centerY()); } sleep(3000); sml_move(540 * KX, 1800 * KY, 540 * KX, 400 * KY, 200); sleep(5000); } //图片比对 function Imagecompare() { //captureScreen("/sdcard/脚本/Listen.png"); //var rawimg = images.read("/sdcard/脚本/Listen.png"); //log("截图成功"); //ROI区域(x,y,宽,高) //var pauseorplay = images.clip(rawimg,438,1848,204,204); //images.save(pauseorplay, "/sdcard/脚本/pauseorplay.png"); var img_small = images.read("/sdcard/脚本/img/pauseorplay.png"); //找图 //在大图片中查找小图片的位置(模块匹配),找到时返回位置坐标(Point),找不到时返回null。 var img = captureScreen(); //images.save(img, "/sdcard/脚本/Listen.png"); //var pauseorplay = images.clip(img,450,1776,174,174); //images.save(pauseorplay, "/sdcard/脚本/pauseorplay.png"); p = findImage(img, img_small, { threshold: 0.6 }); if (p && p.length > 0) { p = null; } img_small.recycle(); img.recycle(); } //看漫画任务 function Acartoon() { //bounds(564, 1220, 1032, 1688) //(564, 1220, 1032, 1688) id("search").untilFind(); sleep(3000); click(806 * KX, 1447 * KY); sleep(2000); var lookcartoon = text("立即阅读").findOne(3000); if (lookcartoon != null) { click(lookcartoon.bounds().centerX(), lookcartoon.bounds().centerY()); sleep(1000); for (let i = 1; i < 16; i++) { className("android.view.View").untilFind(); log("第" + i + "次阅读开始"); closescreen(); for (let j = 0; j < 20; j++) { sleep(1000); } floaty.closeAll(); sleep(500); log("第" + i + "次阅读结束"); sml_move(540 * KX, 1500 * KY, 540 * KX, 900 * KY, 200); sleep(500); } back(); sleep(500); var buyong = text("不用了").findOne(2000); if (buyong != null) { click(buyong.bounds().centerX(), buyong.bounds().centerY()); } backhome(); sleep(1000); EnterFuli(); } } //周末兑换章节卡 function exchange() { log("兑换章节卡"); if (!exchanges || new Date().getDay()) { log("非周日或者设置不领取"); return; } let x = device.width * 0.75, y = device.height * 0.25; log(x, y); let txt = text("兑换").findOne(2000); if (!txt) { log("找不到控件,结束"); return; } clicks(txt, 2); txt = textMatches(/\s*\d+\s*张碎片可兑换/).findOne(2000); let n = txt ? parseInt(txt.text().match(/\d+/)[0]) : 0; log("%d张碎片可兑换", n); switch (true) { case n < 15: log("碎片不够15张,结束兑换"); click(x, y); return; case n < 20: n = 15; break; case n < 30: n = 20; break; case n >= 30: n = 30; } let locate = text(n + "张碎片兑换").findOne(2000); clicks(findOne(locate, text("兑换"), 2)); clicks(className("Button").text("兑换").findOne(3000)); sleep(2000); if (textMatches(/.*验证.*/).findOne(2000)) { console.error("有验证,兑换失败"); clicks(textContains("关闭").findOne(1000)); sleep(500); } click(x, y); backhome(); checkInAndToCenter(); } function freeReSignin() { let signindays = textMatches(/当前连续签到.*/).findOne(4000); if (signindays != null) { toastLog(signindays.text()); } sml_move(541 * KX, 300 * KY, 541 * KX, 1690 * KY, 1000); sleep(5000); log("查找免费补签"); //bounds(36, 711, 1044, 1326) let txt = OCRFindCoord(36 * KX, 711 * KY, 1008 * KX, 615 * KY, "免费补签"); if (txt && txt != null) { log("有未补签,进行补签"); sleep(600); click(txt[0], txt[1]); sleep(700); for (i = 0; i < 15; i++) { FreeButton = OCRFindCoord( 0 * KX, 982 * KY, 1080 * KX, 712 * KY, "看视频,免费补签一次" ); if (FreeButton == null) { sleep(1000); } else { click(FreeButton[0], FreeButton[1]); closeAD(); autoclose(); toastLog("补签完成"); break; } } } else { log("无需补签"); } } function playgame() { // 玩游戏 sleep(5000); waitForActivity("com.qidian.QDReader.ui.activity.QDBrowserActivity"); clickButton(waitView("新游")); sleep(5000); waitForActivity("com.qidian.QDReader.ui.activity.GameBrowserActivity"); clickButton(waitView("在线玩")); id("qd_recycler_view").waitFor(); closescreen(); //较长延时需用多重for循环,避免时间不精确 for (let i = 0; i < leftTime + 1; i++) { for (let j = 0; j < 60; j++) { sleep(1000); } } floaty.closeAll(); log("游戏挂机结束"); backhome(); sleep(1000); EnterFuli(); } /** * 根据文字查找按钮并点击 * @param {UiObject} view 按钮上的文字所在 view * @returns 是否成功点击 */ function clickButton(view) { if (view.text != null) { log("点击控件" + view.text()); } else if (view.desc != null) { log("点击控件" + view.desc()); } // 查找按钮所在控件 let btn = view; while (btn && !btn.clickable()) { btn = btn.parent(); } // 点击 if (btn) { btn.click(); return true; } return false; } /** * 查找带有某个文本的控件 * home.php?mod=space&uid=952169 {string} content 查找文本 * @param {string} mode 查找方式,默认 text,可选 match * @returns 第一个符合条件的控件,不存在返回 undefined */ function findView(content, mode) { log(`查找控件 ${content}`); let find; if (mode === "match") { find = textMatches(content) || descMatches(content); } else { find = text(content) || desc(content); } return find && find.exists() ? find.findOnce() : undefined; } /** * 查找带有某个文本的控件 * @param {string} content 查找文本 * @returns 第一个符合条件的控件 */ function waitView(content) { log(`等待控件 ${content}`); let view = text(content) || desc(content); view.waitFor(); return view.findOnce(); } function Switchaccount() { var dianjiwo = id("view_tab_title_title") .className("android.widget.TextView") .text("我") .findOne(1000); if (dianjiwo != null) { click(dianjiwo.bounds().centerX(), dianjiwo.bounds().centerY()); } sleep(1000); text("福利中心").untilFind; id("ivSetting").findOne().click(); waitView("设置"); sml_move(540, step, 540, 900, 400); clickButton(waitView("切换账号")); id("privacyView").waitFor(); click(96, 2143); sleep(1000); click(840, 1957); waitView("起点账号登录"); if (Account == account1[0]) { log("切换账号" + account2[0]); Accountname = id("mNickNameEditText").findOne(); Accountname.setText(""); sleep(500); Accountname.setText(account2[1]); sleep(1000); back(); //避免自动填充影响输入 sleep(1000); Accountpassword = id("mPwdEditText").findOne(); Accountpassword.setText(""); sleep(500); Accountpassword.setText(account2[2]); sleep(1000); clickButton(waitView("登录")); var updatepassword = text("更新").findOne(5000); //更新自动填充 if (updatepassword != null) { sleep(500); click( updatepassword.bounds().centerX(), updatepassword.bounds().centerY() ); } waitView(account2[0]); log(account2[0] + "登录成功"); } else if (Account == account2[0]) { log("切换账号" + account1[0]); Accountname = id("mNickNameEditText").findOne(); Accountname.setText(""); sleep(500); Accountname.setText(account1[1]); sleep(1000); back(); //避免自动填充影响输入 sleep(1000); Accountpassword = id("mPwdEditText").findOne(); Accountpassword.setText(""); sleep(500); Accountpassword.setText(account1[2]); sleep(1000); clickButton(waitView("登录")); var updatepassword = text("更新").findOne(5000); //更新自动填充 if (updatepassword != null) { sleep(500); click( updatepassword.bounds().centerX(), updatepassword.bounds().centerY() ); } waitView(account1[0]); log(account1[0] + "登录成功"); } else { log("未识别到账号,退出"); Abnormalexit(); } } function accountverify() { var dianjiwo = id("view_tab_title_title") .className("android.widget.TextView") .text("我") .findOne(1000); if (dianjiwo != null) { click(dianjiwo.bounds().centerX(), dianjiwo.bounds().centerY()); } var youngmode = id("btnEnterTeen").findOne(5000); if (youngmode != null) { log("点击我知道了"); click(540, 1479); } text("福利中心").untilFind; Account = id("tvName").findOne().text(); backhome(); } //查询子控件 function clicks(o, t) { let p = o, r = false; t = t || 1; if (!o) return r; while (t-- && !(r = p.clickable())) p = p.parent(); return p.click() || click(o.bounds().centerX(), o.bounds().centerY()); } //文本截取 function textcut(str, firstStr, secondStr) { if (firstStr == "") { str = "**" + str; firstStr = "**"; } if (secondStr == "") { str = str + "**"; secondStr = "**"; } if (str == "" || str == null || str == undefined) { return ""; } if (str.indexOf(firstStr) < 0) { return ""; } var subFirstStr = str.substring( str.indexOf(firstStr) + firstStr.length, str.length ); var subSecondStr = subFirstStr.substring(0, subFirstStr.indexOf(secondStr)); return subSecondStr; } //OCR文字识别 function OCRFindText(x, y, w, h) { let rawimg = captureScreen(); //log("截图成功"); //ROI区域(x,y,宽,高) let img = images.clip(rawimg, x, y, w, h); //images.save(img, "/sdcard/脚本/ocr.png"); const Predictor = com.baidu.paddle.lite.ocr.Predictor; // 指定是否用精简版模型 速度较快 let useSlim = false; // 创建检测器 let predictor = new Predictor(); // predictor.cpuThreadNum = 4 //可以自定义使用CPU的线程数 // predictor.checkModelLoaded = false // 可以自定义是否需要校验模型是否成功加载 默认开启 使用内置Base64图片进行校验 识别测试文本来校验模型是否加载成功 // 初始化模型 首次运行时会比较耗时 let loading = threads.disposable(); // 建议在新线程中初始化模型 threads.start(function () { loading.setAndNotify(predictor.init(context, useSlim)); // loading.setAndNotify(predictor.init(context)) 为默认不使用精简版 // 内置默认 modelPath 为 models/ocr_v3_for_cpu,初始化自定义模型请写绝对路径否则无法获取到 // 内置默认 labelPath 为 labels/ppocr_keys_v1.txt // let modelPath = files.path('./models/customize') // 指定自定义模型路径 // let labelPath = files.path('./models/customize') // 指定自定义label路径 // 使用自定义模型时det rec cls三个模型文件名称需要手动指定 // predictor.detModelFilename = 'det_opt.nb' // predictor.recModelFilename = 'rec_opt.nb' // predictor.clsModelFilename = 'cls_opt.nb' // loading.setAndNotify(predictor.init(context, modelPath, labelPath)) }); let loadSuccess = loading.blockedGet(); //log(`加载模型结果:${loadSuccess}`); let start = new Date(); let results = predictor.runOcr(img.getBitmap()); let OcrResult = null; if (results && results.length > 0) { //{"label":"看视频抽奖喜+1"}] OcrResult = results[0].label; } // 回收图片 rawimg.recycle(); img.recycle(); //log(OcrResult); return OcrResult; // 释放模型 用于释放native内存 非必需 // predictor.releaseModel() } function Abnormalexit() { images.save(captureScreen(), "/sdcard/脚本/img/SigninAbnormal.png"); captureScreen().recycle(); home(); sleep(1000); clearrecents(); sleep(1000); engines.stopAllAndToast(); device.cancelKeepingAwake(); lock(); } function OCRFindCoord(x, y, w, h, word) { if (!requestScreenCapture()) { log("请求截图失败"); exit(); } else { log("请求截图成功"); } let rawimg = captureScreen(); log("截图成功"); //ROI区域(x,y,宽,高) let img = images.clip(rawimg, x, y, w, h); //images.save(img, "/sdcard/脚本/ocr.png"); const Predictor = com.baidu.paddle.lite.ocr.Predictor; // 指定是否用精简版模型 速度较快 let useSlim = false; // 创建检测器 let predictor = new Predictor(); // predictor.cpuThreadNum = 4 //可以自定义使用CPU的线程数 // predictor.checkModelLoaded = false // 可以自定义是否需要校验模型是否成功加载 默认开启 使用内置Base64图片进行校验 识别测试文本来校验模型是否加载成功 // 初始化模型 首次运行时会比较耗时 let loading = threads.disposable(); // 建议在新线程中初始化模型 threads.start(function () { loading.setAndNotify(predictor.init(context, useSlim)); // loading.setAndNotify(predictor.init(context)) 为默认不使用精简版 // 内置默认 modelPath 为 models/ocr_v3_for_cpu,初始化自定义模型请写绝对路径否则无法获取到 // 内置默认 labelPath 为 labels/ppocr_keys_v1.txt // let modelPath = files.path('./models/customize') // 指定自定义模型路径 // let labelPath = files.path('./models/customize') // 指定自定义label路径 // 使用自定义模型时det rec cls三个模型文件名称需要手动指定 // predictor.detModelFilename = 'det_opt.nb' // predictor.recModelFilename = 'rec_opt.nb' // predictor.clsModelFilename = 'cls_opt.nb' // loading.setAndNotify(predictor.init(context, modelPath, labelPath)) }); let loadSuccess = loading.blockedGet(); //log(`加载模型结果:${loadSuccess}`); let start = new Date(); let results = predictor.runOcr(img.getBitmap()); let OcrCoord = null; if (results && results.length > 0) { for (let i = 0; i < results.length; i++) { if (results[i].label == word) { button = results[i].bounds; OcrCoord = [ Math.floor(x + button.left + (button.right - button.left) / 2), Math.floor(y + button.top + (button.bottom - button.top) / 2), ]; break; } } } //log(OcrResult); // 回收图片 rawimg.recycle(); img.recycle(); return OcrCoord; // 释放模型 用于释放native内存 非必需 // predictor.releaseModel() } //检查是否签到和进入福利中心 function checkInAndToCenter() { let selector1 = id("btnCheckIn"); let selector2 = text("做任务领章节卡"); let btn = selector1.findOne(5000); if (clicks(btn)) { let txt = btn.findOne(id("button_text_id")); if (txt.text() == "领福利") { log("已签到过了,去签到页"); } else { closeDialog(); clicks(selector1.findOne(2000)); } } else { clicks(selector2.findOne(5000)); } let c = 3; while ( c-- && !textMatches(/.*看视频得奖励.*|.*已连续签到.*天.*/).findOne(6e3) ) { log("未加载数据,返回重试"); back(); clicks(selector1.findOne(2000) || selector2.findOnce()); } } function closeDialog() { threads.start(function () { clicks(idMatches(/.*[cC]lose.*/).findOne(5000)); }); }