牙叔教程 简单易懂
解决问题第一原则
把问题写下来
问题
查找暗部滑块出岔子了
出岔子的图片
在上一个教程
https://www.yuque.com/go/doc/71850394
我们找暗部滑块, 也就是右侧的黑色音符的位置,
是通过找图片中最暗的区域, 来查找位置的
这个验证码图片, 加了一个干扰项, 黑色的手机外壳,
手机的亮度和音符的亮度是非常类似的,
所以通过亮度这个方法来查找音符是不通用的,
因此放弃这个方法
最终方案
- 截图A
- 滑动滑块一定距离
- 截图B
- 截图A - 截图B = 图片C
- 图片C中是确定的滑块
图片减法教程: https://www.yuque.com/yashujs/bfug6u/tv4fyi
此时, 滑块的形状对我们来说, 就是一个已知量,
在已知左侧滑块的情况下, 去查找右侧的音符,
这样即使有手机壳的干扰, 我们仍然可以通过轮廓的相似度来判断是不是音符
那么问题又出来了, 怎么改变滑动轨迹?
改变滑动轨迹
这是群里的大佬@无名小姐 发的例子
const accessibilityService = com.stardust.autojs.core.accessibility.AccessibilityService.Companion.getInstance(); const screenMetrics = runtime.getScreenMetrics(); let path = new android.graphics.Path(); path.moveTo(screenMetrics.scaleX(100), screenMetrics.scaleY(0)); path.lineTo(screenMetrics.scaleX(100), screenMetrics.scaleY(1000)); let strokeDescription = new android.accessibilityservice.GestureDescription.StrokeDescription(path, 0, 500, true); accessibilityService.dispatchGesture( new android.accessibilityservice.GestureDescription.Builder().addStroke(strokeDescription).build(), new android.accessibilityservice.AccessibilityService.GestureResultCallback({ onCompleted() { let path2 = new android.graphics.Path(); path2.moveTo(screenMetrics.scaleX(100), screenMetrics.scaleY(1000)); path2.lineTo(screenMetrics.scaleX(500), screenMetrics.scaleY(1000)); let strokeDescription2 = strokeDescription.continueStroke(path2, 0, 500, false); accessibilityService.dispatchGesture( new android.accessibilityservice.GestureDescription.Builder().addStroke(strokeDescription2).build(), null, null ); }, }), null );
这个例子是最关键点之一,
因为我们要先滑动滑块, 然后截图处理分析, 然后继续滑动;
两次滑动是不可以断开的, 上面这个例子的两次滑动就没有断开, 满足需求;
我自己也封装了一个方法
只要传入points, 时长, 等四个参数就可以执行了, 不用再写一大堆的代码, 和 gesture 一样简单;
executeGestures 返回的是Promise, 因为它是在onCompleted的回调中, 去触发下一个操作
let gestures = [ { points: [sliderStartPoint, [sliderStartPoint[0] + deviceWidth, sliderStartPoint[1]]], duration: 500, waitingTimeAfterCompletion: 500, onCompleted: function () { let secondCaptureScreen = captureScreen().clone(); return secondCaptureScreen; }, }, ]; executeGestures(gestures)
效果
一些关键点
我们找图用了两个维度
- 明暗度
- 轮廓
截图有两次
- 移动滑块前一次
- 移动滑块后一次
滑动滑块的两个阶段
- 第一次移动滑块一定距离, 是为了两张截图做减法, 找滑块起始位置
- 第二次是把滑块移动到正确的位置
用到的opencv命令
- 高斯模糊
- 二值化
- 找轮廓
- 画轮廓
- 画直线
- 外接矩形
- 轮廓按面积排序
- 形态学处理
- 轮廓相似度
最重要的事情
理解思路
测试环境
手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.12
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途