从Pro 7.0 版本以后Autojs接入了Shizuku的授权功能,该功能需要手机连接电脑后,在电脑上使用adb命令来激活Shizuku,再在Shizuku上授权AutojsPro.授权的好处是:可以通过adb权限调用原本需要root权限才能使用的系统api.例如Tap Swipe等函数可以免root执行.可以调用shell命令切换飞行模式,杀死app的后台进程,清理app的应用数据,可以使用shell直接启动intent,实现类似冰箱/黑域app那样的功能等等...当然弊端就是每次重启后授权消失,需要重新激活!
https://www.coolapk.com/apk/moe.shizuku.privileged.api
关于Shizuku的激活方法,在该app内有使用教程,需要会使用adb命令.
检查权限
permission
{string}
目前该参数只有两个值 "root"或者"adb"
该方法返回一个Bool值
例:
var isRoot = $shell.checkAccess("root");
if (isRoot) {
toastLog("autojs已经获取到root权限");
}
设置shell的运行模式
option
{object}
设置shell以什么权限执行命令 提供adb方式和root方式执行
{adb : true}
或者 {root : true}
var isAdb = $shell.checkAccess("adb");
if (!isAdb) {
alert("请先使用Shizuku授权,再运行");
exit();
}
$shell.setDefaultOptions({adb : true}); //将shell切换到adb模式
$shell("am force-stop com.tencent.mobileqq"); //使用adb权限杀掉QQ的进程,直接关闭QQ
先看一下root权限的代码:
var friendQQ = "289986635"; //你好友的QQ号码
app.startActivity({
packageName : "com.tencent.mobileqq",
className : "com.tencent.mobileqq.activity.qwallet.SendHbActivity",
extras : {
extra_data : '{"recv_type":1,"recv_uin":'+ friendQQ +',"channel":1,"bus_type":"1"}',
},
root : true //需要root权限才能执行
});
然后再来看一下使用adb权限如何使用
var isAdb = $shell.checkAccess("adb");
if (!isAdb) {
alert("请先使用Shizuku授权,再运行");
exit();
}
$shell.setDefaultOptions({adb : true}); //将shell切换到adb模式
var option = {
packageName : "com.tencent.mobileqq",
className : "com.tencent.mobileqq.activity.qwallet.SendHbActivity",
extras : {
extra_data : '{"recv_type":1,"recv_uin":'+ friendQQ +',"channel":1,"bus_type":"1"}',
}
}
$shell("am start " + app.intentToShell(option));
示例2中root权限下的代码和adb权限下的代码效果相同.
在adb模式下内置的Tap、Swipe、RootAutomator将使用adb权限
对应方法的使用请参照官方文档RootAutomator部分
https://hyb1996.github.io/AutoJs-Docs/#/coordinatesBasedAutomation?id=rootautomator
原Shell部分的命令使用请参照Shell部分的文档
https://hyb1996.github.io/AutoJs-Docs/#/shell?id=附录-shell命令简介
切换回root模式
$shell.setDefaultOptions({root : true});
以指定的权限执行shell命令
cmd
{string}
要执行的shell命令
option
{object}
使用何种权限执行 例如: {adb : true}
或者 {root : true}
例:
$shell("pm clear com.tencent.mobileqq", {adb : true}); //以adb权限清空QQ的数据文件
判断当前设备是否root
返回一个Bool值
例:
var isRoot = $shell.isRootAvailable();
if (isRoot) {
toastLog("当前设备已经root");
}
字符串的base64加密与解密
将字符串进行base64加密
str
{string}
要加密的字符串
例:
var str = "Hello Autojs";
var encode = $base64.encode(str);
console.log(encode);
将base64数据解密成字符串
str
{string}
base64加密后的字符串
例:
var str = "Hello Autojs";
var encode = $base64.encode(str);
var decode = $base64.decode(encode);
console.log(decode);
新增的一些加密算法, 支持MD5, SHA, AES, RSA等...
MD5和SHA的不可逆加密
message
{string}
要加密的字符串
algorithm
{string}
加密方式
options
{object}
确定输入或者输入的数据类型
input
{string}
输入的数据类型,"string"
[默认]或"file"
, 若输入的类型是文件时,此选项必填
output
{string}
输出的数据类型,"string"
[默认]或"base64"
例1:
// 字符串消息摘要
let message = "Hello, Auto.js Pro 7.0.4";
// 输出各种消息摘要算法结果的hex值
log("字符串: ", message);
log("MD5: ", $crypto.digest(message, "MD5"));
log("SHA1: ", $crypto.digest(message, "SHA-1"));
log("SHA256: ", $crypto.digest(message, "SHA-256"));
// 输出各种消息摘要算法结果的base64值
log("MD5 [base64]: ", $crypto.digest(message, "MD5", {output: 'base64'}));
log("SHA1 [base64]: ", $crypto.digest(message, "SHA-1", {output: 'base64'}));
log("SHA256 [base64]: ", $crypto.digest(message, "SHA-256", {output: 'base64'}));
例2:
// 文件消息摘要
let file = "/sdcard/脚本/_test_for_message_digest.js"
// 写入文件内容,提供为后续计算MD5等
$files.write(file, "Test!");
log("文件: ", file);
log("MD5: ", $crypto.digest(file, "MD5", {input: 'file'}));
log("SHA1: ", $crypto.digest(file, "SHA-1", {input: 'file'}));
log("SHA256: ", $crypto.digest(file, "SHA-256", {input: 'file'}));
获取有一个AES秘钥, 由于AES等算法要求是16位的倍数,所以key值的字符串长度应为 16或32或48或64...等等
key
{string}
字符串秘钥
例:
let key = new $crypto.Key("password12345678"); //秘钥长度16位
log("密钥: ", key);
生成RSA密钥对
algorithm
{string}
加密方式
length
{int}
密钥长度 默认为256位,但目前长度小于1024的已被证明不安全
例:
let keyPair = $crypto.generateKeyPair("RSA");
log("密钥对: ", keyPair);
data
{string}
要加密的数据
key
{object}
秘钥
algorithm
{string}
加密方式
AES加密:"AES/ECB/PKCS5padding"
RSA加密:"RSA/ECB/PKCS1padding"
options
{object}
确定数据的输入/输出类型
input
{string}
输入的数据类型,"string"
[默认]或"file"
, 若输入的类型是文件时,此选项必填
output
{string}
输出的数据类型,"string"
[默认]或"base64"
例1: AES加密 对字符串的加密
let message = "未加密字符串";
log("明文: ", message);
// 密钥,由于AES等算法要求是16位的倍数,我们这里用一个16位的密钥
let key = new $crypto.Key("password12345678");
log("密钥: ", key);
// AES加密
let aes = $crypto.encrypt(file, key, "AES/ECB/PKCS5padding");
log("AES加密后二进制数据: ", aes);
log("AES解密: ", $crypto.decrypt(aes, key, "AES/ECB/PKCS5padding", {output: 'string'}));
例2: AES加密 对一个文件加密
// 文件消息摘要
let file = "/sdcard/脚本/_test_for_message_digest.js"
// 写入文件内容,提供为后续计算MD5等
$files.write(file, "Test!");
// 密钥,由于AES等算法要求是16位的倍数,我们这里用一个16位的密钥
let key = new $crypto.Key("password12345678");
log("密钥: ", key);
// AES加密
let aes = $crypto.encrypt(file, key, "AES/ECB/PKCS5padding",{input: 'file'});
log("AES加密后二进制数据: ", aes);
log("AES解密: ", $crypto.decrypt(aes, key, "AES/ECB/PKCS5padding", {output: 'string'}));
例3: RSA加密
let message = "未加密字符串";
log("明文: ", message);
// 生成RSA密钥
let keyPair = $crypto.generateKeyPair("RSA");
log("密钥对: ", keyPair);
// 使用私钥加密
let rsa = $crypto.encrypt(message, keyPair.privateKey, "RSA/ECB/PKCS1padding");
log("RSA私钥加密后二进制数据: ", rsa);
// 使用公钥解密
log("RSA公钥解密: ", $crypto.decrypt(rsa, keyPair.publicKey, "RSA/ECB/PKCS1padding", {output: 'string'}));
发布一个通知,用法未知
压缩一个文件夹
dir
{string}
文件夹路径
zipFile
{string}
压缩后zip文件的路径
options
{boject}
压缩选项, 已知参数 password
例1:
// 要压缩的文件夹路径
let dir = '/sdcard/脚本/zip_test/';
// 压缩后的文件路径
let zipFile = '/sdcard/脚本/zip_out/未加密.zip';
$files.remove(zipFile);
$zip.zipDir(dir, zipFile);
例2:
// 加密压缩文件夹
let encryptedZipFile = '/sdcard/脚本/zip_out/加密.zip';
$files.remove(encryptedZipFile);
$zip.zipDir(dir, encryptedZipFile, {
password: 'Auto.js Pro'
});
压缩一个文件
dir
{string}
文件路径
zipFile
{string}
压缩后zip文件的路径
options
{boject}
压缩选项, 已知参数 password
例:
let zipSingleFie = '/sdcard/脚本/zip_out/单文件.zip'
$files.remove(zipSingleFie);
$zip.zipFile('/sdcard/脚本/zip_test/1.txt', zipSingleFie);
压缩多个文件
fileList
{Array}
文件列表数组
zipMultiFile
{string}
压缩后zip文件的路径
options
{boject}
压缩选项, 已知参数 password
例:
// 压缩多个文件
let zipMultiFile = '/sdcard/脚本/zip_out/多文件.zip';
$files.remove(zipMultiFile);
let fileList = ['/sdcard/脚本/zip_test/1.txt', '/sdcard/脚本/zip_test/2.txt']
$zip.zipFiles(fileList, zipMultiFile);
解压一个zip文件
zipFile
{string}
zip文件的路径
dir
{string}
解压后存放的位置
options
{boject}
压缩选项, 已知参数 password
例1:
$zip.unzip('/sdcard/脚本/zip_out/未加密.zip', '/sdcard/脚本/zip_out/未加密/');
例2:
$zip.unzip('/sdcard/脚本/zip_out/加密.zip', '/sdcard/脚本/zip_out/加密/', {
password: 'Auto.js Pro'
});
打开一个zip文件.返回一个ZipFile对象
在zip文件中删除一个文件
file
{string}
zip文件内部的文件
例:
$files.create("/sdcard/脚本/zip_test/");
$files.create("/sdcard/脚本/zip_out/");
$files.write("/sdcard/脚本/zip_test/1.txt", "Hello, World");
$files.write("/sdcard/脚本/zip_test/2.txt", "GoodBye, World");
$files.write("/sdcard/脚本/zip_test/3.txt", "Auto.js Pro");
let zipMultiFile = '/sdcard/脚本/zip_out/多文件.zip';
$files.remove(zipMultiFile);
let fileList = ['/sdcard/脚本/zip_test/1.txt', '/sdcard/脚本/zip_test/2.txt']
$zip.zipFiles(fileList, zipMultiFile, {
password : "123"
});
let z = $zip.open('/sdcard/脚本/zip_out/多文件.zip',{
password : "123"
});
z.removeFile('1.txt');
向zip压缩包中添加一个文件
file
{string}
要增加的文件路径
例:
let z = $zip.open('/sdcard/脚本/zip_out/多文件.zip',{
password : "123"
});
z.addFile('/sdcard/脚本/zip_test/3.txt');
获取当前已安装的所有app, 返回一个数组
单个元素内容如下:
AppInfo{label='支付宝', className='com.alipay.mobile.quinox.LauncherApplication', descriptionRes=0, enabled=true, flags=951598660, manageSpaceActivityName='null', nativeLibraryDir='/data/app/com.eg.android.AlipayGphone-2/lib/arm', permission='null', processName='com.eg.android.AlipayGphone', sharedLibraryFiles=null, sourceDir='/data/app/com.eg.android.AlipayGphone-2/base.apk', targetSdkVersion=28, taskAffinity='com.eg.android.AlipayGphone', theme=2131034112, uiOptions=0, uid=10142, icon=2130837513, labelRes=2131230737, logo=0, metaData=Bundle[mParcelledData.dataSize=7188], name='null', nonLocalizedLabel=null, packageName='com.eg.android.AlipayGphone'}
获取一个apk包的信息
apkPackageName
{string}
apk包的路径
例:
log(app.getApkInfo("/sdcard/QQ.apk"));
获取当前已安装的所有app包的信息
返回 0 | 90 | 270
0 : 手机竖直向上
90 : 手机向左旋转屏幕
270 : 手机向右旋转屏幕
返回 portrait | landscape
portrait:竖向
landscape:横向
此方法通过一个示例来演示使用方法
脚本说明:此脚本是一个监听QQ闪照的脚本,运行后会监听闪照文件的创建事件,当监听到以"_fp"为后缀的文件创建时,弹出alert弹窗
一个文件的创建可能会有多次create事件,所以弹窗会多次提醒...
示例:
var sdcardPath = files.getSdcardPath();
var CACHE_PATH = sdcardPath+"/tencent/MobileQQ/diskcache/";
var RESULT_PATH = sdcardPath+"/QQ闪照/";
if (!files.exists(RESULT_PATH)) {
files.ensureDir(RESULT_PATH);
}
let watcher = $files.observe(CACHE_PATH);
watcher.on("create", (path) =>{
if (path.substring(path.length-3) == "_fp") {
dialogs.confirm("Bingo!!!", "检测到一张QQ闪照,是否打开查看?", (value)=>{
if (!$files.exists(RESULT_PATH+path+".jpg")) {
$files.copy(CACHE_PATH+path, RESULT_PATH+path+".jpg");
}
if (value) {
app.viewFile(RESULT_PATH+path+".jpg");
} else {
toast("闪照已保存到: "+RESULT_PATH);
}
})
}
});