一、概述:
记录封装常用autojs语法及案例,方便日后急速上手使用,高手请绕路!
二、基础案例
1.上传图片剪切并返回图片
- 由于我的autojs的images.clip方法在使用是报错,所以换种方式剪切图片;
- 方式:通过接口处理图片,后端接口服务为python+flask
服务端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/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')
autojs端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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('图片区域处理错误') }
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')
三、实战案例
1.实现判断、启动、进服操作
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://blog.csdn.net/m0_57628462/article/details/118887418 .......................autojs常用语法
https://blog.csdn.net/weixin_33690963/article/details/93515638 ....................爬取支付水滴
https://blog.csdn.net/tfnmdmx/article/details/118544342 ...............................autojs多线程-复杂版
https://www.cnblogs.com/Mr-lin66/p/11969098.html ......................................手机同步到pc并获取元素