----------------------------------------------------------------------
--请关注 接口函数区 三个函数 (1)查询信息 GetScore, (2)识别图片PostPic, (3)报错返分ReportError
----------------------------------------------------------------------
-------------------------------------------功能函数区-------------------------------------------
-- 读取文件
function ReadFile(path, isdel)
local iRet, sRet = pcall(function()
local f = io.open(path, "r")
if f == null then
return ""
end
local ret = f:read("*all")
f:close()
if isdel == true then
os.remove(path)
end
return ret
end)
if iRet == true then
return sRet
else
print(sRet)
return ""
end
end
function print(str)
LuaAuxLib.TracePrint(str)
end
--读取文件二进制
function ReadFileByte(file)
local f = io.open(file,"rb")
local retbyte = f:read("*all")
f:close()
return retbyte
end
--读取文件转换成base64编码
function ReadFileBase(path)
local iRet, sRet = pcall(function()
f = io.open(path,"rb")
if f == nil then
return nil
end
bytes = f:read("*all")
f:close()
local key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
return ((bytes:gsub('.', function(x)
local r,key='',x:byte()
for i=8,1,-1 do r=r..(key%2^i-key%2^(i-1)>0 and '1' or '0') end
return r;
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then return '' end
local c=0
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
return key:sub(c+1,c+1)
end)..({ '', '==', '=' })[#bytes%3+1])
end)
if iRet == true then
return sRet
else
return ""
end
end
--
---------------------------------- json解析 ----------------------------------
--
local json = {}
-- JSON 编码数据
function json.encode (v)
if v==nil then return "null" end
local vtype = type(v)
-- 字符串
if vtype=='string' then return '"' .. json_encodeString(v) .. '"' end
-- 数学、逻辑型
if vtype=='number' or vtype=='boolean' then return tostring(v) end
-- 表
if vtype=='table' then
local rval = {}
-- 判断表是否为数组
local bArray, maxCount = json_isArray(v)
if bArray then
for i = 1, maxCount do table.insert(rval, json.encode(v[i])) end
else
for i, j in pairs(v) do
if json_isEncodable(i) and json_isEncodable(j) then table.insert(rval, '"' .. json_encodeString(i) .. '":' .. json.encode(j)) end
end
end
if bArray then
return '[' .. table.concat(rval,',') ..']'
else
return '{' .. table.concat(rval,',') .. '}'
end
end
-- 函数型(不支持)
if vtype=='function' then return "null" end
-- 类型断言
assert(false, "JSON编码时发现了不支持的数据类型 " .. vtype .. ":" .. tostring(v))
end
-- JSON 解码数据
function json.decode(s, startPos)
startPos = startPos and startPos or 1
startPos = decode_scanWhitespace(s, startPos)
assert(startPos <= string.len(s), "数据遍历位置超过结尾 [" .. s .. "]")
local curChar = string.sub(s, startPos, startPos)
-- 对象
if curChar=='{' then return decode_scanObject(s, startPos) end
-- 数组
if curChar=='[' then return decode_scanArray(s, startPos) end
-- 数字
if string.find("+-0123456789.e", curChar, 1, true) then return decode_scanNumber(s, startPos) end
-- 字符串
if curChar==[["]] or curChar==[[']] then return decode_scanString(s, startPos) end
-- 注释
if string.sub(s,startPos,startPos+1)=='/*' then return decode(s, decode_scanComment(s, startPos)) end
-- 常数
return decode_scanConstant(s, startPos)
end
-- 扫描数组 [s:JSON串, startPos:扫描位置] [1:还原的表, 2:新的扫描位置]
function decode_scanArray(s, startPos)
local array = {}
local stringLen = string.len(s)
assert(string.sub(s, startPos, startPos)=='[','扫描的位置不是数组数据的起点,位置:' .. startPos .. '\nJSON字符串:'..s)
startPos = startPos + 1
repeat
startPos = decode_scanWhitespace(s,startPos)
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到数组结尾。')
local curChar = string.sub(s, startPos, startPos)
if (curChar==']') then return array, startPos + 1 end
if (curChar==',') then startPos = decode_scanWhitespace(s,startPos+1) end
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到数组结尾。')
object, startPos = json.decode(s,startPos)
table.insert(array,object)
until false
end
-- 扫描注释 [s:JSON串, startPos:扫描位置] [新的扫描位置]
function decode_scanComment(s, startPos)
assert(string.sub(s, startPos, startPos + 1)=='/*', "扫描的位置不是注释数据的起点,位置:" .. startPos .. '\nJSON字符串:'..s)
local endPos = string.find(s, '*/', startPos + 2)
assert(endPos ~= nil, "JSON字符串扫描已结束,但没有找到注释结尾。")
return endPos + 2
end
-- 扫描常数 [s:JSON串, startPos:扫描位置] [1:还原的数据, 2:新的扫描位置]
function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil }
local constNames = {"true","false","null"}
for i, k in pairs(constNames) do
if string.sub(s,startPos, startPos + string.len(k) -1 ) == k then return consts[k], startPos + string.len(k) end
end
assert(nil, '无法找到标识符对应的值:' .. s .. ',位置:' .. startPos)
end
-- 扫描数字 [s:JSON串, startPos:扫描位置] [1:还原的数字, 2:新的扫描位置]
function decode_scanNumber(s, startPos)
local endPos = startPos+1
local stringLen = string.len(s)
local acceptableChars = "+-0123456789.e"
while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true) and endPos<=stringLen) do endPos = endPos + 1 end
local stringValue = 'return ' .. string.sub(s,startPos, endPos-1)
local stringEval = load(stringValue)
assert(stringEval, '扫描数字失败,' .. stringValue .. '在JSON字符串的位置:' .. startPos .. ' : ' .. endPos)
return stringEval(), endPos
end
-- 扫描对象 [s:JSON串, startPos:扫描位置] [1:还原的表, 2:新的扫描位置]
function decode_scanObject(s, startPos)
local object = {}
local stringLen = string.len(s)
local key, value
assert(string.sub(s, startPos, startPos) == '{', '扫描的位置不是对象数据的起点,位置:' .. startPos .. '\nJSON字符串:'..s)
startPos = startPos + 1
repeat
startPos = decode_scanWhitespace(s,startPos)
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到对象结尾。')
local curChar = string.sub(s,startPos,startPos)
if (curChar=='}') then return object,startPos+1 end
if (curChar==',') then startPos = decode_scanWhitespace(s,startPos+1) end
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到对象结尾。')
key, startPos = json.decode(s,startPos)
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到键值:' .. key)
startPos = decode_scanWhitespace(s,startPos)
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到键值:' .. key)
assert(string.sub(s,startPos,startPos)==':','JSON对象键值格式异常,错误位置:' .. startPos)
startPos = decode_scanWhitespace(s,startPos+1)
assert(startPos<=stringLen, 'JSON字符串扫描已结束,但没有找到键值:' .. key)
value, startPos = json.decode(s,startPos)
object[key]=value
until false
end
-- 扫描字符串 [s:JSON串, startPos:扫描位置] [1:还原的字符串, 2:新的扫描位置]
local escapeSequences = {["\\t"] = "\t", ["\\f"] = "\f", ["\\r"] = "\r", ["\\n"] = "\n", ["\\b"] = "\b"}
setmetatable(escapeSequences, {__index = function(t, k) return string.sub(k,2) end})
function decode_scanString(s, startPos)
assert(startPos, '扫描字符串时没有填写起始位置。')
local startChar = string.sub(s, startPos, startPos)
assert(startChar == [["]] or startChar == [[']], '非法的字符串格式。')
local t = {}
local i, j = startPos, startPos
while string.find(s, startChar, j+1) ~= j+1 do
local oldj = j
i, j = string.find(s, "\\.", j+1)
local x, y = string.find(s, startChar, oldj+1)
if not i or x < i then i, j = x, y-1 end
table.insert(t, string.sub(s, oldj+1, i-1))
if string.sub(s, i, j) == "\\u" then
local a = string.sub(s, j+1, j+4)
j = j + 4
local n = tonumber(a, 16)
assert(n, "字符串UNICODE转译失败," .. a .. " 无法转换为数字,出错位置:" .. i .. " : " .. j)
local x
if n < 0x80 then
x = string.char(n % 0x80)
elseif n < 0x800 then -- [110x xxxx] [10xx xxxx]
x = string.char(0xC0 + (math.floor(n/64) % 0x20), 0x80 + (n % 0x40))
else -- [1110 xxxx] [10xx xxxx] [10xx xxxx]
x = string.char(0xE0 + (math.floor(n/4096) % 0x10), 0x80 + (math.floor(n/64) % 0x40), 0x80 + (n % 0x40))
end
table.insert(t, x)
else
table.insert(t, escapeSequences[string.sub(s, i, j)])
end
end
table.insert(t,string.sub(j, j+1))
assert(string.find(s, startChar, j+1), "字符串扫描失败,找不到关闭符号。出错位置:开始(" .. startChar .. ") 结束(" .. startPos .. ")")
return table.concat(t,""), j+2
end
-- 扫描字符串返回下一个非白字符 [空格、Tab、换行、回车]
function decode_scanWhitespace(s,startPos)
local whitespace=" \n\r\t"
local stringLen = string.len(s)
while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do startPos = startPos + 1 end
return startPos
end
-- 返回可以编码的字符串
local json_escapeList = {['"'] = '\\"', ['\\'] = '\\\\', ['/'] = '\\/', ['\b'] = '\\b', ['\f'] = '\\f', ['\n'] = '\\n', ['\r'] = '\\r', ['\t'] = '\\t'}
function json_encodeString(s)
local s = tostring(s)
return s:gsub(".", function(c) return json_escapeList[c] end)
end
-- 判断一个表是否为数组
function json_isArray(t)
local maxIndex = 0
for k, v in pairs(t) do
if (type(k)=='number' and math.floor(k)==k and 1<=k) then
if (not json_isEncodable(v)) then return false end
maxIndex = math.max(maxIndex,k)
else
if (k=='n') then
if v ~= table.getn(t) then return false end
else
if json_isEncodable(v) then return false end
end
end
end
return true, maxIndex
end
-- 判断数据是否可编码
function json_isEncodable(o)
local t = type(o)
return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or (t=='function' and o==null)
end
function PostHttp(url,heard)
return LuaAuxLib.URL_OperationPost(url,heard,60)
end
-------------------------------------------超级鹰接口函数区-------------------------------------------
--查询信息
function QMPlugin.GetScore(user,pass)
local PostHost = "http://www.98lm.com/Upload/GetScore.php"
--添加数据到table
local formtable = {}
formtable["user"] = user
formtable["pass2"] = pass
--table转json
local formjson = json.encode(formtable)
--提交信息
local retjson = PostHttp(PostHost,formjson)
return retjson
end
--识别图片
function QMPlugin.PostPic(user,pass,softid,codetype,len_min,pathfile)
local PostHost = "http://www.98lm.com/Upload/Processing.php"
local tempRet = ReadFile(pathfile)
if tempRet == "" then
return "file null"
end
--添加数据到table
local formtable = {}
formtable["user"] = user
formtable["pass2"] = pass
formtable["softid"] = softid
formtable["codetype"] = codetype
formtable["len_min"] = len_min
formtable["file_base64"] = ReadFileBase(pathfile)
--table转json
local formjson = json.encode(formtable)
--提交信息
local retjson = PostHttp(PostHost,formjson)
return retjson
end
--报错返分
function QMPlugin.ReportError(user,pass,id,softid)
local PostHost = "http://www.98lm.com/Upload/ReportError.php"
--添加数据到table
local formtable = {}
formtable["user"] = user
formtable["pass2"] = pass
formtable["id"] = id
formtable["softid"] = softid
--table转json
local formjson = json.encode(formtable)
--提交信息
local retjson = PostHttp(PostHost,formjson)
return retjson
end