|
|
ÈÕÖ¾·Ö¼¶ÂäÅÌÅäÖó־û¯ÈÎÎñµ÷¶È
- // =====================================================================
- // Àý×Ó5£ºÈÕÖ¾·Ö¼¶ÂäÅÌ + ÅäÖó־û¯ + ÈÎÎñµ÷¶È£¨Õæ»ú¿ÉÖ±½ÓÔËÐУ©
- // ×÷Ó㺰ѽű¾´Ó"ÄÜÅÜ"Éý¼¶µ½"Äܳ¤ÆÚÅÜ¡¢³öÎÊÌâÄܲé"¡ª¡ª
- // ¡¤ ÈÕÖ¾·Ö¼¶ + ×Ô¶¯·Ö¾í£¬ÅÜÒ»ÍíÉÏÒ²²»»á°ÑÎļþ³Å±¬
- // ¡¤ ÅäÖÃдÎļþ£¬É±µô½Å±¾ÖØ¿ª»¹ÄܽÓ×ÅÉϴεIJÎÊýÅÜ
- // ¡¤ ¶¨Ê±Æô¶¯¡¢ÏÞʱ½áÊø¡¢ÂÖ´ÎÐÝÏ¢¡¢ÓÅÑÅÍ£Ö¹£¨ËæÊ±É²³µ²»¶ªÊý¾Ý£©
- // ¡¤ ͳ¼ÆÉϱ¨£º³É¹¦/ʧ°Ü¼ÆÊý + ¶ÏÍø»º´æ²¹±¨
- // ÒýÇæ£ºES5 / Rhino
- // =====================================================================
- // ---------------- Ò»¡¢Â·¾¶ÓëÅäÖà ----------------
- var BASE = "/sdcard/AIWROK/¼¼ÇÉ5_ÈÎÎñµ÷¶È";
- var LOG_DIR = BASE + "/ÈÕÖ¾";
- var CONF_FILE = BASE + "/ÅäÖÃ.ini";
- var QUEUE_FILE = BASE + "/´ýÉϱ¨¶ÓÁÐ.txt";
- var STAT_FILE = BASE + "/ͳ¼Æ.txt";
- var STOP_FILE = "/sdcard/AIWROK/STOP_ALL"; // ½¨Õâ¸öÎļþ = ÓÅÑÅÍ£Ö¹
- var PAUSE_FILE = BASE + "/PAUSE"; // ½¨Õâ¸öÎļþ = ÔÝÍ£
- var CFG = {
- // ¶¨Ê±ÈÎÎñ£ºµ½µã²Å¿ª¹¤£¨24Ð¡Ê±ÖÆ£¬Èç "09:30"£©£»Áô¿Õ = Á¢¼´¿ªÊ¼
- startTime: "",
- // ÏÞʱ£º×î¶àÅܶàÉÙ·ÖÖÓ£¬µ½µã×Ô¶¯ÊÕ¹¤£¨·ÀÅÜÒ»Ò¹£©
- maxMinutes: 2,
- // ÂִΣº×ܹ²Åܼ¸ÂÖ£¬Ã¿ÂÖÖ®¼äÐÝÏ¢¶àÉÙÃë
- rounds: 5,
- restMinSec: 5,
- restMaxSec: 12,
- // ÈÕÖ¾·Ö¾í£ºµ¥¸öÈÕÖ¾Îļþ³¬¹ý¶àÉÙÐоÍÇÐÐÂÎļþ
- logMaxLines: 200,
- // Éϱ¨µØÖ·£¨Ã»ÓзþÎñÆ÷¾ÍÁô¿Õ£¬½Å±¾»á×Ô¶¯Ìø¹ýÉϱ¨£©
- reportUrl: "",
- deviceTag: "",
- // Ä¿±êAPP£º¿ìÊÖ£¨Ë¢ÊÓÆµ£©
- targetPkg: "com.smile.gifmaker",
- // ¶ÌÊÓÆµ·Ò³²ÎÊý£º±ØÐëÒ»´ÎÍêÕû¿ìËÙ³¤»¬£¬·Ö¶ÎÇúÏßÖ»»áµ¼ÖÂ»Ãæ¶¶¶¯²»·Ò³
- videoSwipeMinMs: 220,
- videoSwipeMaxMs: 380,
- stayMinMs: 2000, // ÿÂÖ¿´ÍêÊÓÆµÍ£Áô
- stayMaxMs: 5000,
- verifySwipe: true, // ·Ò³ºó½ØÍ¼±È¶Ô£¬È·ÈÏÕæµÄ»»ÁËÊÓÆµ
- finishGoHome: false // ÅÜÍêÍ£ÔÚ¿ìÊÖ£¬²»»Ø×ÀÃæ
- };
- function rand(a, b) { return Math.floor(a + Math.random() * (b - a + 1)); }
- function rSleep(a, b) { sleep.millisecond(rand(a, b)); }
- function dirOf(p) { var i = p.lastIndexOf("/"); return i > 0 ? p.substring(0, i) : p; }
- // ·µ»Ø¼ü¶àͨµÀ£ºÊµ²â²¿·ÖÉ豸 auto ¶ÔÏóûÓÐ pressBack
- function pressBackSafe() {
- try { if (auto.back) { auto.back(); return true; } } catch (e) {}
- try { if (device.pressBack) { device.pressBack(); return true; } } catch (e) {}
- try { if (gesture.back) { gesture.back(); return true; } } catch (e) {}
- try { if (auto.pressBack) { auto.pressBack(); return true; } } catch (e) {}
- return false;
- }
- function ts() {
- try { return time.now(); } catch (e) {
- var d = new Date();
- return d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
- }
- }
- // ---------------- ¶þ¡¢ÈÕ־ϵͳ ----------------
- var LOG_BUF = [];
- var LOG_LINES = 0;
- var LOG_NOW = "";
- function ensureDirs() {
- try { file.createFloder(BASE); } catch (e) {}
- try { file.createFloder(LOG_DIR); } catch (e) {}
- }
- function flushLog(force) {
- if (LOG_BUF.length === 0) return;
- if (!force && LOG_BUF.length < 5) return; // Ôܹ»ÔÙд£¬¼õÉÙ IO
- try {
- if (!LOG_NOW) LOG_NOW = LOG_DIR + "/run_" + new Date().getTime() + ".log";
- txt.writeTxt(LOG_NOW, LOG_BUF.join("\n") + "\n", true);
- LOG_BUF = [];
- } catch (e) {}
- }
- // ·Ö¼¶ÈÕÖ¾£ºD µ÷ÊÔ / I ÐÅÏ¢ / W ¾¯¸æ / E ´íÎó
- function logD(s) { writeLog("D", s); }
- function logI(s) { writeLog("I", s); }
- function logW(s) { writeLog("W", s); }
- function logE(s) { writeLog("E", s); }
- function writeLog(level, s) {
- var line = ts() + " [" + level + "] " + s;
- try { printl(line); } catch (e) {}
- LOG_BUF.push(line);
- LOG_LINES++;
- // ·Ö¾í£º³¬¹ýÉÏÏ޾ͻ»ÐÂÎļþ£¨³¤ÆÚÅܵıر¸£©
- if (LOG_LINES >= CFG.logMaxLines) {
- flushLog(true);
- LOG_LINES = 0;
- LOG_NOW = LOG_DIR + "/run_" + new Date().getTime() + ".log";
- logI("ÈÕÖ¾·Ö¾í£¬ÐÂÎļþ: " + LOG_NOW);
- } else {
- flushLog(false);
- }
- }
- // ---------------- Èý¡¢ÅäÖó־û¯ ----------------
- // ¼¼ÇÉ£ºconfig ¶Áд»á×Ô¶¯½¨Îļþ£»¶ÁµÄʱºòÒ»¶¨¸øÄ¬ÈÏÖµ£¬·ÀÖ¹Ê×´ÎÔËÐÐÈ¡µ½¿Õ
- function saveConfig() {
- try {
- config.setConfig(CONF_FILE, "rounds", "" + CFG.rounds);
- config.setConfig(CONF_FILE, "maxMinutes", "" + CFG.maxMinutes);
- config.setConfig(CONF_FILE, "startTime", CFG.startTime);
- // ×¢Ò⣺targetPkg ²»Ð´ÈëÅäÖã¡·ñÔòÉÏ´ÎÅܵÄÉèÖÃÒ³»á±»¼Çס£¬
- // Ï´ΰѴúÂë¸Ä³É¿ìÊÖÒ²»á±»¾ÉÅäÖø²¸Ç»ØÈ¥£¨ÒÑʵ²â²È¿Ó£©
- config.setConfig(CONF_FILE, "lastRun", ts());
- config.setConfig(CONF_FILE, "runTimes", "" + (parseInt(getConf("runTimes", "0"), 10) + 1));
- logI("ÅäÖÃÒѱ£´æ: " + CONF_FILE);
- } catch (e) { logW("ÅäÖñ£´æÊ§°Ü: " + (e.message || e)); }
- }
- function getConf(key, defVal) {
- try {
- var v = config.getConfig(CONF_FILE, key, defVal);
- if (v === null || v === undefined || v === "") return defVal;
- return v;
- } catch (e) { return defVal; }
- }
- function loadConfig() {
- try {
- CFG.rounds = parseInt(getConf("rounds", "" + CFG.rounds), 10);
- CFG.maxMinutes = parseInt(getConf("maxMinutes", "" + CFG.maxMinutes), 10);
- CFG.startTime = getConf("startTime", CFG.startTime);
- // targetPkg Ò»ÂÉÒÔ´úÂëÀïµÄΪ׼£¬¾ø²»±»¾ÉÅäÖø²¸Ç
- // £¨ÀúÊ·ÅäÖÃÀï´æ¹ý com.android.settings£¬µ¼Ö¸ijɿìÊÖºóÈÔ´ò¿ªÉèÖÃÒ³£©
- logI("ÅäÖÃÒѼÓÔØ£¬ÀúÊ·ÔËÐдÎÊý=" + getConf("runTimes", "0"));
- } catch (e) {}
- }
- function resetConfig() {
- try { file.delete(CONF_FILE); logI("ÅäÖÃÒÑÖØÖÃ"); } catch (e) {}
- }
- // ---------------- ËÄ¡¢ÓÅÑÅÍ£Ö¹ / ÔÝÍ£ ----------------
- function shouldStop() { try { return file.isExists(STOP_FILE); } catch (e) { return false; } }
- function shouldPause() { try { return file.isExists(PAUSE_FILE); } catch (e) { return false; } }
- // ÔÝͣʱԵشòת£¬É¾µô PAUSE Îļþ¾Í¼ÌÐø£¨µ÷ÊԽű¾ÉñÆ÷£©
- function waitIfPaused() {
- var guard = 0;
- while (shouldPause() && !shouldStop() && guard < 600) {
- if (guard === 0) logW("ÒÑÔÝÍ££¨É¾³ý " + PAUSE_FILE + " ¼ÌÐø£©");
- sleep.millisecond(1000);
- guard++;
- }
- if (guard > 0) logI("»Ö¸´ÔËÐÐ");
- }
- // ---------------- Îå¡¢¶¨Ê±ÈÎÎñ ----------------
- // µÈµ½ startTime ²Å¿ª¹¤£»·µ»Ø false ±íʾ±»Í£Ö¹
- function waitForStartTime() {
- // ÅäÖÃÎļþ¿ÉÄܶÁ»Ø¿Õ°××Ö·û£¬Í³Ò»ÇåÏ´ºóÔÙÅжϣ¬±ÜÃâ¿ÕÖµÎó´¥·¢¶¨Ê±µÈ´ý
- try { CFG.startTime = String(CFG.startTime || "").replace(/\s/g, ""); } catch (e) { CFG.startTime = ""; }
- if (!CFG.startTime) return true;
- logI("¶¨Ê±Ä£Ê½£¬µÈ´ýµ½ " + CFG.startTime + " ¿ª¹¤");
- var guard = 0;
- while (guard < 3600 * 12) { // ×î¶àµÈ 12 Сʱ
- if (shouldStop()) return false;
- var now = "";
- try { now = time.now(); } catch (e) { now = ""; }
- // time.now() Ò»°ãÐÎÈç 2026-09-09 09:30:12£¬È¡Öмä hh:mm
- var hm = now.substring(11, 16);
- if (now.indexOf(CFG.startTime) >= 0 || hm === CFG.startTime) {
- logI("µ½µã¿ª¹¤");
- return true;
- }
- if (guard % 300 === 0) logD("µÈ´ýÖУ¬µ±Ç° " + now);
- sleep.millisecond(1000);
- guard++;
- }
- return true;
- }
- // ---------------- Áù¡¢Í³¼ÆÓëÉϱ¨ ----------------
- var STAT = { ok: 0, fail: 0, skip: 0, startMs: 0 };
- function statAdd(key) {
- if (key === "ok") STAT.ok++;
- else if (key === "fail") STAT.fail++;
- else STAT.skip++;
- }
- // Éϱ¨£ºÓÐÍøÖ±½Ó·¢£¬Ã»ÍøÐ´¶ÓÁУ¬µÈÓÐÍøÔÙ²¹±¨£¨·ÀÖ¹Êý¾Ý¶ª£©
- function reportLine(obj) {
- if (!CFG.reportUrl) return; // ûÅ䵨ַ¾ÍÖ±½ÓÌø¹ý
- var body = "";
- try { body = JSON.stringify(obj); } catch (e) { body = "" + obj; }
- try {
- var r = http.json(CFG.reportUrl, body);
- if (r) { logD("Éϱ¨³É¹¦"); return; }
- throw new Error("¿ÕÏìÓ¦");
- } catch (e) {
- logW("Éϱ¨Ê§°Ü£¬Èë¶Ó»º´æ: " + (e.message || e));
- try { txt.writeTxt(QUEUE_FILE, body + "\n", true); } catch (e2) {}
- }
- }
- // ²¹±¨¶ÓÁУ¨ÁªÍøºóµ÷ÓÃÒ»´Î¼´¿É£©
- function flushQueue() {
- if (!CFG.reportUrl) return;
- var content = "";
- try { content = txt.readFileSdcard(QUEUE_FILE); } catch (e) { return; }
- if (!content) return;
- var lines = content.split("\n");
- var left = [];
- for (var i = 0; i < lines.length; i++) {
- var ln = lines[i];
- if (!ln) continue;
- try {
- http.json(CFG.reportUrl, ln);
- logI("²¹±¨³É¹¦Ò»Ìõ");
- } catch (e) {
- left.push(ln);
- }
- }
- try {
- file.delete(QUEUE_FILE);
- if (left.length > 0) txt.writeTxt(QUEUE_FILE, left.join("\n") + "\n", true);
- logI("²¹±¨Íê³É£¬Ê£Óà " + left.length + " Ìõ");
- } catch (e) {}
- }
- function saveStat() {
- var s = "¿ªÊ¼:" + ts() + " ³É¹¦:" + STAT.ok + " ʧ°Ü:" + STAT.fail +
- " Ìø¹ý:" + STAT.skip + " ºÄʱ(·Ö):" +
- Math.round((new Date().getTime() - STAT.startMs) / 60000);
- try { txt.writeTxt(STAT_FILE, s + "\n", true); } catch (e) {}
- logI("ͳ¼Æ: " + s);
- }
- // ---------------- ÁùµãÎå¡¢¿ìÊÖË¢ÊÓÆµÏà¹Ø¹¤¾ß ----------------
- function sw() { try { return screen.getScreenWidth(); } catch (e) { return 1080; } }
- function sh() { try { return screen.getScreenHeight(); } catch (e) { return 1920; } }
- // ǰ̨°üÃû¶àͨµÀ£¨¸ÃÉ豸 getTopPackName »á·µ»Ø¿Õ£©
- function topPkg() {
- try { var t1 = app.getTopPackName(); if (t1) return t1; } catch (e) {}
- try { var t2 = app.getTopPackNameV2(); if (t2) return t2; } catch (e) {}
- try { var t3 = auto.getTopPackName(); if (t3) return t3; } catch (e) {}
- var act = "";
- try { act = "" + app.getCurrentActivity(); } catch (e) {
- try { act = "" + app.getAgentCurrenAcitvity(); } catch (e2) { act = ""; }
- }
- if (act && act.indexOf("/") > 0) return act.substring(0, act.indexOf("/"));
- return act || "";
- }
- function isInstalled(pkg) {
- try { var v = app.getVerName(pkg); if (v) return true; } catch (e) {}
- try { var n = app.getAppName(pkg); if (n) return true; } catch (e) {}
- return false;
- }
- // È·±£¿ìÊÖÔÚǰ̨£¬²»ÔÚ¾ÍÀÆðÀ´
- var _launched = false;
- function ensureForeground() {
- var top = topPkg();
- if (top === CFG.targetPkg) { _launched = true; return true; }
- // ¸ÃÉ豸ǰ̨APIÈ¡²»µ½°üÃûʱ²»ÒªÃ¿ÂÖÖØÆôAPP£ºÖ»±£Ö¤Ê×ÂÖÀÆð¹ý¼´¿É
- if (!top && _launched) return true;
- logI("ÀÆð¿ìÊÖ£¨µ±Ç°Ç°Ì¨=" + (top || "¿Õ") + "£©");
- try { app.openApp(CFG.targetPkg); } catch (e) {
- try { app.startApp(CFG.targetPkg); } catch (e2) {}
- }
- sleep.millisecond(4000);
- _launched = true;
- return true;
- }
- // ¶ÌÊÓÆµ·Ò³£ºÒ»´ÎÍêÕû¿ìËÙ³¤»¬£¨²»ÄֶܷΣ¬·ñÔòÖ»¶¶²»·£©
- function onceSwipe(x1, y1, x2, y2, durMs) {
- try { auto.swip(x1, y1, x2, y2, durMs, 0); }
- catch (e) { try { auto.swipe(x1, y1, x2, y2, durMs); } catch (e2) {} }
- }
- function shotFingerprint() {
- try {
- var b = screen.screenShotFull().toBase64();
- if (!b) return "";
- return b.substring(0, 200) + "|" + b.substring(b.length - 200) + "|" + b.length;
- } catch (e) { return ""; }
- }
- // ·µ»Ø true = È·ÈÏ·µ½ÐÂÊÓÆµ
- function swipeUpWithVerify() {
- var before = shotFingerprint();
- var w = sw(), h = sh();
- var x = rand(Math.round(w * 0.35), Math.round(w * 0.65));
- var y1 = Math.round(h * (0.78 + Math.random() * 0.07));
- var y2 = Math.round(h * (0.12 + Math.random() * 0.08));
- var dur = rand(CFG.videoSwipeMinMs, CFG.videoSwipeMaxMs);
- onceSwipe(x, y1, x + rand(-12, 12), y2, dur);
- logI("·Ò³ÉÏ»¬ Æðµãy=" + y1 + " ÖÕµãy=" + y2 + " ¾àÀë" + (y1 - y2) + "px ºÄʱ" + dur + "ms");
- sleep.millisecond(700);
- var after = shotFingerprint();
- if (before && after && before === after) {
- logW("»ÃæÎޱ仯£¬²¹Ò»´ÎÇ¿»¬");
- onceSwipe(Math.round(w / 2), Math.round(h * 0.88), Math.round(w / 2), Math.round(h * 0.08), 250);
- sleep.millisecond(900);
- var after2 = shotFingerprint();
- return after2 && after2 !== before;
- }
- return true;
- }
- // ---------------- Æß¡¢ÒµÎñÈÎÎñ£º¿ìÊÖË¢ÊÓÆµÒ»ÂÖ ----------------
- function doOneRound(idx) {
- logI("---- µÚ " + idx + " ÂÖ¿ªÊ¼ ----");
- ensureForeground();
- // ·Ò³£¨´øÐ£Ñ飩
- var ok;
- if (CFG.verifySwipe) ok = swipeUpWithVerify();
- else { swipeUpWithVerify(); ok = true; }
- if (ok) { statAdd("ok"); logI("±¾ÂÖ½á¹û: ·Ò³³É¹¦"); }
- else { statAdd("fail"); logW("±¾ÂÖ½á¹û: ·Ò³Ê§°Ü"); }
- // Í£Áô¹Û¿´£¨·Ö¶Î sleep£¬ËæÊ±ÄÜÏìӦֹͣÐźţ©
- var stay = rand(CFG.stayMinMs, CFG.stayMaxMs);
- logI("Í£Áô¹Û¿´ " + stay + "ms");
- var secs = Math.round(stay / 1000);
- for (var s = 0; s < secs; s++) {
- if (shouldStop()) break;
- sleep.millisecond(1000);
- }
- logI("---- µÚ " + idx + " ÂÖ½áÊø ----");
- }
- // ---------------- °Ë¡¢µ÷¶ÈÖ÷Ñ»· ----------------
- function main() {
- ensureDirs();
- logI("===== Àý×Ó5 ÈÕÖ¾ÅäÖÃÓëÈÎÎñµ÷¶È ¿ªÊ¼ =====");
- // 1) ¶ÁÅäÖ㨵ڶþ´ÎÔËÐлáÑØÓÃÉϴεIJÎÊý£©
- loadConfig();
- // 2) É豸±êʶ
- try { CFG.deviceTag = "" + device.getModel(); } catch (e) { CFG.deviceTag = "δ֪É豸"; }
- logI("É豸: " + CFG.deviceTag);
- // 3) Ä¿±êAPP¼ì²é + Æô¶¯
- var vName = "", aName = "";
- try { vName = app.getVerName(CFG.targetPkg); } catch (e) {}
- try { aName = app.getAppName(CFG.targetPkg); } catch (e) {}
- logI("Ä¿±êAPP: " + CFG.targetPkg + " Ó¦ÓÃÃû=" + (aName || "È¡²»µ½") + " °æ±¾=" + (vName || "È¡²»µ½"));
- if (!isInstalled(CFG.targetPkg)) logW("°²×°¼ì²âδȷÈÏ£¨¿ÉÄÜÎ󱨣©£¬ÈÔ³¢ÊÔÆô¶¯");
- ensureForeground();
- // 4) ¶¨Ê±µÈ´ý
- if (!waitForStartTime()) { logW("µÈ´ýÆÚ¼ä±»Í£Ö¹"); return; }
- STAT.startMs = new Date().getTime();
- var deadline = STAT.startMs + CFG.maxMinutes * 60 * 1000;
- // 4) Ö÷Ñ»·£ºÂÖ´Î + ÏÞʱ + Í£Ö¹/ÔÝÍ£
- for (var i = 1; i <= CFG.rounds; i++) {
- if (shouldStop()) { logW("¼ì²âµ½Í£Ö¹Îļþ£¬ÌáǰÊÕ¹¤"); break; }
- if (new Date().getTime() > deadline) { logW("µ½´ïÏÞʱ£¬×Ô¶¯ÊÕ¹¤"); break; }
- waitIfPaused();
- if (shouldStop()) break;
- doOneRound(i);
- // ÿÂÖÉϱ¨Ò»´Î
- reportLine({ device: CFG.deviceTag, round: i, ok: STAT.ok, fail: STAT.fail, time: ts() });
- saveConfig();
- // ÂִμäÐÝÏ¢£¨×îºóÒ»ÂÖ²»ÓÃÐÝ£©
- if (i < CFG.rounds) {
- var rest = rand(CFG.restMinSec, CFG.restMaxSec);
- logI("ÐÝÏ¢ " + rest + " Ãë");
- for (var s = 0; s < rest; s++) {
- if (shouldStop()) break;
- sleep.millisecond(1000);
- }
- }
- }
- // 5) ÊÕβ£ºÄ¬ÈÏÍ£ÔÚ¿ìÊÖ£¨Ë¢ÊÓÆµ²»Òª»Ø×ÀÃæ£©
- if (CFG.finishGoHome) {
- try { auto.home(); } catch (e) {}
- logI("ÒÑ»Ø×ÀÃæ");
- } else {
- logI("ÊÕβ£ºÍ£ÔÚ " + CFG.targetPkg + " ²»Í˳ö");
- }
- // 6) ²¹±¨ + ͳ¼ÆÂäÅÌ
- flushQueue();
- saveStat();
- flushLog(true);
- var msg = "µ÷¶È½áÊø ³É¹¦" + STAT.ok + " ʧ°Ü" + STAT.fail;
- logI("===== " + msg + " =====");
- try { toast.show(msg); } catch (e) {}
- }
- main();
¸´ÖÆ´úÂë
|
|