@miniknife
2020-03-17T11:45:39.000000Z
字数 15052
阅读 23780
已不更新,最新版请查看:http://helpdoc.touchsprite.com/dev_docs/2187/764.html
开发手册
为了进一步降低脚本开发者门槛,触动精灵 iOS 2.x 以上版本集成了苏泽的扩展库,提供了一系列实用函数供开发者使用。
苏泽库已停止维护,部分函数 bug 不再进行修复,请尽快将代码用 ts.so 高级扩展库代替。
苏泽扩展库(更新时间2016-5-17):sz.so
触动精灵 v2.0 及以上版本已集成,无需下载。
请在脚本开头插入 local sz = require("sz")
即可调用扩展库中所有函数。
函数名称:sz.json.encode、sz.json.decode
函数功能:json串编码、解码
脚本实例:
local sz = require("sz")--使用sz库前必须插入这一句
local json = sz.json--使用JSON 模块前必须插入这一句
local tb = {
["我"] = "苏泽",
["爱"] = "娜娜",
meme = {
isArray = true,
1,0,0,4,6,9,5,1,0,0,
},
nullvalue = null,
}
local jsonstring = json.encode(tb);
dialog(jsonstring, 0);
local tmp = json.decode(jsonstring);
dialog(tmp.meme[5], 0);
dialog(tostring(tmp.nullvalue), 0);
--unicode 转 utf8
local sz = require "sz"
local tmp = sz.json.totable([[{"toUTF8":"\u6211\u7231\u5a1c\u5a1c"}]])
dialog(tmp["toUTF8"],0)
注意事项:
在 JSON 格式的 ShowUI 时会用到 JSON 模块
函数名称:ftp.download、ftp.upload、ftp.cmd
函数功能:FTP 上传、FTP 下载、执行 FTP 命令
函数方法:
ftp = sz.ftp
ftp.download(ftppath, path)
ftp.upload(path, ftppath)
ftp.cmd(ftppath, cmd)
参数 | 类型 | 说明 |
---|---|---|
ftppath | string | 格式为 ftp://ftp 用户名:ftp密码@ftp服务器 IP 地址/文件名,文件名不可使用中文字符 |
path | string | 需填写完整路径 |
cmd | string | FTP 操作命令:DELE 删除,LIST 列出 |
脚本实例:
1. FTP 下载一个文件到本地
local sz = require("sz")--使用苏泽库前一定要在开头插入这一句
local ftp = sz.ftp--使用FTP 模块前一定要插入这一句
_, err = ftp.download("ftp://admin:ts123456@192.168.1.0/config.dat", "/var/mobile/Media/TouchSprite/config/config.dat")--文件名不可使用中文字符
if err then
dialog(err, 0)
else
dialog("文件已下载成功", 0)
end
local sz = require("sz")--使用苏泽库前一定要在开头插入这一句
local ftp = sz.ftp--使用FTP 模块前一定要插入这一句
_, err = ftp.upload("/var/mobile/Media/TouchSprite/lua/config.dat", "ftp://admin:ts123456@192.168.1.0/Games/")--文件名不可使用中文字符
if err then
dialog(err, 0)
else
dialog("文件已上传成功", 0)
end
local sz = require("sz")--使用苏泽库前一定要在开头插入这一句
local ftp = sz.ftp--使用FTP 模块前一定要插入这一句
_, err = ftp.cmd("ftp://admin:ts123456@192.168.1.0/Games/", "DELE config.dat")--文件名不可使用中文字符
if err then
dialog(err, 0)
else
dialog("文件删除成功", 0)
end
local sz = require("sz")--使用苏泽库前一定要在开头插入这一句
local ftp = sz.ftp--使用FTP 模块前一定要插入这一句
msg, err = ftp.cmd("ftp://admin:ts123456@192.168.1.0/Games/", "LIST")
if err then
dialog(err, 0)
else
dialog("文件列表\n"..msg, 0)
end
注意事项:
- 使用本模块时填写的文件路径中,文件名不能使用中文字符
- 文件路径必须填写完整路径
函数名称:sz.system.udid
函数功能:获取设备
函数方法
udid = sz.system.udid()
返回值:udid
返回值 | 类型 | 说明 |
---|---|---|
udid | string | 设备 UDID |
脚本实例:
local sz = require("sz")
udid = sz.system.udid() --获取设备的 UDID
dialog(udid, 0)
函数名称:sz.system.serialnumber
函数功能:获取设备序列号
函数方法
serialnumber = sz.system.serialnumber()
返回值:serialnumber
返回值 | 类型 | 说明 |
---|---|---|
serialnumber | string | 设备序列号 |
脚本实例:
local sz = require("sz")
serialnumber = sz.system.serialnumber()--获取设备的序列号
dialog(serialnumber, 0)
函数名称:sz.system.wifimac
函数功能:获取设备 WiFi MAC地址
函数方法
wifimac = sz.system.wifimac()
返回值:string wifimac
返回值 | 类型 | 说明 |
---|---|---|
wifimac | string | 设备 WiFi MAC 地址 |
脚本实例:
local sz = require("sz")
wifimac = sz.system.wifimac() --获取设备的 WiFi MAC 地址
dialog(wifimac, 0)
函数名称:sz.system.btmac
函数功能:获取设备蓝牙 MAC 地址
函数方法
btmac = sz.system.btmac()
返回值:string btmac
返回值 | 类型 | 说明 |
---|---|---|
btmac | string | 蓝牙 MAC 地址 |
脚本实例:
local sz = require("sz")
btmac = sz.system.btmac() --获取设备的蓝牙 MAC 地址
dialog(btmac, 0)
函数名称:sz.system.osversion
函数功能:获取设备系统版本号
函数方法
osversion = sz.system.osversion()
返回值:string osversion
返回值 | 类型 | 说明 |
---|---|---|
osversion | string | 设备系统版本号 |
脚本实例:
local sz = require("sz")
osversion = sz.system.osversion() --获取设备的系统版本号
dialog(osversion, 0)
函数名称:sz.system.mgcopyanswer("ProductType")
函数功能:获取设备详细型号
函数方法
producttype = sz.system.mgcopyanswer("ProductType")
返回值:string producttype
返回值 | 类型 | 说明 |
---|---|---|
producttype | string | 设备详细型号 |
脚本实例:
local sz = require("sz")
producttype = sz.system.mgcopyanswer("ProductType")--获取设备详细型号
dialog(producttype,0)
注意事项:
详细型号指的是 iPhone5,3
函数名称:sz.system.mgcopyanswer("UserAssignedDeviceName")
函数功能:获取设备名称
函数方法
devicename = sz.system.mgcopyanswer("UserAssignedDeviceName")
返回值:string devicename
返回值 | 类型 | 说明 |
---|---|---|
devicename | string | 设备名称 |
脚本实例:
local sz = require("sz")
devicename = sz.system.mgcopyanswer("UserAssignedDeviceName")--获取设备名称
dialog(devicename,0)
注意事项:
获取的设备名称是
设置-通用-关于本机-名称
处用户自己设置的名称。
函数名称:sz.system.mgcopyanswer("InternationalMobileEquipmentIdentity")
函数功能:获取设备 IMEI
函数方法
imei = sz.system.mgcopyanswer("InternationalMobileEquipmentIdentity")
返回值:string imei
返回值 | 类型 | 说明 |
---|---|---|
imei | string | 设备 IMEI |
脚本实例:
local sz = require("sz")
imei = sz.system.mgcopyanswer("InternationalMobileEquipmentIdentity") --获取设备 IMEI
dialog(imei,0)
函数名称:sz.system.localwifiaddr
函数功能:获取本地网络地址
脚本实例:
local sz = require("sz")
local ret = ""
for i,v in ipairs(sz.system.localwifiaddr()) do --获取本地网络地址
ret = ret..(v[1]).."="..(v[2]).."\n"
end
dialog(ret,0)
注意事项:
iOS 引擎版本 v2.1.9 以上版本中采用新版苏泽扩展库,sz.system.localwifiaddr() 将返回一个 TABLE,TABLE 中包含本地内部环回地址、蜂窝地址、本地 WiFi 地址。
函数名称:tohex、fromhex
函数功能:转码,字符串十六进制编码转换
脚本实例:
local sz = require("sz")
local str = "触动精灵"
dialog('"'..str..'" 的 16 进制编码为: <'..str:tohex()..'>', 0) --“触动精灵”的 16 进制编码
dialog('<'..str:tohex()..'> 转换成明文为: "'..str:tohex():fromhex()..'"', 0)--将上一行的 16 进制编码转换为明文字符
函数名称:md5
函数功能:字符串 MD5 计算
md5;
脚本实例:
local sz = require("sz")
local str = "触动精灵"
local binstr = "\0\1\2\3\4\5"
dialog('"'..str..'" 的 MD5 值是: '..str:md5(), 0)--计算"触动精灵"的 MD5 值
dialog('<'..binstr:tohex()..'> 的 MD5 值是: '..binstr:md5(), 0)--计算“000102030405”的 MD5 值
函数名称:sha1
函数功能:字符串 SHA1 计算
sha1;
脚本实例:
local sz = require("sz")
local str = "触动精灵"
local binstr = "\0\1\2\3\4\5"
dialog('"'..str..'" 的 SHA1 值是: '..str:sha1(), 0)--计算"触动精灵"的 SHA1 值
dialog('<'..binstr:tohex()..'> 的 SHA1 值是: '..binstr:sha1(), 0) --计算“000102030405”的 SHA1 值
函数名称:aes128_encrypt、aes128_decrypt、base64_encode、base64_decode
函数功能:字符串 AES128、BASE64 编解码
脚本实例:
local sz = require("sz")
local msg = "\5\4\3\2\1\0"
local key = "触动精灵"
local emsg = msg:aes128_encrypt(key)
local emsgb64 = emsg:base64_encode()
dialog('二进制数据<'..msg:tohex()..'> \n 使用 AES128 算法 密钥 "'..key..'" 加密 值是: <'..emsg:tohex()..'> \n base64 串为 "'..emsgb64..'"', 0)
local tmp = emsgb64:base64_decode()
msg = tmp:aes128_decrypt(key)
dialog('"'..emsgb64..'" base64 解码后的数据为 <'..tmp:tohex()..'> \n使用 AES128 算法 密钥 "'..key..'" 解密 值是: <'..msg:tohex()..'>', 0)
函数名称:split、rtrim、ltrim、trim、atrim
函数功能:字符串分割、过滤
脚本实例:
字符串分割及空白字符过滤
local sz = require("sz")
str = " 哈哈,he he,1,3,6 "
new = str:split(",") --将字符串str按照 `,` 分割并返回一个TABLE
dialog(new[2], 0)
dialog(str:rtrim(), 0) -- 结果 " 哈哈,he he,1,3,6" ,删除字符串尾部的空白字符
dialog(str:ltrim(), 0) -- 结果 "哈哈,he he,1,3,6 " ,删除字符串首部的空白字符
dialog(str:trim(), 0) -- 结果 "哈哈,he he,1,3,6" ,删除字符串首尾的空白字符
dialog(str:atrim(), 0) -- 结果 "哈哈,hehe,1,3,6" ,删除字符串所有的空白字符
名词解析:
空白字符包括:空格、制表符
\t
、换行符\n
、\r
。
函数名称:fromgbk
函数功能:转码,GBK 转 UTF8
脚本实例:
将字符串从 GBK 编码转换到 UTF8 编码(需iOS 引擎版本 v2.2.6 以上版本)
require "sz"
f = io.open("/var/mobile/Media/TouchSprite/res/a.txt", "r")
s = f:read("*a")
f:close()
dialog(s:fromgbk())
函数名称:iconv
函数功能:字符集转换
脚本实例:
--此功能需iOS 引擎版本 v2.2.7 以内置版本带的苏泽库支持方可使用
local sz = require("sz")
local iconv = sz.iconv
local cd = iconv.new("utf8", "gbk") --新建一个gbk到utf8编码的转换器
local f = io.open("/var/mobile/Media/TouchSprite/res/1.txt", "rb")
local s = f:read("*a")
f:close()
dialog(cd:iconv(s))
参数 | 类型 | 说明 |
---|---|---|
url | string | 请求URL (必须填写) |
time_out | number | 超时时间(秒) |
headers_send | string | 请求头部 json |
post_escaped | string | 请求内容 |
返回值 | 类型 | 说明 |
---|---|---|
status_resp | number | HTTP 状态码 |
headers_resp | string | 响应头部 json |
body_resp | string | 响应内容 |
脚本实例:
--采用 cjson 构造请求头部 json
local sz = require("sz")
local cjson = sz.json
local http = sz.i82.http
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'
headers['Referer'] = 'http://www.82flex.com'
headers_send = cjson.encode(headers)
dialog(headers_send,0)
status_resp, headers_resp, body_resp = http.get("http://82flex.com", 5, headers_send)
if status_resp ~= nil then
dialog(status_resp,0)
dialog(headers_resp,0)
if status_resp == 200 then
dialog(string.len(body_resp),0)
end
end
--采用 cjson 构造请求头部 json
local sz = require("sz")
local cjson = sz.json
local http = sz.i82.http
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'
headers['Referer'] = 'http://dev.touchsprite.com/site/login'
headers_send = cjson.encode(headers)
dialog(headers_send,0)
--采用 cjson 构造请求内容,并进行 escape
post = {}
post['username'] = "i_82"
post['password'] = '12345678'
post['text'] = '触动精灵'
post_send = cjson.encode(post)
dialog(post_send,0)
post_escaped = http.build_request(post_send)
dialog(post_escaped,0)
status_resp, headers_resp, body_resp = http.post("http://dev.touchsprite.com/site/login", 3, headers_send, post_escaped)
dialog(status_resp,0)
dialog(headers_resp,0)
if status_resp ~= nil then
dialog(status_resp,0)
dialog(headers_resp,0)
if status_resp == 200 then
dialog(string.len(body_resp),0)
end
--获取响应信息头部指定字段
--方法一
server = http.header(headers_resp, "Server")
dialog(server,0)
--方法二
servers = cjson.decode(headers_resp)
dialog(servers["Server"],0)
end
--用http.get实现下载文件功能
local sz = require("sz")
local cjson = sz.json
local http = sz.i82.http
function downFile(url, path)
status, headers, body = http.get(url)
if status == 200 then
file = io.open(path, "wb")
if file then
file:write(body)
file:close()
return status;
else
return -1;
end
else
return status;
end
end
downFile("http://www.touchsprite.com/img/headline-new.png", "/User/Media/TouchSprite/res/1.png")
脚本实例:
--读取键值
local sz = require("sz")
local plist = sz.plist
local plfilename = "/var/mobile/Library/Caches/com.apple.mobile.installation.plist" --设置plist路径
local tmp2 = plist.read(plfilename) --读取plist文件内容并返回一个TABLE
dialog(tmp2.Metadata.ProductBuildVersion, 0) --显示ProductBuildVersion的键值
--写入键值
local sz = require("sz")
local plist = sz.plist
local plfilename = "/var/mobile/Library/Caches/com.apple.mobile.installation.plist" --设置plist路径
local tmp2 = plist.read(plfilename) --读取plist文件内容并返回一个TABLE
tmp2["Metadata"]["ProductBuildVersion"] = "havonz" --将表中ProductBuildVersion键值改为havonz
plist.write(plfilename, tmp2) --将修改后的表写入PLIST文件
注意事项:
1.PLIST操作需要ts.so插件的支持,请下载ts.so后进行文件操作。
2. 实例代码仅做为参考,实际调试中请将文件路径替换为实际存在的文件路径。
3. 对于个别重要的 PLIST 文件,请谨慎使用写入功能或在运行脚本前进行备份。
4. 需要注意的是,nib 文件作为一种特殊的 plist 文件格式,不能被正确的读取。
函数名称:click
函数功能:单击
脚本实例:
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
p0:click() -- 单击点 p0
p0:click(100) -- 单击点 p0 按下 100 毫秒延迟 弹起
函数名称:dbclick
函数功能:双击
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
p0:dbclick(100, 200) -- 双击点 p0 按下 100毫秒延迟 弹起 延迟 200 毫秒 重复第一步
函数名称:touchMoveTo
函数功能:精确滑动
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
p0:touchMoveTo(p1, 2, 500, 1) -- 从点 p0 滑动到 p1 , 后面三个可选参数依次为:步长、弹起延迟、每步延迟
函数名称:angleBetween
函数功能:计算角度
脚本实例:
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
dialog(" p0 到 p1 的角度为: "..p0:angleBetween(p1), 0)
函数名称:distanceBetween
函数功能:计算距离
脚本实例:
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
dialog(" p0 到 p1 的距离为: "..p0:distanceBetween(p1), 0)
函数名称:polarProjection
函数功能:根据角度和距离找点
脚本实例:
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
dialog(" p0 往 30 度方向前进 200 距离单位的另一个点: "..tostring(p0:polarProjection(200, 30)), 0)
函数名称:cmpColor
函数功能:计算颜色相似度
脚本实例:
local sz = require("sz")
local pos = sz.pos
local p0 = pos(100, 150, 0x123456)
local p1 = pos(556, 400, 0x654321)
dialog("颜色 0x102030 与颜色 0x122232 的相似度为: "..pos.cmpColor( 0x102030, 0x122232), 0)
dialog("p0 结构的颜色与颜色 0x123456 相似度为: "..p0:cmpColor(0x123456), 0)
LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
注意事项:
帮你玩开发者平台禁用此函数库,打码请使用函数扩展库代替,详见[函数扩展库开发手册][59]
在触动精灵iOS v2.1.9 及以上版本中包含的苏泽扩展库中已经集成了luasocket,无需额外下载安装。
脚本示例:
local sz = require("sz")
local http = require("szocket.http")
local res, code = http.request("http://www.baidu.com");
if code == 200 then
dialog(res,0);
end
--也可以这样
local response_body = {}
local res, code = http.request({
url = "http://www.baidu.com",
sink = ltn12.sink.table(response_body)
})
--获取外网ip地址
local sz = require("sz")
local http = require("szocket.http")
local res, code = http.request("http://www.ip.cn/");--如果此网址无反应,请尝试替换为 http://1212.ip138.com/ic.asp 或其他网址
if code == 200 then
local i,j = string.find(res, "%d+%.%d+%.%d+%.%d+")
local ipaddr =string.sub(res,i,j)
dialog(ipaddr,0)
end
注意事项:
- 返回的2个参数中,res 是 http body 的内容,也就是请求网页的内容,code 是 http 状态码, 返回200的话就表示正常返回。
- 如果传入的是 table 的话,就需要用一个容器来接收 http body 的内容。
脚本示例:
local sz = require("sz")--此代码仅为举例说明,请勿直接复制使用。
local http = require("szocket.http")
local response_body = {}
local post_data = 'asd';
res, code = http.request{
url = "http://127.0.0.1/post.php",
method = "POST",
headers =
{
["Content-Type"] = "application/x-www-form-urlencoded",
["Content-Length"] = #post_data,
},
source = ltn12.source.string('data=' .. post_data),
sink = ltn12.sink.table(response_body)
}
注意事项:
- 这里注意记得 method 传入
POST
, 因为默认是 GET。- headers 参数,由一个 table 组成,key 为 header,value 为 header 内容。
- source 参数,这里是填入 POST 的参数,多个数据的情况用
&
隔开,例如 "data1=a&data2=b"。- 此代码仅为举例说明,请勿直接复制使用。
脚本示例:
--必须加上 http:// 否则不处理
local sz = require("sz")
local http = require("szocket.http")
http.PROXY = "http://127.0.0.1:8888" --代理服务器地址
local result = http.request("http://www.baidu.com")
dialog(result,0)
脚本示例:
local sz = require("sz")
local http = require("szocket.http")
local host = "www.baidu.com"
local file = "/"
local sock = assert(socket.connect(host, 80)) --创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
local chunk, status, partial = sock:receive(1024) --以 1K 的字节块接收数据
until status ~= "closed"
sock:close() -- 关闭 TCP 连接
脚本示例:
local sz = require("sz")
local smtp = require("szocket.smtp")
from = "<youmail@126.com>" -- 发件人
--发送列表
rcpt = {
"<youmail@126.com>",
"<youmail@qq.com>",
"<youmail@gmail.com>",
}
mesgt = {
headers = {
to = "youmail@gmail.com", -- 收件人
cc = '<youmail@gmail.com>', -- 抄送
subject = "This is Mail Title"
},
body = "这里放邮件内容"
}
r, e = smtp.send{
server = "smtp.126.com", --smtp服务器地址
user = "youmail@126.com",--smtp验证用户名
password = "******", --smtp验证密码
from = from,
rcpt = rcpt,
source = smtp.message(mesgt)
}
if not r then
dialog(e,0)
else
dialog("发送成功!",0)
end
脚本示例:
local sz = require("sz")
local socket = require "szocket.core"
server_ip = {
"132.163.4.101",
"132.163.4.102",
"132.163.4.103",
"128.138.140.44",
"192.43.244.18",
"131.107.1.10",
"66.243.43.21",
"216.200.93.8",
"208.184.49.9",
"207.126.98.204",
"207.200.81.113",
"205.188.185.33"
}
function nstol(str)
assert(str and #str == 4)
local t = {str:byte(1,-1)}
local n = 0
for k = 1, #t do
n= n*256 + t[k]
end
return n
end
function gettime(ip)
local tcp = socket.tcp()
tcp:settimeout(10)
tcp:connect(ip, 37)
success, time = pcall(nstol, tcp:receive(4))
tcp:close()
return success and time or nil
end
function nettime()
for _, ip in pairs(server_ip) do
time = gettime(ip)
if time then
return time
end
end
end
dialog(nettime(),0)
脚本示例:
local sz = require("sz")
local socket = require ("szocket")
function sleep(sec)
socket.select(nil,nil,sec);
end
local t0 = socket.gettime()
sleep(0.4);
local t1 = socket.gettime()
dialog(t1 - t0,0)
脚本示例:
1. 设置随机种子
--设置随机种子
local sz = require("sz")
local socket = require("szocket") -- 需要用到luasocket库
local function get_seed()
local t = string.format("%f", socket.gettime())
local st = string.sub(t, string.find(t, "%.") + 1, -1)
return tonumber(string.reverse(st))
end
math.randomseed(get_seed())
for var = 1,5 do
nLog(math.random())
end
--随机字符串
function randomStr(str, num)
local ret =''
for i = 1, num do
local rchr = math.random(1, string.len(str))
ret = ret .. string.sub(str, rchr, rchr)
end
return ret
end
--用法
for var = 1,5 do
s = randomStr("abcdefghijklmnopqrstuvwxyz", 6) --生成6位随机字母
nLog(s)
end
--随机大小写
function rndLetter(num)
local ret = ""
pcall(function()
for var = 1,num do
if math.random()>0.5 then
ret = ret..string.char(math.random(65,90))
else
ret = ret..string.char(math.random(97,122))
end
end
end)
return ret
end
--用法
math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))) --设置随机种子
for var = 1,5 do
nLog(rndLetter(10)) --生成一个10位随机大小写字母的字符串
end