自动上滑脚本

自用库

目前为 2025-01-18 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/521999/1522497/%E8%87%AA%E5%8A%A8%E4%B8%8A%E6%BB%91%E8%84%9A%E6%9C%AC.js

  1. importClass(android.content.Context);
  2. importClass(android.provider.Settings);
  3. importClass(android.app.KeyguardManager);
  4. try {
  5. var km = context.getSystemService(Context.KEYGUARD_SERVICE);//km.isKeyguardLocked(),km.isKeyguardSecure()
  6. let enabledServices = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
  7. //log('当前已启用的辅助服务\n', enabledServices);
  8. if (!enabledServices.match(/.*org\.autojs\.autoxjs\.v6\/com\.stardust\.autojs\.core\.accessibility\.AccessibilityService.*/g)) {
  9. let Services = (enabledServices ? enabledServices + ":" : "") + "org.autojs.autoxjs.v6/com.stardust.autojs.core.accessibility.AccessibilityService";
  10. Settings.Secure.putString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, Services);
  11. Settings.Secure.putString(context.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, '1');
  12. sleep(3000);
  13. }
  14. toastLog("成功开启AutoJS的辅助服务");
  15. } catch (error) {
  16. //受权方法:开启usb调试并使用adb工具链接手机,执行 adb shell pm grant org.autojs.autoxjs.v6 android.permission.WRITE_SECURE_SETTING
  17. toastLog("请受权AutoJS启用辅助服务");
  18. }
  19. auto.waitFor();
  20. //停止其它脚本
  21. engines.all().map((ScriptEngine) => {
  22. if (engines.myEngine().toString() !== ScriptEngine.toString()) {
  23. ScriptEngine.forceStop();
  24. }
  25. });
  26. //============================================================
  27. var AppName = ["抖音极速版","快手极速版","百度极速版"];
  28. var runAppName = AppName[0], times = 100; //滑动次数
  29. toastLog('当前分辨率:'+device.width+'X'+device.height);
  30. //toastLog('唯一标识码:'+device.fingerprint);
  31. const img_block = 'data:image/png;base64,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';
  32.  
  33. //息屏状态将屏幕唤醒
  34. global.opentimes=0;
  35. while (!device.isScreenOn() || km.isKeyguardLocked()) {
  36. opentimes++;
  37. device.wakeUp();//唤醒设备
  38. toastLog('屏幕唤醒');
  39. sleep(1500); //等待屏幕亮起
  40. back();//如果锁屏后收到新消息,上滑不能解锁屏幕,需要返回一次后上滑
  41. device.keepScreenOn();//一直保持屏幕常亮
  42. sleep(1500);
  43. if (km.isKeyguardSecure()) {
  44. toastLog('密码解锁');
  45. //待开发
  46. break;
  47. } else {
  48. toastLog('上滑解锁');
  49. swipe(device.width / 2, device.height * 0.8, device.width / 2, device.height * 0.3, 400);
  50. }
  51. sleep(1500);
  52. if(opentimes>3){
  53. toastLog('解锁失败,请尝试重启本软件并开启无障碍服务');
  54. break;
  55. }
  56. }
  57. global.oledwin=null;
  58. global.looptimes=times;
  59. global.pause = false; //是否暂停
  60. global.ver = 'v2.3';//版本号
  61. global.theapp=getAppName(currentPackage());
  62. function Main() {
  63. toastLog('进入主程序:'+theapp);
  64. var index=AppName.indexOf(theapp);
  65. if (index > 0) {
  66. AppName.splice(index);
  67. AppName.unshift(theapp);
  68. }
  69. //log(AppName);
  70. for (i = 0; i < AppName.length; i++) {
  71. looptimes=times;
  72. var packageName = getPackageName(AppName[i]);
  73. if (packageName) {
  74. toastLog('启动应用:' + AppName[i]);
  75. var appstate = launchApp(AppName[i]);
  76. sleep(5000);
  77. if (appstate) {
  78. toastLog("应用正在运行");
  79. } else {
  80. toastLog("无法自启动,需模拟点击");
  81. home();
  82. sleep(3000);
  83. var app = id("item_title").text(AppName[i]).visibleToUser(true).findOne(2000);
  84. if (app) {
  85. click(app.bounds().centerX(), app.bounds().top - 50);
  86. sleep(10000);
  87. }
  88. }
  89. runAppName=AppName[i];//安全线程中使用
  90. while (looptimes > 0) {
  91. if(pause){sleep(3000);continue;}
  92. var tiktokhomepage = className("Button").descStartsWith("侧边栏").clickable(true).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000);
  93. var giftshowhomepg = idMatches(/.*\/left_btn|.*\/thanos_home_top_search/).boundsInside(0, 0, 500, 500).visibleToUser(true).findOne(1000);
  94. var baiduhomepage = idMatches(/.*\/obfuscated/).text('视频').boundsInside(0, device.height-500, 500, device.height).visibleToUser(true).findOne(1000);
  95. if (tiktokhomepage||giftshowhomepg||baiduhomepage) {
  96. looptimes--;
  97. var videoDuration = 0;
  98. if(tiktokhomepage){
  99. var seekBar=className('android.widget.SeekBar').desc('进度条').findOne(1000);
  100. var y1 = seekBar?seekBar.bounds().centerY()-5:0;
  101. }else if(giftshowhomepg){
  102. var seekBar=className('android.widget.HorizontalScrollView').idMatches(/.*\/tab_layout/).findOne(1000);
  103. var y1 = seekBar?seekBar.bounds().top-5:0;
  104. }else{
  105. click(baiduhomepage.parent().bounds());sleep(2000);
  106. var seekBar=textMatches(/全屏观看/).findOne(1000);
  107. var y1 = seekBar?baiduhomepage.parent().bounds().top-5:0;
  108. }
  109. if (seekBar) {
  110. isvideo = true;
  111. let x1 = random(300, 400);
  112. let x2 = random(600, 700);
  113. let duration_thread = threads.start(function () {
  114. var durationText = className('TextView').textMatches(/[0-9]+:[0-9]+/).boundsInside(device.width/2, 2 * device.height / 3, device.width, device.height).findOne(2000);
  115. if(durationText){
  116. videoDuration = getDouyinVideoDuration(durationText.text());
  117. }
  118. duration_thread.interrupt();
  119. });
  120. gesture(random(800, 1200), [ [x1, y1],[x2, y1],[x1, y1] ]);
  121. console.log("视频时长:",videoDuration+'s');
  122. }
  123. var sleepTime=(videoDuration>0&&videoDuration<90)?videoDuration:random(6, 30);//每个视频随机时间 6-30秒
  124. console.verbose("浏览:" + (times-looptimes), "停留:" + sleepTime + "s");
  125. cutDownBySleep(sleepTime,'观看视频');
  126. randomHeart();//拟人化
  127. } else {
  128. var living = idMatches(/.*\/root|.*\/liveshow_cmp_close/).clickable(true).boundsInside(device.width-300, 0, device.width, 300).visibleToUser(true).findOne(1000);//直播间
  129. if (living) {
  130. isvideo = true;
  131. toastLog("1.退出直播间");
  132. click(living.bounds());
  133. sleep(1000);slidingByCurve();sleep(1000);
  134. }
  135. if (currentActivity() == 'com.ss.android.ugc.aweme.live.LivePlayActivity') {
  136. isvideo = true;
  137. toastLog("2.退出直播间");
  138. back();
  139. sleep(1000);slidingByCurve();sleep(1000);
  140. }
  141. var btn = textMatches(/退出直播.*/).visibleToUser(true).findOne(1000)
  142. if(btn){
  143. isvideo = true;
  144. click(btn.bounds());
  145. sleep(1000);slidingByCurve();sleep(1000);
  146. }
  147. toast('不在抖音或快手页面');
  148. oledwin=null;
  149. sleep(3000);
  150. }
  151. }
  152. closeApp(runAppName);
  153. } else {
  154. toastLog("未安装:" + AppName[i]);
  155. }
  156. }
  157. toastLog("自动刷屏完成");
  158. try {
  159. device.cancelKeepingAwake();
  160. //熄屏
  161. runtime.accessibilityBridge.getService().performGlobalAction(android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN);
  162. } catch (e) {
  163.  
  164. }
  165. //停止本脚本
  166. engines.myEngine().forceStop();
  167. }
  168.  
  169. function cutDownBySleep(lasterSecend, message) {
  170. message = message || "";
  171. floaty.closeAll();
  172. var fwin = floaty.rawWindow(
  173. `<vertical id="frame" alpha="0" w="{{device.width-500}}px" h="150px">
  174. <card id="card" w="auto" h="auto" layout_gravity="center" cardCornerRadius="5dp" cardBackgroundColor="#eeeeee" >
  175. <text id="title" text="" w="auto" textColor="#333333" textSize="13sp" padding="12 8" />
  176. </card>
  177. </vertical>`
  178. );
  179. fwin.setTouchable(true);
  180. fwin.frame.on("click",()=>{
  181. pause=!pause;
  182. console.log(pause?'脚本暂停:'+message:'脚本继续:'+message);
  183. fwin.card.attr("cardBackgroundColor",pause?"#ff0000":"#eeeeee");
  184. });
  185. sleep(500);
  186. for (let i = lasterSecend; i > 0; i--) {
  187. if (oledwin) { break; }
  188. if (!fwin || !fwin.title) { break; }
  189. if (pause) {i++;}
  190. ui.run(() => {
  191. fwin.title.setText(pause?'脚本已暂停,点击继续':message + "剩余" + i + "秒");
  192. fwin.frame.attr("alpha", 0.8);
  193. let x = parseInt((device.width - fwin.width) / 2);
  194. let y = device.height-550;
  195. fwin.setPosition(x, y);
  196. });
  197. sleep(1000);
  198. }
  199. fwin=null;
  200. floaty.closeAll();
  201. sleep(500);
  202. }
  203. function getDouyinVideoDuration(durationStr) {
  204. if (durationStr) {
  205. //log('1',durationStr);
  206. var durationMatch = durationStr.match(/[0-9]+:[0-9]+/);
  207. if (durationMatch) {
  208. //log('2',durationMatch);
  209. var minutes = 0,seconds = 0;
  210. var parts = durationMatch[0].split(":");
  211. if (parts.length === 2) {
  212. //log('3',parts);
  213. minutes = parseInt(parts[0], 10);
  214. seconds = parseInt(parts[1], 10);
  215. return minutes * 60 + seconds + 3;
  216. }
  217. }
  218. }
  219. return 0;
  220. }
  221. function weightedRandom(weights) {
  222. let sum = 0;
  223. for (let key in weights) {
  224. sum += weights[key];
  225. }
  226. let randomNumber = Math.random() * sum;
  227. for (let key in weights) {
  228. randomNumber -= weights[key];
  229. if (randomNumber <= 0) {
  230. return key;
  231. }
  232. }
  233. }
  234. function randomHeart(num) {
  235. if (6!=num&&text('当前无新视频').visibleToUser(true).findOne(1000)) {
  236. console.log("当前无新视频");
  237. click(device.right - 100, device.top - 100);
  238. randomHeart(6);//切换频道
  239. sleep(1000);
  240. return;
  241. }
  242. if(idMatches(/.*center/).text('请完成安全验证').visibleToUser(true).findOne(1000)){return;}
  243. const weights = {
  244. 1: 0.01, 2: 0.02, 3: 0.03, 4: 0.04, 5: 0.05,
  245. 6: 0.06, 7: 0.07, 8: 0.08, 9: 0.09, 0: 0.55
  246. };
  247. let randomIndex = num ? num : weightedRandom(weights);
  248. //随机下滑
  249. if (randomIndex == 1) {
  250. console.log('拟人:随机下滑');
  251. swipe(device.width / 2, device.height * 0.1 + randomIndex, device.width / 2, device.height * 0.9 - randomIndex, random(500, 1500));
  252. return;
  253. }
  254. //随机恢复到首页
  255. if(randomIndex == 4){
  256. console.log('拟人:随机回首页');
  257. sleep(3000);back();sleep(3000);back();sleep(3000);
  258. return;
  259. }
  260. //加速播放
  261. if(randomIndex == 5){
  262. var seekBar1=className('android.widget.SeekBar').descMatches(/.*进度条.*/).findOne(1000);
  263. var seekBar2=className('android.widget.HorizontalScrollView').idMatches(/.*\/tab_layout/).findOne(1000);
  264. if(seekBar1||seekBar2){
  265. let x1=random(90, 120);
  266. let y1=device.height/3;
  267. gestures([0, 1500, [x1,y1], [x1,y1]],[1400, 1500, [x1,y1], [1.1*x1, 2*y1]]);
  268. return;
  269. }
  270. }
  271. //连续上滑
  272. if (randomIndex == 8) {
  273. console.log('拟人:连续上滑');
  274. var k = random(2, 4);
  275. for (var i = 0; i < k; i++) {
  276. var j = random(2, 5);
  277. if (j == 3) {
  278. swipe(device.width / j, device.height * 0.1 + j * k, device.width / j, device.height * 0.9 - j * k, j * 50);
  279. } else {
  280. swipe(device.width / j, device.height * 0.9 - j * k, device.width / j, device.height * 0.1 + j * k, j * 50);
  281. }
  282. sleep(j * 250);
  283. }
  284. return;
  285. }
  286. //向上滑
  287. slidingByCurve();
  288. }
  289. function slidingByLine() {
  290. // top X,Y范围
  291. tx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2));
  292. ty = randomPointLoc(parseInt(device.height / 5), parseInt(device.height / 4));
  293. // bottom X,Y 范围
  294. bx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2));
  295. by = randomPointLoc(parseInt(3 * device.height / 4), parseInt(4 * device.height / 5));
  296.  
  297. slidingTime = randomRangeTime(0.8, 1.3);
  298. log("上滑:随机直线");
  299. //log("X: "+ Math.abs(bx-tx) + " Y: "+ Math.abs(by - ty));
  300. swipe(bx, by, tx, ty, slidingTime);
  301. }
  302. function slidingByCurve() {
  303. if (idMatches(/.*center/).text('请完成安全验证').visibleToUser(true).findOne(1000)) { log('正在完成安全验证'); return; }
  304. // top X,Y范围
  305. tx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2));
  306. ty = randomPointLoc(200, 300);
  307. // bottom X,Y 范围
  308. bx = randomPointLoc(parseInt(device.width / 3), parseInt(device.width / 2));
  309. by = randomPointLoc(device.height-500, device.height-400);
  310.  
  311. slidingTime = randomRangeTime(0.5, 0.9);
  312. log("上滑:仿真曲线");
  313. //log("X: "+ Math.abs(bx-tx) + " Y: "+ Math.abs(by - ty));
  314. sml_move(bx, by, tx, ty, slidingTime);
  315. }
  316. function left2right(direction) {
  317. var intX=parseInt(Math.random()*200+400);
  318. var intY=parseInt(Math.random()*200+200);
  319. var distance=parseInt(Math.random()*100+device.height/4);
  320. switch (direction) {
  321. case 1:
  322. //向上小距离
  323. sml_move(intX, intY + distance, intX, intY, 400);
  324. break;
  325. case 2:
  326. //向下小距离
  327. sml_move(intX, intY, intX, intY + distance, 400);
  328. break;
  329. case 3:
  330. //向左翻屏
  331. sml_move(
  332. device.width / 2 + parseInt(Math.random() * 100) + 300,
  333. device.height / 4 - parseInt(Math.random() * 200) + 100,
  334. 0 + parseInt(Math.random() * 100),
  335. device.height / 5 + parseInt(Math.random() * 100),
  336. 500
  337. );
  338. break;
  339. case 4:
  340. //向右翻屏
  341. sml_move(
  342. device.width / 2 - parseInt(Math.random() * 100) - 300,
  343. device.height / 5 - parseInt(Math.random() * 200) + 100,
  344. device.width - parseInt(Math.random() * 100),
  345. device.height / 4 + parseInt(Math.random() * 100),
  346. 500
  347. );
  348. break;
  349. }
  350. sleep(1000);
  351. }
  352. function randomPointLoc(start,end){
  353. len = Math.abs(end - start);
  354. loc = Math.floor(Math.random() * len) + start;
  355. return loc;
  356. }
  357. function randomRangeTime(start,end){
  358. len = Math.abs(end -start)*1000;
  359. ms = Math.floor(Math.random() * len) + start*1000;
  360. return ms;
  361. }
  362. function radmoRect(rect){
  363. let xy=rect;
  364. if(rect){
  365. xy.left=random(100,rect.width()-100);
  366. xy.top=random(100,rect.height()-100);
  367. xy.bottom=xy.top+120;
  368. xy.right=xy.left+120;
  369. }
  370. return xy;
  371. }
  372. function sml_move(qx, qy, zx, zy, time) {
  373. var xxy = [time];
  374. var point = [];
  375. var dx0 = {"x": qx,"y": qy};
  376. var dx1 = {"x": random(qx - 150, qx + 150),"y": random(qy, qy + 50)};
  377. var dx2 = {"x": random(zx - 150, zx + 150),"y": random(zy, zy + 50)};
  378. var dx3 = {"x": zx,"y": zy};
  379. for (var i = 0; i < 4; i++) {
  380. eval("point.push(dx" + i + ")");
  381. }
  382. // log(point[3].x)
  383. for (let i = 0; i < 1; i += 0.08) {
  384. let newPoint=bezier_curves(point, i);
  385. xxyy = [parseInt(newPoint.x), parseInt(newPoint.y)]
  386. xxy.push(xxyy);
  387. }
  388. try {
  389. gesture.apply(null, xxy);
  390. } catch (e) {
  391. log(xxy);
  392. }
  393. }
  394. function bezier_curves(cp, t) {
  395. cx = 3.0 * (cp[1].x - cp[0].x);
  396. bx = 3.0 * (cp[2].x - cp[1].x) - cx;
  397. ax = cp[3].x - cp[0].x - cx - bx;
  398. cy = 3.0 * (cp[1].y - cp[0].y);
  399. by = 3.0 * (cp[2].y - cp[1].y) - cy;
  400. ay = cp[3].y - cp[0].y - cy - by;
  401. tSquared = t * t;
  402. tCubed = tSquared * t;
  403. result = {
  404. "x": 0,
  405. "y": 0
  406. };
  407. result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
  408. result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
  409. return result;
  410. }
  411. function closeApp(appname) {
  412. let packageName = getPackageName(appname);
  413. // 使用ADB命令强行结束进程
  414. //shell("adb shell am force-stop " + packageName);
  415. console.warn('关闭应用:' + appname);
  416. app.openAppSetting(packageName);
  417. text(app.getAppName(packageName)).waitFor();
  418. let is_sure = textMatches(/.*强行停止.*/).visibleToUser(true).findOne(1000);
  419. if (is_sure&&is_sure.enabled()) {
  420. try {
  421. var btn = className("Button").text('强行停止').visibleToUser(true).findOne(1000);
  422. if (btn) btn.click();
  423. sleep(1000);
  424. btn = className("Button").text('强行停止').visibleToUser(true).findOne(1000);
  425. if (btn) btn.click();
  426. sleep(1000);
  427. btn = className("Button").text('确定').visibleToUser(true).findOne(1000);
  428. if (btn) btn.click();
  429. back(); back(); back();
  430. home();
  431. } catch (e) {
  432. log(app.getAppName(packageName) + "应用已被关闭");
  433. sleep(1000);
  434. back(); back(); back();
  435. home();
  436. }
  437. } else {
  438. log(app.getAppName(packageName) + "应用不能被正常关闭");
  439. back(); back(); back();
  440. home();
  441. }
  442. }
  443.  
  444. importClass(org.opencv.imgproc.Imgproc);
  445. importClass(org.opencv.core.Core);
  446. importClass(org.opencv.core.Rect);
  447. importClass(org.opencv.core.Mat);
  448. importClass(org.opencv.core.Point);
  449. importClass(org.opencv.core.Size);
  450. importClass(org.opencv.core.CvType);
  451. importClass(org.opencv.core.Scalar);
  452. importClass(org.opencv.imgcodecs.Imgcodecs);
  453.  
  454. function buildRegion(region, img) {
  455. if (region == undefined) { region = []; }
  456. let x = region[0] === undefined ? 0 : region[0];
  457. let y = region[1] === undefined ? 0 : region[1];
  458. let width = region[2] === undefined ? img.getWidth() - x : region[2];
  459. let height = region[3] === undefined ? img.getHeight() - y : region[3];
  460. if (x < 0 || y < 0 || x + width > img.width || y + height > img.height) {
  461. throw new Error(
  462. 'out of region: region = [' + [x, y, width, height] + '], image.size = [' + [img.width, img.height] + ']'
  463. );
  464. }
  465. return new Rect(x, y, width, height);
  466. }
  467. function MatchOptions(threshold, region, scaleFactors, max, grayTransform) {
  468. this.threshold = threshold;
  469. this.region = region;
  470. this.scaleFactors = scaleFactors;
  471. this.max = max;
  472. this.grayTransform = grayTransform;
  473. }
  474.  
  475. const defaultMatchOptions = new MatchOptions(0.9, undefined, [[1, 1], [0.9, 0.9], [1.1, 1.1], [0.8, 0.8], [1.2, 1.2]], 5, true);
  476. MatchOptions.check = function (options) {
  477. if (options == undefined) {
  478. return defaultMatchOptions;
  479. }
  480. // deep copy
  481. let newOptions = JSON.parse(JSON.stringify(options));
  482. if (newOptions.threshold == undefined) {
  483. newOptions.threshold = defaultMatchOptions.threshold;
  484. }
  485. if (newOptions.region && !Array.isArray(newOptions.region)) {
  486. throw new TypeError('region type is number[]');
  487. }
  488. if (newOptions.max == undefined) {
  489. newOptions.max = defaultMatchOptions.max;
  490. }
  491. if (newOptions.scaleFactors == undefined) {
  492. newOptions.scaleFactors = defaultMatchOptions.scaleFactors;
  493. } else if (!Array.isArray(newOptions.scaleFactors)) {
  494. throw new TypeError('scaleFactors');
  495. }
  496. for (let index = 0; index < newOptions.scaleFactors.length; index++) {
  497. let factor = newOptions.scaleFactors[index];
  498. if (Array.isArray(factor) && factor[0] > 0 && factor[1] > 0) {
  499. // nothing
  500. } else if (typeof factor === 'number') {
  501. newOptions.scaleFactors[index] = [factor, factor];
  502. } else {
  503. throw new TypeError('scaleFactors');
  504. }
  505. }
  506. if (newOptions.grayTransform === undefined) {
  507. newOptions.grayTransform = defaultMatchOptions.grayTransform;
  508. }
  509.  
  510. return newOptions;
  511. };
  512.  
  513. function Match(point, similarity, scaleX, scaleY) {
  514. this.point = point;
  515. this.similarity = similarity;
  516. this.scaleX = scaleX;
  517. this.scaleY = scaleY;
  518. }
  519.  
  520. function matchTemplate(img, template, options) {
  521. if (img == null || template == null) {
  522. throw new Error('ParamError');
  523. }
  524. options = MatchOptions.check(options);
  525. //console.log('参数:', options);
  526.  
  527. let largeMat = img.mat;
  528. let templateMat = template.mat;
  529. let largeGrayMat;
  530. let templateGrayMat;
  531. if (options.region) {
  532. options.region = buildRegion(options.region, img);
  533. largeMat = new Mat(largeMat, options.region);
  534. }
  535. // 灰度处理
  536. if (options.grayTransform) {
  537. largeGrayMat = new Mat();
  538. Imgproc.cvtColor(largeMat, largeGrayMat, Imgproc.COLOR_BGR2GRAY);
  539. templateGrayMat = new Mat();
  540. Imgproc.cvtColor(templateMat, templateGrayMat, Imgproc.COLOR_BGR2GRAY);
  541. }
  542. // =================================================
  543. let finalMatches = [];
  544. for (let factor of options.scaleFactors) {
  545. let [fx, fy] = factor;
  546. let resizedTemplate = new Mat();
  547. Imgproc.resize(templateGrayMat || templateMat, resizedTemplate, new Size(), fx, fy, Imgproc.INTER_LINEAR);
  548. // 执行模板匹配,标准化相关性系数匹配法
  549. let matchMat = new Mat();
  550. Imgproc.matchTemplate(largeGrayMat || largeMat, resizedTemplate, matchMat, Imgproc.TM_CCOEFF_NORMED);
  551.  
  552. let currentMatches = _getAllMatch(matchMat, resizedTemplate, options.threshold, factor, options.region);
  553. //console.log('缩放比:', factor, '可疑目标数:', currentMatches.length);
  554. for (let match of currentMatches) {
  555. if (finalMatches.length === 0) {
  556. finalMatches = currentMatches.slice(0, options.max);
  557. break;
  558. }
  559. if (!isOverlapping(finalMatches, match)) {
  560. finalMatches.push(match);
  561. }
  562. if (finalMatches.length >= options.max) {
  563. break;
  564. }
  565. }
  566. resizedTemplate.release();
  567. matchMat.release();
  568. if (finalMatches.length >= options.max) {
  569. break;
  570. }
  571. }
  572. largeMat !== img.mat && largeMat.release();
  573. largeGrayMat && largeGrayMat.release();
  574. templateGrayMat && templateGrayMat.release();
  575.  
  576. return finalMatches;
  577. }
  578.  
  579. function _getAllMatch(tmResult, templateMat, threshold, factor, rect) {
  580. let currentMatches = [];
  581. let mmr = Core.minMaxLoc(tmResult);
  582.  
  583. while (mmr.maxVal >= threshold) {
  584. // 每次取匹配结果中的最大值和位置,从而使结果按相似度指标从高到低排序
  585. let pos = mmr.maxLoc; // Point
  586. let value = mmr.maxVal;
  587.  
  588. let start = new Point(Math.max(0, pos.x - templateMat.width() / 2), Math.max(0, pos.y - templateMat.height() / 2));
  589. let end = new Point(
  590. Math.min(tmResult.width() - 1, pos.x + templateMat.width() / 2),
  591. Math.min(tmResult.height() - 1, pos.y + templateMat.height() / 2)
  592. );
  593. // 屏蔽已匹配到的区域
  594. Imgproc.rectangle(tmResult, start, end, new Scalar(0), -1);
  595. mmr = Core.minMaxLoc(tmResult);
  596.  
  597. if (rect) {
  598. pos.x += rect.x;
  599. pos.y += rect.y;
  600. start.x += rect.x;
  601. start.y += rect.y;
  602. end.x += rect.x;
  603. end.y += rect.y;
  604. }
  605. let match = new Match(pos, value, factor[0], factor[1]);
  606. // 保存匹配点的大致范围,用于后续去重。设置enumerable为false相当于声明其为私有属性
  607. Object.defineProperty(match, 'matchAroundRect', { value: new Rect(start, end), writable: true, enumerable: false });
  608. currentMatches.push(match);
  609. }
  610.  
  611. return currentMatches;
  612. }
  613.  
  614. function isOverlapping(matches, newMatch) {
  615. for (let existingMatch of matches) {
  616. // 也可判断两点间的距离,但是平方、开方运算不如比较范围简单高效
  617. if (existingMatch.matchAroundRect.contains(newMatch.point)) {
  618. if (newMatch.similarity > existingMatch.similarity) {
  619. existingMatch.point = newMatch.point;
  620. existingMatch.similarity = newMatch.similarity;
  621. existingMatch.scaleX = newMatch.scaleX;
  622. existingMatch.scaleY = newMatch.scaleY;
  623. existingMatch.matchAroundRect = newMatch.matchAroundRect;
  624. }
  625. return true;
  626. }
  627. }
  628. return false;
  629. }
  630.  
  631. function showMatchRectangle(matches, srcMat, templateMat) {
  632. for (let match of matches) {
  633. let start = match.point;
  634. let end = new Point(
  635. match.point.x + templateMat.width() * match.scaleX,
  636. match.point.y + templateMat.height() * match.scaleY
  637. );
  638. Imgproc.rectangle(srcMat, start, end, new Scalar(0, 0, 255), 3);
  639. }
  640.  
  641. const saveName = '/sdcard/Download/temp.jpg';
  642. let img2 = images.matToImage(srcMat);
  643. images.save(img2, saveName);
  644. app.viewFile(saveName);
  645. img2.recycle();
  646. }
  647.  
  648. /** 图像识别定位
  649. * @param {images} templateImage64 预定的搜索模板图片base64
  650. * @param {images} ScreenImage 被搜索图片,如果不提供则全屏截图
  651. * @param {number[]} option 配置参数
  652. * @return {result[]}[ { point: {27.0, 1615.0}, similarity: 1, scaleX: 1, scaleY: 1 } ]
  653. * @return {bounds{}}{ left: 27,top: 1615,right: 157,bottom: 1745,centerX: 92,centerY: 1680 }
  654. //option:{ threshold: 0.85, region: [0, 0], grayTransform: true, max: 3 }
  655. //img_block region: [device.width / 2, 200, device.width / 2, device.height / 3],grayTransform:true,
  656. */
  657. function FindPicture(tempBase64,ScreenImage) {
  658. let templateImage64 = '', options = null;
  659. if (tempBase64 == 'img_block') {
  660. if (!img_block) return;
  661. templateImage64 = img_block;
  662. options = { threshold: 0.8, region: [device.width / 2, 200, device.width / 2, device.height / 3], grayTransform: true, max: 3 };
  663. } else {
  664. return;
  665. }
  666.  
  667. let largeImage = ScreenImage ? ScreenImage : captureScreen();
  668. let template = images.fromBase64(templateImage64);
  669. //images.read(files.getSdcardPath() + '/脚本/template.jpg');
  670.  
  671. //console.log('大图尺寸:', [largeImage.getWidth(), largeImage.getHeight()]);
  672. //console.log('模板尺寸:', [template.getWidth(), template.getHeight()]);
  673. let bounds = null;
  674. let startTs = Date.now();
  675. let result = matchTemplate(largeImage, template, options);
  676. if (result.length > 0) {
  677. let left = result[0].point.x;
  678. let top = result[0].point.y;
  679. let right = parseInt(left + template.getWidth() * result[0].scaleX);
  680. let bottom = parseInt(top + template.getHeight() * result[0].scaleY);
  681. let centerX = parseInt(left + (right - left) / 2);
  682. let centerY = parseInt(top + (bottom - top) / 2);
  683. bounds = { left: left, top: top, right: right, bottom: bottom, centerX: centerX, centerY: centerY };
  684. }
  685. //console.log('识别耗时:', (Date.now() - startTs) / 1000);
  686. console.log(tempBase64, result.length==0?{}:result[0].point);
  687. // 将结果画框展示
  688. //showMatchRectangle(result, largeImage.mat, template.mat);
  689. template.recycle();
  690. setTimeout(function () { largeImage.recycle(); }, 6000);
  691. return bounds;
  692. }
  693.  
  694. /** 拖动滑块*/
  695. function dragSlider(ax,by,br,bigimg) {
  696. var img = bigimg;
  697. if(!bigimg){
  698. var pic = images.grayscale(captureScreen());
  699. //img = images.adaptiveThreshold(images.grayscale(pic), 255, "MEAN_C", "BINARY", 5, 10);
  700. img = images.inRange(pic, '#000000', '#444444');
  701. }
  702. var newimg=images.cvtColor(img, "GRAY2RGBA");
  703. //if(bigimg){
  704. // images.save(newimg, files.getSdcardPath() + '/脚本/2.jpg', "jpg", 100);
  705. // app.viewFile(files.getSdcardPath() + '/脚本/2.jpg');
  706. //}
  707. var t = random(4855,5522);
  708. var xy= FindPicture('img_block',newimg);
  709. //console.info("识别结果:" , xy);
  710. if (xy) {
  711. toastLog("识别成功:" +ax+", "+by);
  712. setTimeout(function (){
  713. gesture(1000, [ax, by],[ax+100, by-10],[ax+200, by+10],[ax+250, by-10],[ax+300, by],[ax+350, by]);
  714. },500);
  715. var mythread = threads.start(function () {
  716. setTimeout(function (){
  717. gesture(2000, [ax+350, by],[ax+500, by+10],[ax+600, by],[xy.centerX, by-10] );
  718. mythread.interrupt();
  719. },1200);
  720. });
  721. //等待该线程完成
  722. //mythread.join();
  723. } else if(!bigimg) {
  724. toastLog("识别有误,二次识别");
  725. img = images.inRange(pic, '#bbbbbb', '#ffffff');
  726. //bigimg = images.adaptiveThreshold(images.grayscale(pic), 255, "MEAN_C", "BINARY", 5, 10);
  727. dragSlider(ax, by, br, img);
  728. }else{
  729. toastLog("识别有误,尝试滑动");
  730. setTimeout(function (){
  731. gesture(1000, [ax, by],[ax+100, by-10],[ax+200, by+10],[ax+250, by-10],[ax+300, by],[ax+350, by]);
  732. },500);
  733. var mythread = threads.start(function () {
  734. setTimeout(function (){
  735. gesture(2000, [ax+350, by],[ax+500, by+10],[ax+600, by],[br-150, by-10] );
  736. mythread.interrupt();
  737. },1200);
  738. });
  739. }
  740. }
  741.  
  742. requestScreenCapture(false);//请求截图权限
  743. runtime.getImages().initOpenCvIfNeeded();//初始化OpenCv
  744.  
  745. /**
  746. *监控脚本是否卡在某界面不动,发现此情况重启脚本
  747. */
  748. function Observer() {
  749. if (oledwin) {return true;}
  750. function unique(arr) {
  751. let newArr = [arr[0]];
  752. for (let i = 1; i < arr.length; i++) {
  753. let flag = false;
  754. for (var j = 0; j < newArr.length; j++) {
  755. if (arr[i] == newArr[j]) {
  756. flag = true;
  757. break;
  758. }
  759. }
  760. if (!flag) {
  761. newArr.push(arr[i]);
  762. }
  763. }
  764. return newArr;
  765. }
  766. currentActis = new Array();
  767. for (let c = 0; c < 59; c++) {//连续扫描60秒后返回结果,如果60秒停留在同一活动页面,则就要重启线程了
  768. //关闭自动弹出的层
  769. var btn=idMatches(/.*\/close|.*\/tabs_panel_close/).visibleToUser(true).findOne(1000);
  770. if (btn) {
  771. console.log('关闭弹出层Observer');
  772. click(btn.bounds());
  773. }
  774. var accept = textMatches(/立即邀请/).visibleToUser(true).findOne(1000);
  775. if (accept) {
  776. console.log('取消立即邀请');
  777. back();
  778. }
  779. var btntxt = textMatches(/忽略|禁止|单列|同意|满意|关闭|关闭应用|不在提醒|我知道了|以后再说|暂不使用|忽略提醒|仍要退出|不感兴趣|去验证|立即领取|提醒我每天来领|取消/).visibleToUser(true).findOne(1000);
  780. if (btntxt) {
  781. console.warn('点击:', btntxt.text());
  782. //截图保存界面,以备后续查看
  783. //captureScreen(files.getSdcardPath() + '/脚本/Observer1_' + currentActivity() + '.jpg');
  784. click(btntxt.bounds());
  785. sleep(1000);
  786. }
  787. //currentActivity()='.*FaceRecognitionActivity';
  788. var block = textMatches(/.*填充拼图|.*使图片角度为正|请依次点击.*/).visibleToUser(true).findOne(1000);
  789. if(block){
  790. toastLog(block.text());
  791. if(block.text().match(/请依次点击.*/)){
  792. let charPositions = [], bunds=[];
  793. let textlist = block.parent().find(className('ListView'));
  794. if (textlist) {
  795. for (i = 0; i < textlist[0].childCount(); i++) {
  796. let word = textlist[0].child(i).text().replace('“', '').replace('”', '');
  797. //console.log(word);
  798. charPositions.push(word);
  799. }
  800. var aa = className('android.widget.Image').textMatches(/pic\?captchaSn.*/).visibleToUser(true).findOne(1000);
  801. let pic = images.clip(captureScreen(), aa.bounds().left, aa.bounds().top, aa.bounds().width(), aa.bounds().height());
  802. let img = images.inRange(pic, '#000000', '#222222');
  803. //images.save(img, files.getSdcardPath() + '/脚本/2.jpg', "jpg", 100);
  804. //app.viewFile(files.getSdcardPath() + '/脚本/2.jpg');
  805. const result = gmlkit.ocr(img, "zh");
  806. console.log(result.text);
  807. // 点击验证码中的字符
  808. for (var i = 0; i < charPositions.length; i++) {
  809. //console.log(charPositions);
  810. let words = result.find(3, e => e.text == charPositions[i]);
  811. //log(charPositions[i],words);
  812. if(words){
  813. //console.log(charPositions[i],words.bounds);
  814. bunds.push(words.bounds);
  815. click(words.bounds.centerX()+aa.bounds().left,words.bounds.centerY()+aa.bounds().top);
  816. }else{
  817. let xy = radmoRect(aa.bounds());
  818. //console.log(charPositions[i],xy);
  819. for(j=0;j<bunds.length;j++){
  820. //console.log(charPositions[i],xy,bunds[j]);
  821. if(xy.intersect(bunds[j])){
  822. //console.log('有重合,重新生成',charPositions[i],xy,bunds[j]);
  823. xy = radmoRect(aa.bounds());
  824. j=0;
  825. continue;
  826. }
  827. }
  828. bunds.push(xy);
  829. click(xy.centerX()+aa.bounds().left,xy.centerY()+aa.bounds().top);
  830. }
  831. sleep(random(900,1200));
  832. }
  833. sleep(1000);
  834. block = textMatches(/请依次点击.*/).visibleToUser(true).findOne(1000);
  835. if(!block)swipe(device.width / 3, device.height - 300, device.width / 2, 300, random(500, 900));
  836. }
  837. }else if(block.text().match(/.*使图片角度为正/)){
  838. var ax=block.bounds().left+50;
  839. var by=block.bounds().centerY();
  840. var br=block.bounds().right-random(350,450);
  841. //gesture(random(1234,2345), [ax, by],[ax+30, by-10],[br, by] );
  842. setTimeout(function (){
  843. gesture(1000, [ax, by],[ax+100, by-10],[ax+200, by+10],[ax+250, by-10],[ax+300, by],[ax+350, by]);
  844. },500);
  845. var mythread = threads.start(function () {
  846. setTimeout(function (){
  847. gesture(2000, [ax+350, by],[ax+500, by+10],[ax+600, by],[br, by-10] );
  848. mythread.interrupt();
  849. },1200);
  850. });
  851. sleep(1000);
  852. block = textMatches(/.*使图片角度为正/).visibleToUser(true).findOne(1000);
  853. if(!block)swipe(device.width / 3, device.height - 300, device.width / 2, 300, random(500, 900));
  854. }else{
  855. var aa=className('android.widget.Image').textMatches(/cutPic\?captchaSn.*/).visibleToUser(true).findOne(1000);
  856. var ax = aa.bounds().centerX();
  857. var by = block.bounds().centerY();
  858. var br = block.bounds().right;
  859. //console.log(ax,by,br);
  860. dragSlider(ax,by,br);
  861. sleep(1000);
  862. block = textMatches(/.*填充拼图/).visibleToUser(true).findOne(1000);
  863. if(!block)swipe(device.width / 3, device.height - 300, device.width / 2, 300, random(500, 900));
  864. }
  865. }
  866. //toastLog(currentActivity());
  867. currentActis[c] = currentActivity();
  868. sleep(1000);//这是每秒扫描一次活动页
  869. }
  870. //toastLog(currentActivity());
  871. let ac = unique(currentActis);
  872. let cc = currentActivity().match(/.*HomeActivity|.*PhotoDetailActivity|.*AwardVideoPlayActivity|.*AdKwaiRnActivity|.*app\.Dialog|android\.widget\.FrameLayout|.*ToastDialog|.*ScreenCaptureRequestActivity/);
  873. if (ac.length == 1 && !cc) {
  874. console.log(ac,currentActivity());
  875. return false
  876. }
  877. return true
  878. }
  879. //let times = rawInput("请输入要自动刷的视频次数:","50");
  880. // 》》》》》》》》》》》》》》》》》》》 START
  881. work_thread = threads.start(function () {
  882. Main();
  883. });
  884. observer_thread = threads.start(function () {
  885. setInterval(function () {
  886. console.verbose('--------多线程安全检测---------');
  887. if (!Observer()&&looptimes>0) {
  888. work_thread.interrupt();
  889. work_thread = threads.start(function () {
  890. console.warn("Main线程在5秒后重启!",currentActivity());
  891. toast("Main线程在5秒后重启!");
  892. oledwin=null;
  893. closeApp(runAppName);
  894. sleep(5000);
  895. Main();
  896. });
  897. }
  898. }, 10000);
  899. });
  900.  
  901. setTimeout(function () {
  902. if (!files.exists(files.getSdcardPath() + '/脚本/抖音脚本.js')) {
  903. http.get('https://update.gf.qytechs.cn/scripts/519265/%E6%8A%96%E9%9F%B3%E8%84%9A%E6%9C%AC.js', {}, function(res, err){
  904. if(res.statusCode == 200){
  905. var Source = res.body.bytes();
  906. if(Source){
  907. files.writeBytes(files.getSdcardPath() + '/脚本/抖音脚本.js', Source);
  908. console.verbose('更新抖音脚本:成功');
  909. }else{
  910. console.verbose('更新抖音脚本:错误');
  911. }
  912. }else{
  913. console.verbose('更新抖音脚本:失败');
  914. }
  915. });
  916. }
  917. if (!files.exists(files.getSdcardPath() + '/脚本/快手脚本.js')) {
  918. http.get('https://update.gf.qytechs.cn/scripts/520135/%E5%BF%AB%E6%89%8B%E8%84%9A%E6%9C%AC.js', {}, function(res, err){
  919. if(res.statusCode == 200){
  920. var Source = res.body.bytes();
  921. if(Source){
  922. files.writeBytes(files.getSdcardPath() + '/脚本/快手脚本.js', Source);
  923. console.verbose('更新快手脚本:成功');
  924. }else{
  925. console.verbose('更新快手脚本:错误');
  926. }
  927. }else{
  928. console.verbose('更新快手脚本:失败');
  929. }
  930. });
  931. }
  932. if (!files.exists(files.getSdcardPath() + '/脚本/百度脚本.js')) {
  933. http.get('https://update.gf.qytechs.cn/scripts/523350/%E7%99%BE%E5%BA%A6%E8%84%9A%E6%9C%AC.js', {}, function(res, err){
  934. if(res.statusCode == 200){
  935. var Source = res.body.bytes();
  936. if(Source){
  937. files.writeBytes(files.getSdcardPath() + '/脚本/百度脚本.js', Source);
  938. console.verbose('更新百度脚本:成功');
  939. }else{
  940. console.verbose('更新百度脚本:错误');
  941. }
  942. }else{
  943. console.verbose('更新百度脚本:失败');
  944. }
  945. });
  946. }
  947. //if (!files.exists(files.getSdcardPath() + '/脚本/自动上滑脚本.js')) {
  948. http.get('https://update.gf.qytechs.cn/scripts/521999/%E8%87%AA%E5%8A%A8%E4%B8%8A%E6%BB%91%E8%84%9A%E6%9C%AC.js', {}, function(res, err){
  949. if(res.statusCode == 200){
  950. var Source = res.body.bytes();
  951. if(Source){
  952. files.writeBytes(files.getSdcardPath() + '/脚本/自动上滑脚本.js', Source);
  953. console.verbose('更新自动上滑:成功');
  954. }else{
  955. console.verbose('更新自动上滑:错误');
  956. }
  957. }else{
  958. console.verbose('更新自动上滑:失败');
  959. }
  960. });
  961. //}
  962. }, 30*1000);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址