From 836d908f4cf8c7ed8714544723b4ed686d187cf7 Mon Sep 17 00:00:00 2001 From: wanglei <34475144@qqcom> Date: Thu, 20 Nov 2025 23:05:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0=E5=92=8C=E5=BA=93=20?= =?UTF-8?q?=E5=B9=B6=E7=BC=96=E5=86=99=E6=B5=8B=E8=AF=95=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/nginx.conf | 2 +- src/share/lib/gd.so | Bin 0 -> 60640 bytes src/test/test.lua | 67 ++++++++++++++++++++ src/util/generatechaptcha.lua | 114 ++++++++++++++++------------------ 4 files changed, 122 insertions(+), 61 deletions(-) create mode 100755 src/share/lib/gd.so diff --git a/conf/nginx.conf b/conf/nginx.conf index c1b38ed..0610a81 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -13,7 +13,7 @@ http { client_max_body_size 1024M; #允许最大100k的请求体 client_body_buffer_size 1024M; #设置缓冲区大小 - lua_code_cache on; #代码缓存 + #lua_code_cache on; #代码缓存 lua_package_path '$prefix/src/?/?.lua;$prefix/src/?.lua;/home/frankly/work/AuthPlatform/src/?/?.lua;/home/frankly/work/AuthPlatform/src/?.lua;;'; lua_package_cpath '$prefix/src/share/lib/?.so;/home/frankly/work/AuthPlatform/src/share/lib/?.so;;'; diff --git a/src/share/lib/gd.so b/src/share/lib/gd.so new file mode 100755 index 0000000000000000000000000000000000000000..2126d6f32834048f1d4c44027b0d21eac7e09422 GIT binary patch literal 60640 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 BAU*&9 literal 0 HcmV?d00001 diff --git a/src/test/test.lua b/src/test/test.lua index 2665e70..34126de 100644 --- a/src/test/test.lua +++ b/src/test/test.lua @@ -31,6 +31,73 @@ local status = val or STATUS_CODE.UNKNOWN_ERROR local msg = status.message ngx.say("message:"..msg) +local ok, gd = pcall(require, "gd") +if not ok then + ngx.say("加载失败"..gd) + return +end + +function enabled(res, desc) + local str = " " .. desc .. " " + str = str .. string.rep(".", 37 - string.len(str)) + if res then + print(str .. " Enabled") + else + print(str .. " Disabled") + end +end + +print("Lua-GD version: " .. gd.VERSION) +print("Lua-GD features:") + +--[[ +local gd = require("gd") +local iSeed = os.time() + os.clock() * 10000 +math.randomseed(iSeed) + +function CheckCode(nChars, iWidth, iHeight) + local sTab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + local iTabLen = string.len(sTab) + local idx, x, y, clr + local im = gd.create(iWidth, iHeight) + im:colorAllocate(255, 255, 255) -- background color + for i=1, nChars do + clr = im:colorAllocate(math.random(0, 100), math.random(0, 150), math.random(0, 200)) + idx = math.random(1, iTabLen) + x = math.random(1, 8) + iWidth * (i-1) / 4 + y = math.random(1, iHeight / 4) + im:string(gd.FONT_LARGE, x, y, string.sub(sTab, idx, idx), clr) + end + for i=1, 3 do + clr = im:colorAllocate(math.random(0, 255), math.random(0, 255), math.random(0, 255)) + im:line(math.random(1, iWidth), math.random(1, iHeight), math.random(1, iWidth), math.random(1, iHeight), clr) + end + return im +end + +local im = CheckCode(4, 60, 20) +print("Content-type: image/png") +print("Pragma: no-cache") +print("Expires: Thu Jan 01 00:00:00 UTC 1970") +print("") +io.write(im:pngStr()) +--]] + +--[[ +local genpic = require("util.generatechaptcha") +local filename, fp = genpic.getChaptcha() +--redis中添加picgid为key,string为value的记录 +--setRedis(filename, stringmark) + +--response header中传参picgid +ngx.header.content_type = "text/plain" +ngx.header.picgid = filename +--页面返回pic +ngx.say(fp) +--nginx退出 +ngx.exit(200) +--]] +do return end --local openssl = require("openssl") -- diff --git a/src/util/generatechaptcha.lua b/src/util/generatechaptcha.lua index 97e2585..f3891a2 100644 --- a/src/util/generatechaptcha.lua +++ b/src/util/generatechaptcha.lua @@ -4,69 +4,63 @@ --- DateTime: 2025/11/19 20:18 --- 生成校验码图片 ---设置随机种子 -local resty_uuid = require("resty.uuid") -math.randomseed(tonumber(resty_uuid.gennum20())) - ---在32个备选字符中随机筛选4个作为captcha字符串 -local dict={'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','2','3','4','5','6','7','8','9'} -local stringmark = "" -for i = 1, 4 do - stringmark = stringmark..dict[math.random(1,32)] -end - ---图片基本info ---picgid -local filename = "1"..resty_uuid.gen20()..".png" ---图片78x26 -local xsize = 78 -local ysize = 26 ---字体大小 -local wsize = 17.5 ---干扰线(yes/no) -local line = "yes" - --加载模块 local gd = require('gd') ---创建面板 -local im = gd.createTrueColor(xsize, ysize) ---定义颜色 -local black = im:colorAllocate(0, 0, 0) -local grey = im:colorAllocate(202, 202, 202) -local color = {} -for c = 1, 100 do - color[c] = im:colorAllocate(math.random(100), math.random(100), math.random(100)) -end ---画背景 -x, y = im:sizeXY() -im:filledRectangle(0, 0, x, y, grey) ---画字符 -gd.useFontConfig(true) -for i = 1, 4 do - k = (i - 1) * 16 + 3 - im:stringFT(color[math.random(100)], "Arial:bold", wsize, math.rad(math.random(-10,10)), k, 22, string.sub(stringmark, i, i)) -end ---干扰线点 -if line == "yes" then - for j = 1, math.random(3) do - im:line(math.random(xsize), math.random(ysize), math.random(xsize), math.random(ysize), color[math.random(100)]) +local uuid = require("util.uuid") + +local _M = {} +--在32个备选字符中随机筛选4个作为captcha字符串 +local dict = {'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','2','3','4','5','6','7','8','9'} + +function _M.getChaptcha() + local stringmark = "" + for i = 1, 4 do + stringmark = stringmark..dict[math.random(1,32)] end - for p = 1, 20 do - im:setPixel(math.random(xsize), math.random(ysize), color[math.random(100)]) + + --图片基本info + + local uid = uuid.generateUuid() + --picgid + local filename = "1"..uuid..".png" + --图片78x26 + local xsize = 78 + local ysize = 26 + --字体大小 + local wsize = 17.5 + --干扰线(yes/no) + local line = "yes" + + --创建面板 + local im = gd.createTrueColor(xsize, ysize) + --定义颜色 + local black = im:colorAllocate(0, 0, 0) + local grey = im:colorAllocate(202, 202, 202) + local color = {} + for c = 1, 100 do + color[c] = im:colorAllocate(math.random(100), math.random(100), math.random(100)) end + --画背景 + x, y = im:sizeXY() + im:filledRectangle(0, 0, x, y, grey) + --画字符 + gd.useFontConfig(true) + for i = 1, 4 do + k = (i - 1) * 16 + 3 + im:stringFT(color[math.random(100)], "Arial:bold", wsize, math.rad(math.random(-10,10)), k, 22, string.sub(stringmark, i, i)) + end + --干扰线点 + if line == "yes" then + for j = 1, math.random(3) do + im:line(math.random(xsize), math.random(ysize), math.random(xsize), math.random(ysize), color[math.random(100)]) + end + for p = 1, 20 do + im:setPixel(math.random(xsize), math.random(ysize), color[math.random(100)]) + end + end + --流输出 + local fp = im:pngStr(75) + return filename, fp end ---流输出 -local fp = im:pngStr(75) ---redis中添加picgid为key,string为value的记录 ---setRedis(filename, stringmark) - ---response header中传参picgid -ngx.header.content_type = "text/plain" -ngx.header.picgid = filename - ---页面返回pic -ngx.say(fp) - ---nginx退出 -ngx.exit(200) +return _M \ No newline at end of file