前言

AutoX.js 使用的是 Rhino 作为 JavaScript 引擎,并不支持完整的 nodejs 模块,所以没法直接调用 nodejs 下的 OSS 包。

下面展示使用 OSS Android SDK 完成上传的过程

准备工作

  1. 前往 OSS Android SDK,下载依赖包

  2. aar 格式的 SDK 转换为 dex

这里使用 Android Studio 提供的工具 d8,进入到 Android Studio 安装目录下,d8 一般在 build-tools 下,MacOS 下为 ~/Library/Android/sdk/build-tools/{version}/

./d8 --release --output output_folder oss-android-sdk-2.9.13.aar

会生成一个 classes.dex 的文件

  1. 拷贝 classes.dex 到手机

截图

// 安卓版本高于 Android 9,需要手动确认授权
if (device.sdkInt > 28) {
    // 等待截屏权限申请并同意
    threads.start(function () {
        // 这里的系统提示框可能不是运行,改成对应文本即可
        packageName("com.android.systemui").text("运行").waitFor();
        text("运行").click();
    });
}

// 申请截屏权限,false 竖屏
if (!requestScreenCapture(false)) {
    console.error("请求截图失败");
    exit();
}

// 获取到截图
var image = images.captureScreen();

上传

这里使用了字节数组的方式上传,也可以保存到本地,再上传

// 使用绝对路径导入 SDK
var dexPath = files.path("/storage/emulated/0/Download/classes.dex");
runtime.loadDex(dexPath);

// 导入 OSS 中的类
importClass(com.alibaba.sdk.android.oss.ClientConfiguration);
importClass(com.alibaba.sdk.android.oss.ClientException);
importClass(com.alibaba.sdk.android.oss.OSS);
importClass(com.alibaba.sdk.android.oss.OSSClient);
importClass(com.alibaba.sdk.android.oss.ServiceException);
importClass(com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider);
importClass(
    com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider
);
importClass(com.alibaba.sdk.android.oss.model.PutObjectRequest);
importClass(com.alibaba.sdk.android.oss.model.PutObjectResult);

// 下面的参数是在阿里云生成
var OSS_ENDPOINT = "yourEndpoint";
var OSS_ACCESS_KEY_ID = "yourAccessKeyId";
var OSS_ACCESS_KEY_SECRET = "yourAccessKeySecret";
var bucketName = "yourBucket";

var credentialProvider = new OSSStsTokenCredentialProvider(
    OSS_ACCESS_KEY_ID,
    OSS_ACCESS_KEY_SECRET,
    ""
);

// OSSClient 的配置类
var conf = new ClientConfiguration();
conf.setConnectionTimeout(60000); // 建立连接的超时时间,单位为毫秒。默认为60000毫秒
conf.setSocketTimeout(60000); // Socket层传输数据的超时时间,单位为毫秒。默认为60000毫秒
conf.setMaxConcurrentRequest(5); // 最大并发数。默认为5
conf.setMaxErrorRetry(2); // 请求失败后最大的重试次数。默认2次

var oss = new OSSClient(context, OSS_ENDPOINT, credentialProvider, conf);

// 文件名
var filename = "screenshot.jpg";

// 使用字节数组上传
var imageBytes = images.toBytes(image, "jpg", 100);

var put = new PutObjectRequest(bucketName, filename, imageBytes);

putResult = oss.putObject(put);

// 上传后的链接
var ossUrl = `https://${bucketName}.${OSS_ENDPOINT}/${filename}`;

// 上传成功
if (putResult.getStatusCode() === 200) {
    console.log(ossUrl);
}

参考链接