Autojs实战案例

一、概述:

记录封装常用autojs语法及案例,方便日后急速上手使用,高手请绕路!

 

二、基础案例

1.上传图片剪切并返回图片

  • 由于我的autojs的images.clip方法在使用是报错,所以换种方式剪切图片;
  • 方式:通过接口处理图片,后端接口服务为python+flask

服务端:

#!/usr/bin/env python
# encoding: utf-8

import flask
from PIL import Image
from io import BytesIO
from werkzeug.utils import secure_filename
from flask import request, send_from_directory,jsonify

server = flask.Flask(__name__)#创建Flask对象server

# post方法:上传文件的
@server.route('/upload', methods=['post'])
def upload():
    imgData = request.files.get('file')#文件流
    cc=request.values.get('chen')
    dd=eval(cc)
    if imgData and dd:
        # chen = secure_filename(imgData.filename)#获取文件名
        # imgData.save(chen)#保存图片
        # imgData.seek(0)#重新定义指针到文件开头
        ###读取文件流bytes
        chen = request.files["file"].stream.read()
        #把bytes数组还原成图片
        img = Image.open(BytesIO(chen))
        print('图片尺寸:',img.size)

        #指定区域剪切图片
        cropped = img.crop((dd))  # (x1, y1, x2, y2)
        cropped.save(r"./test.png")#保存图片
        return send_from_directory(r'./','test.png', as_attachment=True) #返回要下载的文件内容给客户端
    else:

        return jsonify({"msg": "false", "ret": 2,"code": "fill","text":"图片处理异常或没有传坐标"})


if __name__ == '__main__':
    server.run(port=8000, debug=True, host='0.0.0.0')
View Code

autojs端:

device = device.serial;
//________________________________________截图__________________________________________
if (!requestScreenCapture()) {
    console.show()
    toastLog("请求截图失败");
    exit();
} else {
    toastLog("请求截图成功");
}
//截图
captureScreen("/sdcard/"+device+'.png');
log('开始请求接口-区域处理图片');
sleep(2000);


// ////____________________上传截图并保存文件__________________________________________________
var url="192.168.10.32:8000/upload"
//打开图片并请求
var res = http.postMultipart(url, {
    file: open("/sdcard/"+device+".png"),//图片
    chen: "10,920,1050,1500"//坐标x1,y1,x2,y2
});

//判断状态码
if(res.statusCode >= 200 && res.statusCode < 300){
    //保存文件
    files.writeBytes('/sdcard/'+device+'.png',res.body.bytes());
    //打开文件
    // app.viewFile('/sdcard/'+device+'.png');
    }
else{
    log('图片区域处理错误')
}
View Code

 

 2.关闭app应用

auto();
function kill_app(packageName) {
    var name = getPackageName(packageName); 
    if(!name){
        if(getAppName(packageName)){
            name = packageName;
        }else{
            return false;
        } 
    }

    app.openAppSetting(name);
    text(app.getAppName(name)).waitFor();  
    let is_sure = text("强行停止").findOne();
    if (is_sure.enabled()) {
        click('强行停止');
        sleep(700);
        //确定强行停止
        text("强行停止").findOne().click();
        log(app.getAppName(name) + "应用已被关闭");
        sleep(1000);
        back();
    } else {
        log(app.getAppName(name) + "应用不能被正常关闭或不在后台运行");
        back();
    }
}

kill_app('com.tencent.mobileqq')

 

 3.获取函数执行时间

auto();
var start = new Date().getTime() //开始时间-时间戳毫秒
test()
function test(){
    log('执行函数test')
    sleep(2000)
    sleep(2000)
    sleep(2000)
}

var end = new Date().getTime()//结束时间-时间戳毫秒
//程序运行的时间-单位秒
var time_zhong = Math.floor((end - start) / 1000);
toast("执行耗时"+time_zhong+"秒")

 

4.在一个js文件调用不同模块的函数

//main.js
auto();
toastLog("启动脚本")

//调用ceshi1.js
var m2 = require("ceshi1.js")
toast(m2.kuaishou("com.kuaishou.cn"))
//调用ceshi2.js var m3 = require("ceshi2.js") toast(m3.douyin("com.douyin.cn"))
//ceshi1.js module.exports={ //变量 a:1, //带两个形参的函数 kuaishou:(name)=>{ toast("执行快手函数-ceshi1.js") log("执行快手函数-ceshi1.js") return true } } //ceshi2.js module.exports={ //变量 a:2, //带两个形参的函数 douyin:(name)=>{ toast("执行douyin函数-ceshi2.js") log("执行douyin函数-ceshi2.js") return true } }

 

 5.获取手机推送通知并上传到后端

采用autojs+python+flask

前端:

if (auto.service != null){
    events.observeToast();
    events.onToast(function(toast){
        //log(toast.texts)
        //log("Toast内容:" + toast.getText() +'\n'+"包名:" + toast.getPackageName())
        var text=toast.getText()
        log(text);
        var name=toast.getPackageName()
        var start = parseInt(new Date().getTime()/1000) //当前时间
        log(start);
        if (text != null){
            var url = "http://hv8g6k.natappfree.cc/smg_upload";
            r = http.post(url, {
            "text": text,
            "name": name,
            "time": start
            });
            var response=r.body.string();//获取响应
            //同时弹起toast和记录日志
            toastLog(response);                  
    }
    });
}
else{
        app.startActivity({
            action: "android.settings.ACCESSIBILITY_SETTINGS"
        });
}
View Code

后端:

#!/usr/bin/env python
# encoding: utf-8

import flask
from flask import request, send_from_directory,jsonify

server = flask.Flask(__name__)#创建Flask对象server


