用Hamibot写脚本控件查找+识图找图写一个抖音用的脚本
① 打开抖音 App
② 点击【我】
③ 点击【粉丝】
④ 遍历所有粉丝找【回关】控件查找+识图找图
⑤ 点开(【回关】控件查找+识图找图)粉丝主页 → 点击粉丝主页的【回关】控件查找+识图找图
⑥发私信 → 私信页右上角 ··· 控件查找+识图找图→ 聊天背景控件查找+识图找图
⑦ 从相册选择图片控件查找+识图找图→
⑧ 选中第一张图片
⑨ 点击【和对方一起换】控件查找+识图找图
⑩ 返回粉丝列表页面(③ 点击【粉丝】)到这一步,继续循环下一位粉丝

HAMI_1833798435 · 2 小时前
第 1 条补充
·
2 小时前

脚本需要提前在 /sdcard/Hamibot/ 目录下放置回关、...、聊天背景、从相册选择、和对方一起换等按钮的截图,并修改脚本中对应的图片路径。这个到底在哪里,是再手机目录放置吗

第 2 条补充
·
2 小时前

发私信按钮不用添加图片吗

回答

Hamibot AI
1
· 2 小时前

文档地址 https://docs.hamibot.com/

// 文档地址 https://docs.hamibot.com/
// 注意:请先在手机设置中开启Hamibot的无障碍服务和后台弹出界面权限,并授予截图权限。
// 需要预先准备好用于识别的图片文件,放在手机存储中,路径可自定义。

// 截图权限请求
if (!images.requestScreenCapture()) {
    toast("请求截图权限失败");
    exit();
}

// 定义图片路径,用于识图找图,请根据实际图片路径修改
var IMG_BACK_FOLLOW = "/sdcard/Hamibot/follow_back.png"; // 回关按钮图片
var IMG_FOLLOW = "/sdcard/Hamibot/follow.png"; // 粉丝主页回关按钮图片
var IMG_MORE = "/sdcard/Hamibot/more.png"; // 私信页右上角...按钮图片
var IMG_CHAT_BG = "/sdcard/Hamibot/chat_bg.png"; // 聊天背景按钮图片
var IMG_FROM_ALBUM = "/sdcard/Hamibot/from_album.png"; // 从相册选择图片按钮
var IMG_TOGETHER_CHANGE = "/sdcard/Hamibot/together_change.png"; // 和对方一起换按钮

// 辅助函数:通过文本查找控件并点击
function clickByText(text) {
    var btn = text(text).findOne(1000);
    if (btn) {
        btn.click();
        sleep(1000);
        return true;
    }
    return false;
}

// 辅助函数:通过图片查找并点击,timeout为超时时间(ms)
function clickByImage(imgPath, timeout) {
    timeout = timeout || 3000;
    var img = images.read(imgPath);
    if (!img) {
        toast("未找到图片:" + imgPath);
        return false;
    }
    var p = findImage(captureScreen(), img, { threshold: 0.8, timeout: timeout });
    if (p) {
        click(p.x, p.y);
        sleep(1000);
        return true;
    }
    return false;
}

// 辅助函数:返回上一页面
function goBack() {
    back();
    sleep(1000);
}

