autojs与微信反脚本斗智斗勇之微信搜索框输入文本

给公司的微信小程序写自动化检测代码,业务逻辑蛮简单,就是由于微信反脚本检测很到位,实现一些功能时要绕绕弯子。比如微信搜索框输入文本。

之前的微信,在主页面,搜索按键(就是一个放大镜图标那个)desc为“搜索”。通过desc获取控件,再点击这个控件,就会进入搜素模式。再用setText(),就可以输入文本。

现在的微信,搜索按键的desc为空,且其他属性也不稳定,于是用坐标点击。

代码如下

微信搜索(p1){
        打开微信主界面()
        setClip(p1);
        click(600/720*device.width,100/1612*device.height)
        sleep(800);
        let x = 400/720*device.width
        let y = 100/1612*device.height
        swipe(x,y,x,y,600)
        sleep(800);
        点击区域内文本(0,device.height*0.5,device.width,device.height*0.5,p1)
    },
    打开微信主界面(){
        launchApp("微信")
        let nvt = id("nvt").findOne(2000)
        while(nvt===null){
            back()
            sleep(800)
            nvt = id("nvt").findOne(2000)
        }
        while(!nvt.click());
    },
 点击区域内文本(p1,p2,p3,p4,p5){
        let img = captureScreen0()
        let img2 = images.clip(img,p1,p2,p3,p4)
        let ocr = $ocr.create()
        let result = ocr.detect(img2)
        img.recycle()
        img2.recycle()
        ocr.release()
        //log(result)
        for(let i=0;i<result.length;i++){
            if(result[i].text===p5){
                let b = result[i].bounds
                let x = (b.left+b.right)/2 + p1
                let y = (b.top+b.bottom)/2 + p2
                log("点击区域内文本x,y完全匹配",x,y)
                click(x,y)
                sleep(1000)
                return
            }
        }
        for(let i=0;i<result.length;i++){
            if(result[i].text.indexOf(p5)!=-1){
                let b = result[i].bounds
                let x = (b.left+b.right)/2 + p1
                let y = (b.top+b.bottom)/2 + p2
                log("点击区域内文本x,y部分匹配",x,y)
                click(x,y)
                sleep(1000)
                return
            }
        }
        throw "区域内未找到"+p5
     },
    captureScreen0(){
        let img
        try{
            ui.run(()=>{this.setMenuVisible(0);console.hide();})
            sleep(500)
            return  automator.takeScreenshot()
        }
        catch(err){
            log(err)
        }
        finally{
            ui.run(()=>{this.setMenuVisible(1)})
        }
    },

点击进入搜索模式后,用setClip()设置粘贴板内容。

下一步,就是长按搜索框。试了下longClick(x,y),无效,想到用swipe(x,y,x,y,time),注意swipe方法执行效果是,在时间time内,从(x1,y1)滑动到(x2,y2),这里x1=x2,y1=y2,就相当于长按。我取的time是600ms,各位小可爱可以自己修改。

长按搜索框后,界面会出现“粘贴 剪切板”tip小窗,我尝试用ocr识别出“粘贴”再点击,很遗憾点到了旁边的位置,行不通,于是继续思考。

长按搜索框后,键盘上方浮现了粘贴板内的内容。于是屏幕截图,用clip方法剪下下半部分,再用ocr识别文本。点击文本坐标,于是输入搜索框就完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值