API调用
361一键新机 除了简洁人性化的UI体验之外,也提供脚本调用的使用方式。开发者可以使用Lua语言,在触动精灵的平台上,通过http方式调用本设备上的361一键新机的核心功能。本文列出了基本的调用接口和示例。
我们推荐使用Lua语言的方式来调用。但我们同时也支持OpenUrl的调用方式,使用非常简单,将以下指令中的"http://127.0.0.1:361/"替换成"361://"即可。同时,其返回值将会自动写入到/var/mobile/cmdResultOpenUrl.plist文件。
启动 361一键新机:
runApp("cn.tinyapps.RST");
mSleep(5*1000); //等待5秒钟再进行后续调用
1、一键新机
- 指令:http://127.0.0.1:361/cmd?fun=newDevice&bid=com.xxx.a,cn.yyy.b
- 参数:
- fun=newDevice表示一键新机
- bid表示目标App,如果是多个的话,用逗号分隔
- 返回值:status=-1表示无权限;status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
- 请注意:该接口是异步操作,调用该接口后得到返回值只说明接口调用是否成功,不意味着对应操作已执行结束。要判断是否真正执行结束,可以检测该文件 /var/mobile/script_status 是否存在:不存在说明执行尚未结束,存在说明执行结束。存在的话可以通过判断文件中的值来确定是否执行成功,如果文件中的值是1,则代表执行成功,为0代表执行失败。
2、生成备份记录
- 指令:http://127.0.0.1:361/cmd?fun=newBackup&bid=com.xxx.a
- 参数:
- fun=newBackup表示生成备份记录
- bid表示目标App,如果是多个的话,用逗号分隔
- 返回值:status=-1表示无权限;status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
- 请注意:该接口是异步操作,调用该接口后得到返回值只说明接口调用是否成功,不意味着对应操作已执行结束。要判断是否真正执行结束,可以检测该文件 /var/mobile/script_status 是否存在:不存在说明执行尚未结束,存在说明执行结束。存在的话可以通过判断文件中的值来确定是否执行成功,如果文件中的值是1,则代表执行成功,为0代表执行失败。
3、获取备份记录
- 指令:http://127.0.0.1:361/cmd?fun=getBackups&bid=com.xxx.a
- 参数:
- fun=getBackups表示获取备份记录
- bid表示目标App,如果是多个的话,用逗号分隔
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
- 如果status为1,则可以通过backups获取到其备份记录信息,通过currentBackupId获取到与当前的目标app相关联的备份记录在backups中的序列号
- backups是一个数组,其中每一个元素是个dictionary,其中有3个key,name表示备份的名字,time表示备份的时间
- 返回值示例:
{status:1, backups:{[ {name:'backup0001', time:1463637809}, {name:'backup0002', time:1463647909}]}, currentBackupId:0}
4、重命名备份记录
- 指令A:http://127.0.0.1:361/cmd? fun=renameBackup &bid=PumpkinCat.WordBlades &index=3&name=goodname
- 指令B:http://127.0.0.1:361/cmd? fun=renameBackup &bid=PumpkinCat.WordBlades &indexup=1&name=goodname
- 指令C:http://127.0.0.1:361/cmd? fun=renameBackup &bid=PumpkinCat.WordBlades &backname=老名字&name=goodname
- 指令D:http://127.0.0.1:361/cmd? fun=renameBackup &bid=PumpkinCat.WordBlades
- 参数:
- fun=renameBackup表示重命名单条备份记录
- bid表示目标App,如果是多个的话,用逗号分隔
- index表示备份记录的序列号,序列号即备份记录从上到下排序的序号,与361一键新机界面上一致,从上到下依次为0, 1, 2, 3, 4, 5, ....,也可以认为备份条目的行号
- indexup取0或者1,以与目标app相关联的备份的index为基准,对其上一条或下一条备份记录改名,为1表示上一条,为0表示下一条。
- backname表示要操作的目标备份记录的名字(index、indexup、backname三项只需其中一项;三者优先顺序 index>indexup>backname:提供了index的话,则自动忽略indexup和backname的值;只提供indexup和backname的值的话,则忽略backname的值)
- 如果不提供index、indexup、backname参数,则默认为对当前的备份条目操作(即指令D)
- name表示备份记录的新名字
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
5、删除指定备份记录
- 指令A:http://127.0.0.1:361/cmd? fun=deleteBackup &bid=PumpkinCat.WordBlades &index=3
- 指令B:http://127.0.0.1:361/cmd? fun=deleteBackup &bid=PumpkinCat.WordBlades &indexup=0
- 指令C:http://127.0.0.1:361/cmd? fun=deleteBackup &bid=PumpkinCat.WordBlades &backname=老名字
- 指令D:http://127.0.0.1:361/cmd? fun=deleteBackup &bid=PumpkinCat.WordBlades
- 参数:
- fun=deleteBackup表示删除指定的备份记录
- bid表示目标App,如果是多个的话,用逗号分隔
- index表示备份记录的序列号,序列号即备份记录从上到下排序的序号,与361一键新机界面上一致,从上到下依次为0, 1, 2, 3, 4, 5, ....,也即备份条目的行号。为-1则表示删除对应app的所有记录
- indexup取0或者1,以与目标app相关联的备份的index为基准,删除其上一条或下一条备份记录,为1表示上一条,为0表示下一条。
- backname表示要操作的目标备份记录的名字(index、indexup、backname三项只需其中一项;三者优先顺序 index>indexup>backname:提供了index的话,则自动忽略indexup和backname的值;只提供indexup和backname的值的话,则忽略backname的值)
- 如果不提供index、indexup、backname参数,则默认为删除当前的备份条目(即指令D)
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
6、还原备份记录
- 指令A:http://127.0.0.1:361/cmd? fun=restoreBackup &bid=PumpkinCat.WordBlades &index=3
- 指令B:http://127.0.0.1:361/cmd? fun=restoreBackup &bid=PumpkinCat.WordBlades &indexup=1
- 指令C:http://127.0.0.1:361/cmd? fun=restoreBackup &bid=PumpkinCat.WordBlades &backname=老名字
- 参数:
- fun=restoreBackup表示还原备份记录
- bid表示目标App,如果是多个的话,用逗号分隔
- index表示备份记录的序列号,序列号即备份记录从上到下排序的序号,与361一键新机界面上一致,从上到下依次为0, 1, 2, 3, 4, 5, ....,也即备份条目的行号。
- indexup取0或者1,以与目标app相关联的备份的index为基准,恢复到其上一条或下一条备份记录,为1表示上一条,为0表示下一条。
- backname表示要操作的目标备份记录的名字(index、indexup、backname三项只需其中一项;三者优先顺序 index>indexup>backname:提供了index的话,则自动忽略indexup和backname的值;只提供indexup和backname的值的话,则忽略backname的值)
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
- 请注意:该接口是异步操作,调用该接口后得到返回值只说明接口调用是否成功,不意味着对应操作已执行结束。要判断是否真正执行结束,可以检测该文件 /var/mobile/script_status 是否存在:不存在说明执行尚未结束,存在说明执行结束。存在的话可以通过判断文件中的值来确定是否执行成功,如果文件中的值是1,则代表执行成功,为0代表执行失败。
7、获取虚拟设备信息
- 指令:http://127.0.0.1:361/cmd? fun=getCurrentVDInfo &bid=PumpkinCat.WordBlades
- 参数:
- fun=getCurrentVDInfo表示获取虚拟设备信息
- bid表示某个目标App,或同一组里的多个目标app,用逗号分隔
- 返回值:status=1 运行成功,返回idfa、idfv、ios版本,ssid、imie、udid等其他虚拟设备信息; status=0运行失败(可以通过errMsg获取错误信息)
- 返回值示例:
{status:1, info:[{idfa:'89B0A172-57C2-46E6-BB1D-0D250C270EB2'}, {ios:'12.1.1'}] }
8、设置虚拟设备信息IDFA
- 指令:http://127.0.0.1:361/cmd? fun=setCurrentVDInfo &bid=PumpkinCat.WordBlades &idfa=89B0A172-57C2-46E6-BB1D-0D250C270EB2
- 参数:
- fun=setCurrentVDInfo表示获取虚拟设备信息,对应的目标app必须已经具有虚拟设备信息才行,如果app对应的环境是真实机器,则执行此指令无效
- bid表示某个目标App,或同一组里的多个目标app,用逗号分隔
- idfa表示新设置的idfa
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
9、获取机器码权限信息
- 指令:http://127.0.0.1:361/cmd?fun=license
- 参数:fun=license表示获取权限
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息) 如果status=1,则可以通过deviceId获取到机器码,endDate获取到有效截止时间
10、开关自动备份/App自动启动/自动更换IP
- 指令:http://127.0.0.1:361/cmd?fun=autoBackup&open=1
- 参数:
- fun=autoBackup表示开关自动备份指令;fun=autoAppLaunch表示App自动启动;fun=autoIP表示自动更换IP
- open=1表示开启,为0表示关闭
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
11、卸载指定App
- 指令:http://127.0.0.1:361/cmd? fun=uninstallApp &bid=PumpkinCat.WordBlades
- 参数:
- fun=uninstallApp表示卸载app
- bid表示目标App,如果是多个的话,用逗号分隔
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
12、跳转到指定App
- 指令:http://127.0.0.1:361/cmd? fun=goToApp &bid=PumpkinCat.WordBlades
- 参数:
- fun=goToApp表示卸载app
- bid表示目标App,只能是一个
- 返回值:status=1 运行成功; status=0运行失败(可以通过errMsg获取错误信息)
13、示例
function getLicenseInfo()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=license");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
local deviceId = resJson.deviceId;
local endDateTimestamp = resJson.endDate;
local endDate = os.date("%Y:%m:%d %H:%M",endDateTimestamp)
dialog("deviceId: ".. deviceId .." endDate " .. endDate, 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function enableAutoBackup()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=autoBackup&open=1");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("成功开启自动备份", 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function newDevice()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=newDevice&bid=PumpkinCat.WordBladesf");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("一键新机成功!", 2);
end;
if status == -1 then
local errMsg = resJson.errMsg;
dialog("error: ", 2);
end
if status == 0 then
local errMsg = resJson.errMsg;
dialog("err:"..errMsg, 2);
end
end
end
function getBackups()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=getBackups&bid=PumpkinCat.WordBlades");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
local backups = resJson.backups;
local backupNames="";
for i=1, #(backups) do
local name = backups[i].name;
backupNames = backupNames..name..", ";
end
dialog("backups: " .. backupNames, 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function renameBackup()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=renameBackup&bid=PumpkinCat.WordBlades&index=43&name=godname");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("重命名成功! ", 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function deleteBackup()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=deleteBackup&bid=PumpkinCat.WordBlades&index=2");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("删除备份成功! ", 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function restoreBackup()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=restoreBackup&bid=PumpkinCat.WordBlades&index=2");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("还原成功! ", 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function getVDInfo()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=getCurrentVDInfo&bid=com.tencent.mqq");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("成功! "..resJson.VDInfo, 8);
end
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function setVDInfo()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=setCurrentVDInfo&bid=com.tencent.mqq&idfa=89B0A172-57C2-46E6-BB1D-0D250C270EB2");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("IDFA设置成功! ", 8);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
function uninstallApp()
local sz = require("sz");
local http = require("szocket.http");
local res, code = http.request("http://127.0.0.1:361/cmd?fun=uninstallApp&bid=PumpkinCat.WordBlades");
if code == 200 then
local resJson = sz.json.decode(res);
local status = resJson.status;
if status == 1 then
dialog("删除App成功! ", 2);
end;
if status == 0 then
local errMsg = resJson.errMsg;
dialog("error: ".. errMsg, 2);
end
end
end
r = runApp("cn.tinyapps.RST");
mSleep(5*1000);
if r == 0 then
closeApp("com.apple.weather"); --退出天气应用,使用此函数后在后台仍可看到应用程序图标属正常现象,实际进程已不在后台
else
dialog("启动失败"..r, 3);
end
newDevice();