背景:我想从电脑端发送一个网络请求控制autojs执行某段代码,于是我想到了可以用autojs搭建一个http服务,然后在电脑端发送get请求来让autojs开始执行某段代码,然鹅,autojs并没有搭建http服务的教程,然后我想到了可以通过nodejs或者java代码来实现,于是就有了下面的教程:
想通过autojs搭建http服务的话,思路有两种:
1、使用autojs的v8、v9版本,通过nodejs来实现,在这里不做讨论,感兴趣的同学可以查看相关资料;
2、使用java的ServerSocket功能来实现,如下所示:
importClass(java.io.BufferedReader);
importClass(java.io.BufferedWriter);
importClass(java.io.IOException);
importClass(java.io.InputStreamReader);
importClass(java.io.OutputStreamWriter);
importClass(java.net.ServerSocket);
importClass(java.net.Socket);
importClass(java.nio.ByteBuffer);
importClass(java.io.PrintWriter);
// 字符串转bytes
function strToUtf8Bytes(str) {
const utf8 = [];
for (let ii = 0; ii < str.length; ii++) {
let charCode = str.charCodeAt(ii);
if (charCode < 0x80) utf8.push(charCode);
else if (charCode < 0x800) {
utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
} else if (charCode < 0xd800 || charCode >= 0xe000) {
utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
} else {
ii++;
// Surrogate pair:
// UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and
// splitting the 20 bits of 0x0-0xFFFFF into two halves
charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
utf8.push(
0xf0 | (charCode >> 18),
0x80 | ((charCode >> 12) & 0x3f),
0x80 | ((charCode >> 6) & 0x3f),
0x80 | (charCode & 0x3f),
);
}
}
//兼容汉字,ASCII码表最大的值为127,大于127的值为特殊字符
for (let jj = 0; jj < utf8.length; jj++) {
var code = utf8[jj];
if (code > 127) {
utf8[jj] = code - 256;
}
}
return utf8;
}
var server;
// 退出时结束服务
events.on('exit', () => {
if (server && server.close) {
server.close();
}
});
try {
server = new ServerSocket(9000); // 9000为端口号
while (true) {
console.log("启动服务器....");
var socket = server.accept();
var is = socket.getInputStream();
is.read(util.java.array('byte', 2048));
var os = socket.getOutputStream();
os.write(strToUtf8Bytes("HTTP/1.1 200 OK\r\n"));
os.write(strToUtf8Bytes("Content-Type:text/html;charset=utf-8\r\n"));
os.write(strToUtf8Bytes("Content-Length:38\r\n"));
os.write(strToUtf8Bytes("Server:gybs\r\n"));
os.write(strToUtf8Bytes(("Date:"+new Date()+"\r\n")));
os.write(strToUtf8Bytes("\r\n"));
os.write(strToUtf8Bytes("<h1>hello!</h1>"));
os.write(strToUtf8Bytes("<h3>HTTP服务器!</h3>"));
os.close();
socket.close();
toastLog("请求已响应");
// 此处放置接收到http请求时需要执行的代码
}
if (server && server.close) {
server.close();
}
} catch (e) {
console.log("error:", e);
if (server && server.close) {
server.close();
}
}
这样访问 http://127.0.0.1:9000 或者内网IP,就可以愉快的在内网中从不同的设备发送网络请求(Get请求之类的)到autojs的脚本中来了,同时还可以基于入参及请求方式做其他扩展,这里就不一一展示了;若想从外网发送请求到手机的autojs脚本,则还需要将手机的网络做内网穿透。
注意:有时程序或脚本关闭时,ServerSocket的服务可能还没结束,可能会报端口被占用,需要杀掉进程。