白嫖使我快乐!
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));
});
}