@server.route('/smg_upload', methods=['post'])
def smg_upload():
    '''接收客户端上报的推送'''
    text=(request.form).to_dict()
    print(text)
    if text:
        #这里可以使用mysql入库操作
        return jsonify({"msg": "True", "ret": 1,"code": "200","text":"请求成功"})
    else:
        return jsonify({"msg": "False", "ret": 2,"code": "500","text":"请求失败,请重试"})


if __name__ == '__main__':
    server.run(port=8000, debug=True, host='0.0.0.0')#可以绑定域名
View Code

 

 6.微信扫一扫

"auto";
launch("com.tencent.mm");
sleep(1500);
//循环点击元素直到成功(空语句缩写)
while(!click("发现"));
while(!click("扫一扫"));
sleep(1000);

//判断指定元素
if(text("相册").exists()){
   toast("找到相册");
   //点击相册坐标(也可使用元素点击)
   click(950,1930);
   sleep(1500);
  //点击相册中图片
   click(400,350);
}

 

 7.解锁手机

// 输入密码(也可以用滑动方式gesture()函数滑动解锁,需要根据手机设置方式确定)
function password_input()
{
    var password = "123456"
    for(var i = 0; i < password.length; i++)
    {
        var p = text(password[i].toString()).findOne().bounds();
        click(p.centerX(), p.centerY());
        sleep(100);
    }
}
 
// 解锁屏幕 function unlock() { if(!device.isScreenOn()) { device.wakeUp(); //唤醒设备 sleep(500); //必须加等待时间,不然可能滑动不生效
//滑动设备解锁 swipe(
500,2000,500,1000,210);

//调用输入密码函数 password_input(); } }

//调用函数 unlock();

 

 

三、实战案例

 1.实现判断、启动、进服操作

    游戏包:http://pkg.superdalan.com/game.pkg/download?pkgId=5322&f=shywl2mh_dalan_assemblexysdk_96_1.0.0_5322_20211129_141426.apk

auto();
//判断启动包名并启动
function start_app(packageName,AppName){
    if (AppName != null) {
        //停止app
        shell("rm -rf ./sdcard/.dalan");
        toastLog('开始启动:'+AppName);     
        launch(page);
        sleep(15000);
        click(20,30); //单点击坐标

        ////_________________截图操作____________________________________
        //1.请求截图权限
        if(!requestScreenCapture()){
            toast("请求截图失败");
            exit();
        }
        //2、进行截图
        captureScreen("/sdcard/test/shywl_96/登录前开始游戏.png");
        sleep(2000)

        ////______________________________________判断图片相似度(可以两张一样的图片)_____________________________________
        //大图
        let max = images.read("/sdcard/test/shywl_96/登录前开始游戏.png"); 
        //小图
        let min = images.read("/sdcard/test/shywl_96/min登录前开始游戏.png");
        //对比相似对(threshold是阈值)
        let p = findImage(max, min,{threshold:0.6});//// 找到返回true, 失败返回false
        if (p) {
            print('找到开始游戏按钮');
            click(550,1570);
            sleep(8000);
        } 
        //如果没有匹配到图片,就判断是否有账号登录
        else if (text("帐号登录").findOne(20000)) {
            toastLog('打开游戏成功-有账号登录')
            click(800, 800);//点击帐号登录
            if (text("登录").findOne(3000)) {
                log('当前已在账号输入页面')
                setText(id("dlhm_et_account").find(), '18520103625');//输入账号
                var pass = className("android.widget.EditText").text("请输入密码").findOne(1000);
                pass.setText(123456);//输入密码
                click('登录'); //点击text的元素
            }
            else {
                log('有账号登录、没有到账号密码页面')
            } 

        }
        else{
            log('图片匹配失败并没有登录元素')
        }
    }
    else {
            log('手机没有安装:'+packageName)
        }
}


//杀掉app应用
function kill_app(packageName) {
    var name = getPackageName(packageName);
    if (!name) {
        if (getAppName(packageName)) {
            name = packageName;
        } else {
            return false;
        }
    }
    app.openAppSetting(name);
    text(app.getAppName(name)).waitFor();
    let is_sure = text("强行停止").findOne();
    if (is_sure.enabled()) {
        click('强行停止');
        sleep(700);
        //确定强行停止
        text("强行停止").findOne().click();
        log(app.getAppName(name) + "应用已被关闭");
        sleep(1000);
        back();
    } else {
        log(app.getAppName(name) + "应用不能被正常关闭或不在后台运行");
        back();
    }
}


device.wakeUp();//判断是否黑屏
var page = 'com.dl.ctmd.gdt';
var AppName = getAppName(page);
start_app(page,AppName);//启动游戏
kill_app(page);//关闭app

 

 

 

 

相关连接:

https://blog.csdn.net/feiyunjs/article/details/94722766.....................................常用的代码和公共函数搜集整理

https://blog.csdn.net/qq_30856231/article/details/110118735 ........................autojs常用案例

https://www.jianshu.com/p/3b24656b22c9 .....................................................autojs常用函数,autojs最全的案例仓库

https://blog.csdn.net/weixin_33690963/article/details/93515638 ....................爬取支付水滴,autojs快速搭建http服务教程

https://blog.csdn.net/tfnmdmx/article/details/118544342 ................................autojs多线程-复杂版

https://www.cnblogs.com/Mr-lin66/p/11969098.html .......................................手机同步到pc并获取元素

https://www.codeleading.com/article/98912319617/ .......................................惠头条项目 ,,auto.js实现攒攒 ,,抖音检测弹窗 ,,京东2020双十一脚本-非UI

https://pro.autojs.org/docs/#/zh-cn/project?id=launchconfig .........................项目打包配置

 

posted on 2020-09-14 14:57  chen_2987  阅读(6726)  评论(0编辑  收藏  举报

导航