Autojs实战案例
一、概述:
记录封装常用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')
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
前端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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" }); }
后端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/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')#可以绑定域名
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.实现判断、启动、进服操作
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 阅读(6896) 评论(0) 编辑 收藏 举报