您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自用库
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/520147/1499234/gifshowjs.js
auto.waitFor(); global.AppName = "快手极速版"; global.packageName = "com.kuaishou.nebula"; global.running = false; //是否正在刷视频中 global.working = false; //是否正在刷视频中 global.startSec = Date.now();//刷视频计时 global.ver = 'v1.0';//版本号 if (!auto.service || device.width == 0) { console.warn("2.请重新开启无障碍服务"); auto.service.disableSelf(); app.startActivity({ action: "android.settings.ACCESSIBILITY_SETTINGS" }); android.os.Process.killProcess(android.os.Process.myPid()); } if(device.fingerprint+'/'+ver!=storages.create("gifshow").get('device_info')){setTimeout(function () {update();}, 60*1000);} //判断签到层 function singlecheck() { toastLog('判断签到提示'); var today = new Date(); if(storages.create("gifshow").get('singlecheck')==today.getDate()){ toastLog('今天已完成签到'); return; } //查找立即签到 var single = className('Button').textMatches(/立即签到/).clickable(true).visibleToUser(true).findOne(1000); if (single) { toastLog('1.点击立即签到'); single.click(); sleep(3000); toastLog('2.再次点击签到'); click(single.bounds().centerX(), single.bounds().centerY()); sleep(3000); back(); toastLog('3.签到结束关闭'); } else { toastLog('没有签到提示'); } storages.create("gifshow").put('singlecheck', today.getDate());//记录是否检测过签到 } //装载任务列表 function tasklist() { toastLog('查找金币暴涨tasklist'); gohome(); let moneybtn = className('androidx.appcompat.app.ActionBar$c').desc('去赚钱').clickable(true).boundsInside(device.width/2, device.height-300, device.width, device.height).visibleToUser(true).findOne(1000); if(moneybtn){ console.error('点击去赚钱tasklist'); click(moneybtn.bounds().centerX(),moneybtn.bounds().centerY()); sleep(8000); singlecheck();//判断签到层 } var TempArray = new Array(); if(className('Button').text('金币暴涨').findOne(1000)){ console.error('装载任务'); idMatches(/.*dailyTask/).className('android.view.View').visibleToUser(true).find().forEach(function (tv) { let list = tv.children(); for (i = 0; i < list.length; i++) { if (list[i].id()) { let title = list[i].find(className('TextView')); for (j = 0; j < title.length; j++) { if (title[j]) { //log(title[j].text()); if (title[j].text().match(/看广告得.*|看短剧得.*|看\d+次直播领金币|刷广告视频赚金币|看指定视频赚金币|.*签到.*/)) { let btn = list[i].find(className('android.view.View').clickable(true)); //log(btn[1]); TempArray.push(btn[1]); } } } } } }); console.error('装载完成:',TempArray.length); }else{ toastLog('没有找到金币暴涨tasklist'); } return TempArray; } //点击右下角宝箱函数 function moneybox() { toastLog('查找右下角宝箱moneybox'); gohome(); let moneybtn = className('androidx.appcompat.app.ActionBar$c').desc('去赚钱').clickable(true).boundsInside(device.width/2, device.height-300, device.width, device.height).visibleToUser(true).findOne(1000); if(moneybtn){ console.error('点击去赚钱moneybox'); click(moneybtn.bounds().centerX(),moneybtn.bounds().centerY()); sleep(8000); singlecheck();//判断签到层 } if(className('Button').text('金币暴涨').findOne(1000)){ console.error('点击宝箱'); click(device.width - 150, device.height - 300); sleep(5000); //倒计时结束,才能开宝箱哦 let x = className('Button').textMatches(/去看广告得最高\d+金币/).visibleToUser(true).findOne(1000); if (x) { click(x.bounds().centerX(), x.bounds().centerY());//再次点弹出宝箱层中的红色按钮 sleep(5000); } else { var popdiv=textMatches(/倒计时结束.*/).visibleToUser(true).findOne(1000); if(popdiv){ toastLog('等待宝箱倒计时'); let closebtn=popdiv.parent().parent().parent().child(0); if(closebtn)click(closebtn.bounds().centerX(),closebtn.bounds().centerY()); }else{ toastLog('1.未进入宝箱视频'); } return; } //如果进入看视频赚金币则观看视频 let advedio = idMatches(/.*countdown_info_container/).boundsInside(0, 0, device.width, 500).visibleToUser(true).findOne(1000); let liveing = idMatches(/.*live_close_container/).boundsInside(device.width - 500, 0, device.width, 500).visibleToUser(true).findOne(1000); if (advedio || liveing) { playvideo(); console.error('宝箱任务结束moneybox'); } else { toastLog('2.未进入宝箱视频'); } }else{ toastLog('没有找到金币暴涨moneybox'); } } //判断进入看广告视频赚金币 function playvideo() { function stopvideo() { sleep(1000); //操作弹出提示 var okbtn = className('TextView').textMatches(/再看\d{1,2}.*/).findOnce(); if (okbtn) { let btn = className('TextView').text('放弃奖励').findOnce(); click(btn.bounds().centerX(), btn.bounds().centerY() - 120); var b = okbtn.text().match(/\d+/); var t = 1 * (b ? b[0] : 1) + random(8, 13); cutDownBySleep(t, '再看'); back(); } var okbtn = className('TextView').textMatches(/领取奖励|退出直播间/).findOnce(); if (okbtn) { click(okbtn.bounds().centerX(), okbtn.bounds().centerY()); var t = random(8, 13); cutDownBySleep(t, okbtn.text()); } var okbtn = className('Button').textMatches(/继续赚金币/).findOnce(); if (okbtn) { click(okbtn.bounds().centerX(), okbtn.bounds().centerY()); var t = random(8, 13); cutDownBySleep(t, '继续'); } sleep(1000); console.log('2.----------------------------'); } working = true; console.error('开始循环赚金币playvideo'); var okbtn = className('TextView').textMatches(/\d{1,2}s后可领取.*|已成功领取.*/).boundsInside(0, 0, device.width / 2, 300).visibleToUser(true).findOnce(); while (okbtn) { console.log('1.----------------------------'); var b = okbtn.text().match(/^\d+/); var t = 1 * (b ? b[0] : 1) + random(5, 9); cutDownBySleep(t, '看广告'); //点击左上角或back() click(okbtn.bounds().centerX(), okbtn.bounds().centerY()); stopvideo(); okbtn = className('TextView').textMatches(/\d{1,2}s后可领取.*|已成功领取.*/).boundsInside(0, 0, device.width / 2, 300).visibleToUser(true).findOnce(); } //看直播领金币 if (className('TextView').text('看直播领金币').findOnce()) { console.log('看直播领金币'); //选择直播间,这里应该循环10次,每4次向上滚动一次 let view = idMatches(/.*recycler_view/).findOne(1000); if(view){ let i=1; while(i<99){ for (j = 0; j < view.childCount(); j++) { toastLog('观看第'+(i*4+j+1)+'个直播'); if(view.child(j))view.child(j).click();//进入直播间 sleep(3000); let liveing = idMatches(/.*live_close_container/).boundsInside(device.width - 500, 0, device.width, 500).visibleToUser(true).findOne(1000); if(liveing){ cutDownBySleep(random(8,13), '看直播领金币'); //点击退出直播间 click(liveing.bounds().centerX(),liveing.bounds().centerY()); sleep(1000); var okbtn = className('TextView').textMatches(/继续观看|领取奖励|退出.*/).findOnce(); if (okbtn) { sleep(1000); click(okbtn.bounds().centerX(),okbtn.bounds().centerY()); if(okbtn.text()=='继续观看'){ let a = idMatches(/.*close_dialog_title/).className('TextView').findOnce(); let b = a.text().match(/\d+/); let t = 1 * (b ? b[0] : 1) + random(8,13); cutDownBySleep(t, okbtn.text()); } sleep(1000); } } } i++; if((i*4+j+1)>15){ log('=============',(i*4+j+1)); break; } view.scrollForward(); sleep(3000); } } } //刷广告视频赚金币 let back_btn = className('ImageView').desc("返回").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000); if (back_btn) { console.log('刷广告视频赚金币'); let j=1; while(back_btn){ if(j>50)break; console.log('刷广告',j); var t = random(20, 30); cutDownBySleep(t, '刷广告'); click(back_btn.bounds().centerX(),back_btn.bounds().centerY()); stopvideo(); back_btn = className('ImageView').desc("返回").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000); j++; } back(); } //返回 if (!className('Button').text('金币暴涨').findOne(1000)) back(); stopvideo(); console.error('循环赚金币结束playvideo'); working = false; } //主程序函数=============================================================== function Main(){ var loopTimes = random(3,5); //work循环次数 function work() { toastLog("开始工作work"); var listArray = tasklist(); if (listArray.length > 0) { sleep(3000); toastLog('开始做任务'); for (i = 0; i < listArray.length; i++) { if (listArray[i]) { toastLog(listArray[i].text()); //点击任务 click(listArray[i].bounds().centerX(), listArray[i].bounds().centerY()); sleep(3000); playvideo(); } } } //开宝箱 moneybox(); //回到首页准备刷视频 console.error("开始刷视频模式+++++++++++++"); gohome(); startSec = Date.now(); gogogo(50); console.error("刷视频模式结束+++++++++++++"); } //打开快手App if (getPackageName(AppName)) { openApp(AppName); //等待进入主界面成功 toastLog('进入主函数'+ver); gohome(); sleep(3000); //先检测签到提示是否自动弹出在【首页】 //singlecheck(); //sleep(3000); toastLog("刚启动先刷一会视频"); gogogo(10); while (loopTimes > 0) { work();//开始工作 sleep(5000); loopTimes--; } console.clear(); console.warn('运行结束关闭应用'); } else { console.warn("未安装:" + AppName); work_thread.interrupt(); device.cancelKeepingAwake(); engines.myEngine().forceStop(); return; } console.show(); console.warn('执行完成用时' + SecondsToHMS((Date.now() - starttime) / 1000)); sleep(5000); console.hide(); closeApp(AppName); sleep(3000); oled(random(600,900));//熄屏挂机约10~15分钟左右 } function getHomeBtn(){ var homepage = idMatches(/.*left_btn/).desc("侧边栏").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000); var topbtn = descMatches(/发现|关注/).selected(true).boundsInside(0, 0, device.width, 500).visibleToUser(true).findOne(1000); return (homepage!=null&&topbtn!=null); } function gohome() { function closediv(){ //关闭弹出层 var popdiv=className('Image').text('huge_sign_marketing_popup').findOne(1000); if(popdiv){ let closebtn=popdiv.parent().parent().child(0); if(closebtn)click(closebtn.bounds().centerX(),closebtn.bounds().centerY()); } } toastLog('回到首页gohome'); closediv(); var homepage = idMatches(/.*left_btn/).desc("侧边栏").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000); if(!homepage){ var MaxLoop = 5; while (!homepage && MaxLoop > 0) { MaxLoop--; back(); sleep(3000); var okbtn = className('TextView').textMatches(/退出.*/).findOnce(); if(okbtn){okbtn.click();sleep(3000);} homepage = idMatches(/.*left_btn/).desc("侧边栏").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000); } } if(homepage){ var btn=idMatches(/.*textView/).desc("发现").visibleToUser(true).findOne(1000); if(btn)click(btn.bounds().centerX(),btn.bounds().centerY()); sleep(3000);closediv(); }else{ toastLog('需要重启软件【截图】'); //截图保存界面,以备后续查看 captureScreen(files.getSdcardPath() + '/脚本/gohome1_' + currentActivity() + '.png'); sleep(1000); device.wakeUp();//唤醒设备 sleep(1000); left2right(1); sleep(1000); closeApp(AppName); sleep(5000); openApp(AppName); sleep(1000); } } function randomHeart(num) { let randomIndex = num ? num : random(1, 30); //随机恢复到首页 if (randomIndex % 5 == 0) { console.log('拟人:随机回首页'); gohome(); return; } //随机点赞 if (randomIndex % 6 == 0) { var like = id('like_element_click_layout').clickable(true).boundsInside(device.width-300, device.height/2, device.width, device.height).visibleToUser(true).findOnce(); if (like) { console.log('拟人:随机点赞'); click(like.bounds().centerX(),like.bounds().centerY()); return; } } //随机评论 if(randomIndex % 7 == 0){ var plug = id('comment_element_click_layout').longClickable(true).boundsInside(device.width-300, device.height/2, device.width, device.height).visibleToUser(true).findOne(1000); if(plug){ console.log('拟人:随机评论'); //长按评论按钮 longClick(plug.bounds().centerX(),plug.bounds().centerY()); sleep(1000); var plugdiv=id('emoji_quick_send_list').className('android.view.ViewGroup').visibleToUser(true).findOne(1000); if(plugdiv){ let icoY=plugdiv.bounds().bottom-90; let icoX=[ plugdiv.bounds().left+90, plugdiv.bounds().left+220, plugdiv.bounds().left+350, plugdiv.bounds().left+500 ]; let index = random(1, icoX.length) - 1; //console.log(icoX[index],icoY); click(icoX[index],icoY); sleep(3000); } } } //随机收藏 if (randomIndex % 8 == 0) { var collect = id('click_area_collect').clickable(true).boundsInside(device.width-300, device.height/2, device.width, device.height).visibleToUser(true).findOnce(); if (collect) { console.log('拟人:随机收藏'); click(collect.bounds().centerX(),collect.bounds().centerY()); return; } } //随机下滑 if (randomIndex % 9 == 0) { console.log('拟人:随机下滑'); swipe(device.width / 2, device.height * 0.1 + randomIndex, device.width / 2, device.height * 0.9 - randomIndex, random(500, 1500)); return; } //连续上滑 if (randomIndex % 10 == 0) { console.log('拟人:连续上滑'); var k = random(2, 4); for (var i = 0; i < k; i++) { var j = random(2, 5); if (j == 3) { swipe(device.width / j, device.height * 0.1 + j * k, device.width / j, device.height * 0.9 - j * k, j * 50); } else { swipe(device.width / j, device.height * 0.9 - j * k, device.width / j, device.height * 0.1 + j * k, j * 50); } sleep(j * 250); } return; } //向上滑 slidingByCurve(); } function isvideoPage() { console.verbose("检测是否视频播放中isvideoPage"); var isvideo = false; var homepage = getHomeBtn(); if (homepage) { //关闭自动弹出的层 var div1 = idMatches(/.*design_bottom_sheet.*|.*content_nest.*|.*recyclerView.*/).visibleToUser(true).findOnce(); if (div1) { toastLog('0.关闭弹出层'); //captureScreen(files.getSdcardPath() + '/脚本/isvideoPage_' + currentActivity() + '.png'); //sleep(1000); click(80, 150); sleep(3000); } var living = idMatches(/.*live_close_container/).boundsInside(device.width-300, 0, device.width, 300).visibleToUser(true).findOnce();//直播间 if (living) { toastLog("1.退出直播间"); click(living.bounds().centerX(), living.bounds().centerY()); sleep(2000); var div0=text('退出直播间').visibleToUser(true).findOnce(); if(div0)click(div0.bounds().centerX(), div0.bounds().centerY()); sleep(2000); } //id=live_slide_view_pager if (currentActivity() == 'com.kuaishou.live.core.basic.activity.LiveSlideActivity') { toastLog("2.退出直播间"); back();sleep(2000); var div0=text('退出直播间').visibleToUser(true).findOnce(); if(div0)click(div0.bounds().centerX(), div0.bounds().centerY()); } isvideo=idMatches(/.*nasa_groot_view_pager/).visibleToUser(true).findOnce(); //log(isvideo); } return isvideo; } function gogogo(n) { let gotime = random(3,6); //刷视频每n分钟结束一次 for (var i = 1; i <= n; i++) { let flashtime=parseInt((Date.now() - startSec) / 1000); console.log('第'+i+'次刷视频,累计用时:',flashtime,'秒'); if( flashtime > gotime*60){console.warn(gotime+'分种超时,停止刷视频'); running = false; floaty.closeAll(); break;} if (isvideoPage()) { running = true; randomHeart();//拟人化 cutDownBySleep(random(6, 30),'观看视频:');//每个视频随机时间 6-30s } else { running = false; toastLog('not at the video page'); var dialog = currentActivity(); if (!dialog.match(/android\.app\.Dialog|android\.widget\.FrameLayout/)) { //截图保存界面,以备后续查看 console.info('【gogogo截图】',dialog); captureScreen(files.getSdcardPath() + '/脚本/gogogo_' + dialog + '.png'); gohome(); } sleep(3000); } } running = false; } function cutDownBySleep(lasterSecend, message) { message = message || ""; floaty.closeAll(); var fwin = floaty.rawWindow( `<frame id="frame" alpha="0" w="{{device.width-500}}px" h="150px" marginTop="{{device.height-550}}px" marginLeft="250px" marginRight="250px"> <card w="auto" h="auto" layout_gravity="center" cardCornerRadius="5dp" cardBackgroundColor="#eeeeee" > <text id="title" text="" textColor="#333333" textSize="13sp" padding="12 8" /> </card> </frame>` ); fwin.setTouchable(false); sleep(300); for (let i = lasterSecend; i >= 0; i--) { if (!running && !working) { break; } if (!fwin || !fwin.title) { break; } ui.run(() => { fwin.title.setText(message + "剩余" + i + "秒"); fwin.frame.attr("alpha", 0.8); }); sleep(1000); } fwin=null; floaty.closeAll(); } function slidingByLine() { // top X,Y范围 tx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2)); ty = randomPointLoc(parseInt(device.height / 5), parseInt(device.height / 4)); // bottom X,Y 范围 bx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2)); by = randomPointLoc(parseInt(3 * device.height / 4), parseInt(4 * device.height / 5)); slidingTime = randomRangeTime(0.8, 1.3); log("上滑:随机直线"); //log("X: "+ Math.abs(bx-tx) + " Y: "+ Math.abs(by - ty)); swipe(bx, by, tx, ty, slidingTime); } function left2right(direction) { var intX=parseInt(Math.random()*200+400); var intY=parseInt(Math.random()*200+200); var distance=parseInt(Math.random()*100+device.height/4); switch (direction) { case 1: //向上小距离 sml_move(intX, intY + distance, intX, intY, 400); break; case 2: //向下小距离 sml_move(intX, intY, intX, intY + distance, 400); break; case 3: //向左翻屏 sml_move( device.width / 2 + parseInt(Math.random() * 100) + 300, device.height / 4 - parseInt(Math.random() * 200) + 100, 0 + parseInt(Math.random() * 100), device.height / 5 + parseInt(Math.random() * 100), 500 ); break; case 4: //向右翻屏 sml_move( device.width / 2 - parseInt(Math.random() * 100) - 300, device.height / 5 - parseInt(Math.random() * 200) + 100, device.width - parseInt(Math.random() * 100), device.height / 4 + parseInt(Math.random() * 100), 500 ); break; } sleep(1000); } function slidingByCurve() { // top X,Y范围 tx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2)); ty = randomPointLoc(parseInt(device.height / 5), parseInt(device.height / 4)); // bottom X,Y 范围 bx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2)); by = randomPointLoc(parseInt(2 * device.height / 3), parseInt(3 * device.height / 4)); slidingTime = randomRangeTime(0.2, 0.6); log("上滑:仿真曲线"); //log("X: "+ Math.abs(bx-tx) + " Y: "+ Math.abs(by - ty)); sml_move(bx, by, tx, ty, slidingTime); } function randomPointLoc(start, end) { len = Math.abs(end - start); loc = Math.floor(Math.random() * len) + start; return loc; } function randomRangeTime(start, end) { len = Math.abs(end - start) * 1000; ms = Math.floor(Math.random() * len) + start * 1000; return ms; } 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) { let newPoint=bezier_curves(point, i); xxyy = [parseInt(newPoint.x), parseInt(newPoint.y)] xxy.push(xxyy); } try { gesture.apply(null, xxy); } catch (e) { log('error:',xxy); } } 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; } function SecondsToHMS(seconds) { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const remainingSeconds = Math.floor(seconds % 60); return (hours > 0 ? hours + "时" : "") + (minutes > 0 ? minutes + "分" : "") + remainingSeconds + "秒"; } function getindexInParent(child) { var parent = child.parent(); for (var i = 0; i < parent.childCount(); i++) { if (parent.child(i).find(className('CheckBox').checked(true).visibleToUser(true)).length > 0) { return i; } } return -1; // 如果找不到子元素,则返回-1 } function isRectInScreen(bounds) { var x = bounds.left, y = bounds.top, a = bounds.right, b = bounds.bottom; return ( x >= 0 && x <= device.width && y >= 0 && y <= device.height && a > 0 && a <= device.width && b > 0 && b <=device.height ); } function openApp(appname){ console.warn('启动应用:' + appname); var appstate = launchApp(appname); sleep(5000); if (appstate) { toastLog("应用正在运行"); } else { toastLog("无法自启动,需模拟点击"); home();//要启动的APP必须放在第一页中 sleep(3000); var app = id("item_title").text(appname).visibleToUser(true).findOne(2000); if (app) { click(app.bounds().centerX(), app.bounds().top - 50); sleep(8000); }else{ toastLog('要启动的APP必须放在首页,即按Home能看到的那一页'); work_thread.interrupt(); engines.myEngine().forceStop(); exit(); } } } function closeApp(appname) { let packageName = getPackageName(appname); // 使用ADB命令强行结束进程 //shell("adb shell am force-stop " + packageName); console.warn('关闭应用:' + appname); app.openAppSetting(packageName); text(app.getAppName(packageName)).waitFor(); let is_sure = textMatches(/.*强行停止.*/).visibleToUser(true).findOnce(); if (is_sure&&is_sure.enabled()) { try { var btn = className("Button").text('强行停止').visibleToUser(true).findOnce(); if (btn) btn.click(); sleep(1000); btn = className("Button").text('强行停止').visibleToUser(true).findOnce(); if (btn) btn.click(); sleep(1000); btn = className("Button").text('确定').visibleToUser(true).findOnce(); if (btn) btn.click(); back(); back(); back(); home(); } catch (e) { log(app.getAppName(packageName) + "应用已被关闭"); sleep(1000); back(); back(); back(); home(); } } else { log(app.getAppName(packageName) + "应用不能被正常关闭"); back(); back(); back(); home(); } } function update(){ http.get('https://update.greasyfork.org/scripts/520135/%E5%BF%AB%E6%89%8B%E8%84%9A%E6%9C%AC.js', {}, function(res, err){ if(res.statusCode == 200){ var Source = res.body.bytes(); if(Source){ files.writeBytes(files.getSdcardPath() + '/脚本/快手脚本.js', Source); console.verbose('更新主程序:成功',ver); }else{ console.verbose('更新主程序:错误',ver); } }else{ console.verbose('更新主程序:失败',ver); } }); } //=================================================================================== requestScreenCapture(false);//请求截图权限 runtime.getImages().initOpenCvIfNeeded();//初始化OpenCv global.starttime = Date.now();//程序运行开始时间 var oledwin = null, win = null; function oled(i) { let j=i||3; floaty.closeAll(); oledwin = floaty.rawWindow( `<frame bg="#000000"> <card w="auto" h="auto" layout_gravity="center" cardBackgroundColor="#000000" > <vertical> <text id="texts" text="息屏挂机模式" textColor="#999999" textSize="13sp" /> <button id="button" text="退出挂机" margin="0 20" /> </vertical> </card> </frame>` ); oledwin.button.on("click", function () { console.info('手动停止挂机'); floaty.closeAll(); oledwin=null; }); oledwin.setSize(-1, -1); oledwin.setTouchable(true); sleep(300); console.info('挂机模式开启……'); //保持脚本运行 while (j > 0 && oledwin) { if (oledwin.texts) { let t = parseInt(j / 60) + "分" + parseInt(j % 60) + "秒"; ui.run(() => { oledwin.texts.setText("息屏挂机倒计时:" + t + "\n\n倒计时结束后重启主线程gifshow") }); } j--; sleep(1000); } floaty.closeAll(); oledwin=null; console.info('挂机结束用时:',(parseInt((i-j) / 60) + "分" + parseInt((i-j) % 60) + "秒")); } function Observer() { function unique(arr) { let newArr = [arr[0]]; for (let i = 1; i < arr.length; i++) { let flag = false; for (var j = 0; j < newArr.length; j++) { if (arr[i] == newArr[j]) { flag = true; break; } } if (!flag) { newArr.push(arr[i]); } } return newArr; } var currentActis = new Array(); for (let c = 0; c < 59; c++) {//连续扫描60秒后返回结果,如果60秒停留在同一活动页面,则就要重启线程了 var btntxt = textMatches(/同意|满意|关闭|关闭应用|不在提醒|我知道了|以后再说|暂不使用|忽略提醒|仍要退出/).visibleToUser(true).findOnce(); if (btntxt && btntxt.packageName() == packageName) { console.warn('点击:' + btntxt.text()); //截图保存界面,以备后续查看 //captureScreen(files.getSdcardPath() + '/脚本/Observer1_' + currentActivity() + '.png'); click(btntxt.bounds().centerX(),btntxt.bounds().centerY()); } //toastLog(currentActivity()); currentActis[c] = currentActivity(); sleep(1000);//这是每秒扫描一次活动页 } //检测oled挂机模式结束,则重启main线程 if (oledwin) { win = oledwin; return true; } else if (win) { win = null; return false; } //toastLog(currentActivity()); let ac = unique(currentActis); let cc = currentActivity().match(/.*HomeActivity|.*PhotoDetailActivity|.*AwardVideoPlayActivity|.*AdKwaiRnActivity|.*app\.Dialog|android\.widget\.FrameLayout/gi); if (ac.length == 1 && !cc) { console.info('60秒卡顿:',ac[0]); //截图保存界面,以备后续查看 captureScreen(files.getSdcardPath() + '/脚本/Observer2_' + currentActivity() + '.png'); return false; } return true; } // 》》》》》》》》》》》》》》》》》》》 START work_thread = threads.start(function () { Main(); }); observer_thread = threads.start(function () { setInterval(function () { console.verbose('--------多线程安全检测---------'); if(oledwin){if(oledwin.texts)console.verbose(oledwin.texts.text().split("\n").shift());} if (running) { let worktime = parseInt((Date.now() - starttime) / 1000); console.verbose("脚本连续运行:" + SecondsToHMS(worktime)); //如果运行时间超过4小时,则关闭应用,停止脚本。 if (worktime > 60 * 60 * 4) { device.cancelKeepingAwake(); work_thread.interrupt(); console.show(); console.clear(); console.warn("脚本连续运行超4小时,终止运行!"); sleep(5000); console.hide(); closeApp(AppName); sleep(5000); //熄屏 runtime.accessibilityBridge.getService().performGlobalAction(android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN); //停止本脚本 //engines.myEngine().forceStop(); //结束所有Autojx进程 engines.stopAll(); exit(); } } if (!Observer()) { work_thread.interrupt(); work_thread = threads.start(function () { toast("Main线程在5秒后重启!"); console.show(); console.clear(); console.warn("Main线程在5秒后重启!"); running=false; sleep(5000); console.hide(); if(currentPackage() == packageName)closeApp(AppName); sleep(5000); Main(); }); } }, 3000);//这个时间是线程休息时间 });