// 主流程
function main() {
    // ① 打开抖音App
    app.launchApp("抖音");
    sleep(5000);

    // ② 点击【我】
    if (!clickByText("我")) {
        toast("未找到【我】按钮");
        return;
    }
    sleep(2000);

    // ③ 点击【粉丝】
    if (!clickByText("粉丝")) {
        toast("未找到【粉丝】按钮");
        return;
    }
    sleep(3000);

    // ④ 遍历所有粉丝,查找【回关】控件或图片
    while (true) {
        var found = false;
        // 查找文本“回关”的控件
        var backFollowBtn = text("回关").findOne(2000);
        if (backFollowBtn) {
            found = true;
            backFollowBtn.click();
            sleep(2000);
        } else {
            // 如果找不到文本,尝试识图
            if (clickByImage(IMG_BACK_FOLLOW, 2000)) {
                found = true;
            }
        }

        if (!found) {
            toast("未找到回关粉丝,结束");
            break;
        }

        // ⑤ 进入粉丝主页后,点击主页的【回关】按钮
        // 先尝试文本,再识图
        if (!clickByText("回关")) {
            if (!clickByImage(IMG_FOLLOW, 3000)) {
                toast("未找到主页回关按钮,跳过");
                goBack(); // 返回粉丝列表
                sleep(2000);
                continue;
            }
        }
        sleep(2000);

        // ⑥ 发私信
        if (!clickByText("发私信")) {
            toast("未找到发私信按钮,跳过");
            goBack(); // 返回粉丝列表
            sleep(2000);
            continue;
        }
        sleep(2000);

        // 私信页右上角 ... 控件查找+识图
        if (!clickByText("...")) {
            if (!clickByImage(IMG_MORE, 3000)) {
                toast("未找到...按钮,跳过");
                goBack(); // 返回粉丝列表
                sleep(2000);
                continue;
            }
        }
        sleep(2000);

        // 聊天背景
        if (!clickByText("聊天背景")) {
            if (!clickByImage(IMG_CHAT_BG, 3000)) {
                toast("未找到聊天背景,跳过");
                goBack(); // 返回粉丝列表
                sleep(2000);
                continue;
            }
        }
        sleep(2000);

        // ⑦ 从相册选择图片
        if (!clickByText("从相册选择")) {
            if (!clickByImage(IMG_FROM_ALBUM, 3000)) {
                toast("未找到从相册选择,跳过");
                goBack(); // 返回粉丝列表
                sleep(2000);
                continue;
            }
        }
        sleep(2000);

        // ⑧ 选中第一张图片(假设相册第一张图片的坐标大致固定,或通过控件查找)
        // 这里采用简单方式:点击屏幕中央偏上区域,通常第一张图在左上角
        click(150, 400);
        sleep(1000);

        // ⑨ 点击【和对方一起换】
        if (!clickByText("和对方一起换")) {
            if (!clickByImage(IMG_TOGETHER_CHANGE, 3000)) {
                toast("未找到和对方一起换按钮,跳过");
                goBack(); // 返回粉丝列表
                sleep(2000);
                continue;
            }
        }
        sleep(2000);

        // ⑩ 返回粉丝列表页面(通过多次返回)
        // 当前在聊天界面,需要返回私信界面,再返回粉丝主页,再返回粉丝列表
        goBack(); // 返回聊天界面
        sleep(1000);
        goBack(); // 返回粉丝主页
        sleep(1000);
        goBack(); // 返回粉丝列表
        sleep(2000);

        // 继续循环下一个粉丝
        // 为了防止无限循环,可以加入判断是否到底部等,这里简单演示
        toast("处理完成一个粉丝,继续下一个");
        // 滚动到下一个粉丝(可选)
        swipe(500, 1500, 500, 500, 500);
        sleep(2000);
    }
}

main();

说明:

  1. 脚本需要提前在 /sdcard/Hamibot/ 目录下放置回关、...、聊天背景、从相册选择、和对方一起换等按钮的截图,并修改脚本中对应的图片路径。
  2. 使用 text("回关") 等控件查找为主,找不到时再用识图 clickByImage 作为补充,提高成功率。
  3. 选中第一张图片采用了固定坐标点击,因为相册界面通常第一张图在左上角,可根据实际设备调整坐标。
  4. 循环处理每个粉丝,处理完一个通过返回键回到粉丝列表,并向上滑动加载下一个粉丝。注意抖音可能对频繁操作有限制,请合理使用。
  5. 脚本运行前务必授予无障碍、悬浮窗、截图等权限,否则会直接退出。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot AI
1
· 2 小时前

是的,就在手机内部存储里创建 /sdcard/Hamibot/ 文件夹,然后把需要的截图放进去。

具体操作步骤:

  1. 打开手机自带的文件管理 App。
  2. 进入内部存储(也叫 /sdcard手机存储)。
  3. 如果里面没有 Hamibot 文件夹,就新建一个,命名为 Hamibot
  4. 进入 Hamibot 文件夹,把以下截图文件放进去(文件名要和脚本里对应):
    • follow_back.png(粉丝列表中的回关按钮截图)
    • follow.png(粉丝主页的回关按钮截图)
    • more.png(私信页右上角「...」按钮截图)
    • chat_bg.png(聊天背景按钮截图)
    • from_album.png(从相册选择按钮截图)
    • together_change.png(和对方一起换按钮截图)

截图怎么截?

  • 打开抖音,找到对应界面,用手机自带的截图功能(通常是音量下 + 电源键)截屏。
  • 然后用图片编辑工具裁剪出目标按钮的局部图,保存为 .png 格式,并命名为上面列出的文件名。

脚本中使用的路径是 /sdcard/Hamibot/follow_back.png,如果你把截图放在其他位置,记得修改脚本里对应的路径变量。

如果有问题,可以随时问。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot AI
1
· 2 小时前

发私信按钮目前脚本里用的是 clickByText("发私信"),也就是纯靠控件文本查找,没有加识图作为补充。如果你的抖音界面中「发私信」按钮能正常被文本查找到,就不需要额外添加图片。

但如果你担心文本查找失败,想加识图作为备选,可以这样做:

  1. 截图:截取发私信按钮的局部图,保存为 /sdcard/Hamibot/send_msg.png
  2. 修改脚本中发私信那一段,改成:
// ⑥ 发私信
if (!clickByText("发私信")) {
    if (!clickByImage("/sdcard/Hamibot/send_msg.png", 3000)) {
        toast("未找到发私信按钮,跳过");
        goBack();
        sleep(2000);
        continue;
    }
}
sleep(2000);

这样就会先试着找文字,找不到再用识图,双保险更稳。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实