【懒人精灵】使用多线程来处理弹窗,全分辨率写法

在懒人精灵的全分辨率脚本开发中,遇到一个浏览器跳转的问题。
由于自带的飞桨OCR识别速度在3-5秒,所以不能及时点击到toast中的确定按钮。
这里使用了限时操作和重试机制来完成。

file

-- 从浏览器跳转到小红书笔记页
-- 实现思路:
-- 先点击底部的玫红色按钮,由于ocr识别速度较慢,在下一次识别的时候,跳转按钮toast已经消失。
-- 所以第一次的时候需要获取到toast中确定按钮的位置。
-- 然后第二次点击玫红色按钮,之后立即盲点上次获取到的位置。
-- 中间会有一个下载弹窗的干扰,采用多线程来处理掉
-- 最后判断是否在小红书的笔记页面,如果在小红书笔记页面,则返回true,否则返回false。
function jumpToRedBook()
    local result = false

    -- 浏览器下载弹窗处理
    function thread_func()
        -- 这个线程负责处理下载弹窗,确保不会影响跳转操作
        while true do
            -- OCR识别“取消”按钮,如果弹窗出现则点击“取消”按钮。支持全分辨率识别
            if next(OCR:find(nil, {'^取消$'}, true, 1*1000, {584,989,1009,1605, '中间'})) ~= nil then
                print('取消下载')  -- 找到并处理弹窗
                -- break  -- 如果找到弹窗则退出子线程
            else
                print('未找到弹窗')  -- 如果没有找到弹窗,继续执行
            end
            sleep(1*1000)  -- 每1秒检查一次弹窗
        end
    end
    -- 创建并启动子线程来处理弹窗
    local popupThread = Thread.newThread(thread_func)
    local sureBtnX,sureBtnY  -- 确定按钮中心点坐标

    -- 限制N秒钟的死循环,避免程序长时间卡死
    local startTime = os.clock()
    while true do
        -- 如果超过60秒,则停止当前操作
        if os.clock() - startTime >= 60*1000 then
            print('超时退出')  -- 超时退出处理
            popupThread:stopThread()  -- 停止弹窗处理线程
            break
        end

        -- 如果获取到确定按钮坐标且已经跳转到笔记页面,则返回true
        if sureBtnX ~= nil and sureBtnY ~= nil and next(openCv.findImg(nil, {'笔记页_转发图标'},{848,46,1072,266,'右上角'},taskList.taskConfig['old_width'], taskList.taskConfig['old_height'],0.85,1)) ~= nil then
            print('已跳转到小红书')  -- 找到笔记页面
            popupThread:stopThread()  -- 停止弹窗处理线程
            result = true  -- 设置跳转成功
            break
        -- 如果已经识别到“App内打开”提示且确定按钮坐标已获取,点击确定按钮
        elseif sureBtnX ~= nil and sureBtnY ~= nil and next(OCR:find(nil, {'App内打开$'}, true, 0, {154,1699,918,2230, '下部中间'})) ~= nil then
            print('盲点确定按钮')  -- 处理“App内打开”的提示,点击确定按钮
            if G_CONF:get('bluetoothType') == 'BKM' then
                bkHID.autoClick(sureBtnX, sureBtnY, 5*1000)  -- 使用BKM设备模拟点击
            elseif G_CONF:get('bluetoothType') == 'KMH' then
                kmHID.autoClick(sureBtnX, sureBtnY, 5*1000)  -- 使用KMH设备模拟点击
            end
        -- 如果没有找到确定按钮且识别到“App内打开”,尝试获取确定按钮的位置
        elseif next(OCR:find(nil, {'App内打开$'}, true, 0, {154,1699,918,2230, '下部中间'})) ~= nil then
            for i=1,3 do
                -- 尝试3次定位确定按钮的坐标
                local sureBtn = OCR:find(nil, {'确定'}, false, 0, {154,1699,918,2230, '下部中间'})
                if next(sureBtn) ~= nil then
                    -- 如果找到了确定按钮,则记录按钮中心点坐标
                    sureBtnX,sureBtnY = sureBtn['centerX'],sureBtn['centerY']
                    break  -- 找到按钮后退出循环
                else
                    print('未找到确定按钮')  -- 如果3次都未找到按钮,继续循环
                end
            end
        end
    end

    return result  -- 返回是否成功跳转到小红书笔记页面
end

思路:

  1. 浏览器弹窗处理:线程 thread_func 会不断检查是否有下载弹窗,并在弹窗出现时自动点击“取消”。
  2. 超时处理:整个循环会在60秒内执行,如果时间过长,线程会被停止。
  3. 跳转到笔记页面的判断:通过OCR识别“笔记页_转发图标”来确认是否已经跳转到小红书的笔记页面。
  4. 确定按钮的点击:在遇到“App内打开”提示时,通过OCR识别并获取确定按钮的坐标,然后模拟点击。
  5. 重试机制:如果第一次未能找到确定按钮,会通过多次尝试来获取坐标。

技术难点

1、全分辨率OpenCV找图,判断已进入指定应用的笔记页面
2、ocr范围识别自适应全分辨率
3、ocr识别结果中,一行文本中包含的子字符串的位置计算
4、重试机制和超时处理

注意

其实上述思路在实际运行中,还是有些许瑕疵的。
可以通过进一步的优化,来处理跳转问题。从而实现在任何情况下,都能准确无误的从浏览器跳转到应用内。

提供这段代码的目的,主要是帮你在遇到类似问题的时候,能够打开一些思路,通过变通去实现。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】使用多线程来处理弹窗,全分辨率写法

企业级大数据智能营销管理系统

了解详情