通信概念
两个主体, 相互之间交换信息
autojs版本
主体概念
- 同一个脚本
- 多个脚本
- 脚本和app
- 脚本和服务器
通信方法
- 文件读写
- 本地存储 Storages
- emitter
- 脚本间广播 events.broadcast
- 脚本引擎 ScriptEngine
- 脚本引擎 engines.execScriptFile
- 安卓广播
- http
文件读写
let filePath = files.join(files.getSdcardPath(), "1.txt"); files.write(filePath, "hello world"); toastLog(files.read(filePath));
本地存储 Storages
var storage = storages.create("ABC"); storage.put("a", 123); toastLog(storage.get("a"));
emitter
// 会打印2次 hello world const myEE = events.emitter(); myEE.on("foo", (value) => { toastLog(value); }); myEE.on("foo", (value) => { toastLog(value); }); console.log(myEE.eventNames()); myEE.emit("foo", "hello world");
脚本间广播 events.broadcast
// 请牢记js是单线程, 3秒过后才会打印小明 events.broadcast.on("hello", function (name) { toastLog("你好, " + name); }); events.broadcast.emit("hello", "小明"); //保持脚本运行 setInterval(() => {}, 1000); for (var i = 0; i < 3; i++) { sleep(1000); log(i); }
脚本引擎 ScriptEngine
向该脚本引擎发送一个事件,该事件可以在该脚本引擎对应的脚本的events模块监听到并在脚本主线程执行事件处理。
例如脚本receiver.js的内容如下:
//监听say事件 events.on("say", function(words){ toastLog(words); }); //保持脚本运行 setInterval(()=>{}, 1000);
同一目录另一脚本可以启动他并发送该事件:
//运行脚本 var e = engines.execScriptFile("./receiver.js"); //等待脚本启动 sleep(2000); //向该脚本发送事件 e.getEngine().emit("say", "你好");
脚本引擎 engines.execScriptFile
demo.js
var args = engines.myEngine().execArgv; let who = args.who; toastLog(who);
启动demo.js并且带上参数
engines.execScriptFile("demo.js", { arguments: { who: "yashu" } });
安卓广播
注册广播
let receiver = new JavaAdapter(android.content.BroadcastReceiver, { onReceive: function (context, intent) { log(intent); switch (intent.action) { case Intent.ACTION_BATTERY_CHANGED: log("ACTION_BATTERY_CHANGED"); let level = intent.getIntExtra("level", 0); toastLog("当前电量:" + level + "%"); break; case "android.intent.action.yashu": toastLog("牙叔自定义广播"); let value = intent.getStringExtra("author"); log("接收到数据 author: " + value); break; } }, }); context.registerReceiver(receiver, filter);
发送广播
app.sendBroadcast({ action: action, extras: { author: "yashu", }, });
http
get
console.show(); var r = http.get("www.baidu.com"); log("code = " + r.statusCode); log("html = " + r.body.string());
post
一个模拟表单提交登录淘宝的例子如下:
var url = "https://login.taobao.com/member/login.jhtml"; var username = "你的用户名"; var password = "你的密码"; var res = http.post(url, { "TPL_username": username, "TPL_password": password }); var html = res.body.string(); if(html.contains("页面跳转中")){ toast("登录成功"); }else{ toast("登录失败"); }