程序中有图片验证码,3个图标按照顺序点击的,怎么解决

694667014 · 2 小时前

回答

Hamibot AI
1
· 2 小时前

处理图片验证码,尤其是需要按顺序点击三个图标的场景,通常属于较为复杂的自动化挑战。Hamibot 提供了多种手段来实现这类操作,但具体方案取决于验证码的可预测性和界面元素是否能被无障碍服务识别。

以下是几种可行的解决思路和实践建议:


方案一:基于控件的点击(推荐优先尝试)

如果这三个图标在界面上是以独立的、可被无障碍服务识别的控件形式存在(例如 ImageView 或带点击事件的 View),你可以通过以下方式定位并点击:

  1. 使用 Hamibot 的 布局分析工具(通过悬浮窗开启)查看这三个图标是否可以被选中。
  2. 查看它们是否有稳定的属性,如:
    • className(通常是 android.widget.ImageView
    • desc(内容描述)
    • bounds(坐标范围)
    • resourceId
  3. 如果有稳定标识,可以通过 className() + index()desc() 来选择并点击。

示例代码:

// 文档地址 https://docs.hamibot.com/
// 假设三个图标都有相同的 className 且 desc 不同
var icons = className("ImageView").find();
if (icons.size() >= 3) {
    icons.forEach((icon, i) => {
        click(icon.bounds().centerX(), icon.bounds().centerY());
        sleep(800); // 每次点击后延时,防止过快导致失败
    });
}

或者使用描述(desc)点击:

// 文档地址 https://docs.hamibot.com/
click(desc("图标1"));
sleep(500);
click(desc("图标2"));
sleep(500);
click(desc("图标3"));

✅ 优点:稳定、不依赖坐标、兼容性强
❌ 缺点:若图标无任何可读属性则无法使用


方案二:基于坐标的点击(适用于固定布局)

如果图标位置是固定的(比如每次都在屏幕相同位置出现),可以直接用坐标点击。

  1. 使用开发者选项中的“指针位置”功能获取每个图标的中心坐标 (x, y)
  2. 使用 Tap(x, y) 函数点击。

示例代码:

// 文档地址 https://docs.hamibot.com/
Tap(500, 800); // 第一个图标
sleep(600);
Tap(700, 1000); // 第二个图标
sleep(600);
Tap(300, 1200); // 第三个图标

⚠️ 注意事项:

  • 必须加上 sleep() 防止连续点击太快。
  • 屏幕分辨率变化或不同设备会导致坐标失效。
  • 强烈建议结合图像识别判断验证码是否出现,避免误操作。

方案三:图像识别 + 坐标偏移(高级方法)

如果图标外观固定且清晰,可以使用 Hamibot 的图像识别功能进行模板匹配。

步骤:

  1. 截取每个图标的截图作为模板图片(.png 格式)。
  2. 将图片上传到脚本资源中。
  3. 使用 images.findImage() 定位图标位置。

示例代码:

// 文档地址 https://docs.hamibot.com/
const mainImg = captureScreen();
const template1 = images.read("./icon1.png");
const template2 = images.read("./icon2.png");
const template3 = images.read("./icon3.png");

const p1 = images.findImage(mainImg, template1);
const p2 = images.findImage(mainImg, template2);
const p3 = images.findImage(mainImg, template3);

if (p1) {
    Tap(p1.x, p1.y);
    sleep(600);
}
if (p2) {
    Tap(p2.x, p2.y);
    sleep(600);
}
if (p3) {
    Tap(p3.x, p3.y);
}

✅ 优点:适用于无控件信息但图像固定的场景
❌ 缺点:对旋转、缩放、模糊敏感;性能开销较大


方案四:结合 RootAutomator(高精度控制)

如果你的设备已 root,可以使用 RootAutomator 实现更精确的触摸模拟,避免被系统拦截。

// 文档地址 https://docs.hamibot.com/
let ra = new RootAutomator();
ra.tap(500, 800);
sleep(600);
ra.tap(700, 1000);
sleep(600);
ra.tap(300,
ℹ️ 本回答由 AI 生成,内容仅供参考