From af2df2c7e210c1599879295898b2ed1008b3aa1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=88=B1=E6=9C=89=E6=83=85?= Date: Wed, 15 Oct 2025 17:12:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(captcha):=E9=87=8D=E6=9E=84=E7=82=B9?= =?UTF-8?q?=E9=80=89=E9=AA=8C=E8=AF=81=E7=A0=81=E7=94=9F=E6=88=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E4=BC=98=E5=8C=96=E9=AA=8C=E8=AF=81=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 AbstractClickImageCaptchaGenerator 中的图片提示资源结构,支持 ResourceMap 类型 - 引入 CommonConstant 常量用于区分提示图标与点击图标资源 - 新增 Block 类用于管理背景图上的可点击区域分块逻辑 - 更新点击图片的位置计算方式,从随机坐标改为基于分块的确定位置 - 添加 obfuscateImage 方法用于后续图像混淆处理扩展 - 调整时间戳字段类型由 Date 改为 Long,提升性能及一致性 - 在 ParamKeyEnum 中新增 FONT_TAG 参数键,支持按标签读取字体资源 - 标准化字体获取方法,允许通过 GenerateParam 指定字体标签 -修正 DefaultBuiltInResources 中字体路径拼写错误(fontS → fonts) - 补充 ResourceStore 接口的 getTarget 默认方法实现 - 更新测试类 TACBuilderTest2 示例代码中的验证码类型调用参数 --- .../model/dto/ClickImageCheckDefinition.java | 31 +++++-- .../common/model/dto/ParamKeyEnum.java | 3 +- .../AbstractClickImageCaptchaGenerator.java | 88 ++++++++++++------- ...tandardWordClickImageCaptchaGenerator.java | 31 ++++--- .../impl/BasicTrackCaptchaInterceptor.java | 4 +- .../resource/DefaultBuiltInResources.java | 2 +- .../tianai/captcha/resource/FontCache.java | 5 ++ .../captcha/resource/ResourceStore.java | 4 + .../common/model/dto/ImageCaptchaTrack.java | 5 +- .../impl/BasicCaptchaTrackValidator.java | 4 +- .../java/example/readme/TACBuilderTest2.java | 2 +- 11 files changed, 120 insertions(+), 59 deletions(-) diff --git a/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java index 79136e0..4e37903 100644 --- a/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.awt.*; +import java.awt.image.BufferedImage; /** * @Author: 天爱有情 @@ -16,17 +17,35 @@ import java.awt.*; @NoArgsConstructor @AllArgsConstructor public class ClickImageCheckDefinition { - /** 提示.*/ + /** 提示. */ private Resource tip; - /** x.*/ + private ImgWrapper tipImage; + /** x. */ private Integer x; - /** y.*/ + /** y. */ private Integer y; - /** 宽.*/ + /** 宽. */ private Integer width; - /** 高.*/ + /** 高. */ private Integer height; - /** 颜色.*/ + /** 颜色. */ private Color imageColor; + /** + * @Author: 天爱有情 + * @date 2022/4/28 14:26 + * @Description 点击图片包装 + */ + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ImgWrapper { + /** 图片. */ + private BufferedImage image; + /** 提示. */ + private Resource tip; + /** 图片颜色. */ + private Color imageColor; + } + } diff --git a/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ParamKeyEnum.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ParamKeyEnum.java index 937afb8..76fb029 100644 --- a/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ParamKeyEnum.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ParamKeyEnum.java @@ -13,7 +13,8 @@ public class ParamKeyEnum implements ParamKey { public static final ParamKey CLICK_CHECK_CLICK_COUNT = new ParamKeyEnum<>("checkClickCount"); /** 点选验证码干扰数量. 值为Integer */ public static final ParamKey CLICK_INTERFERENCE_COUNT = new ParamKeyEnum<>("interferenceCount"); - + /** 读取字体时,可指定字体TAG,可用于给不同的验证码指定不同的字体包.*/ + public static final ParamKey FONT_TAG = new ParamKeyEnum<>("fontTag"); private String key; } diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java index 91494d2..9920e0b 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java @@ -1,5 +1,6 @@ package cloud.tianai.captcha.generator.impl; +import cloud.tianai.captcha.common.constant.CommonConstant; import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; import cloud.tianai.captcha.generator.common.model.dto.CaptchaExchange; import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; @@ -7,6 +8,7 @@ import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.ResourceMap; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -16,6 +18,7 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; /** * @Author: 天爱有情 @@ -42,40 +45,67 @@ public abstract class AbstractClickImageCaptchaGenerator extends AbstractImageCa BufferedImage bgImage = getResourceImage(resourceImage); - List imgTips = randomGetClickImgTips(param); + List imgTips = randomGetClickImgTips(param); int allImages = imgTips.size(); List clickImageCheckDefinitionList = new ArrayList<>(allImages); int avg = bgImage.getWidth() / allImages; if (allImages < imgTips.size()) { throw new IllegalStateException("随机生成点击图片小于请求数量, 请求生成数量=" + allImages + ",实际生成数量=" + imgTips.size()); } + List blocks = new ArrayList<>(); for (int i = 0; i < allImages; i++) { + ResourceMap resourceMap = imgTips.get(i); + Resource tipResource = resourceMap.get(CommonConstant.IMAGE_TIP_ICON); + Resource clickResource = resourceMap.get(CommonConstant.IMAGE_CLICK_ICON); + if (clickResource == null) { + throw new IllegalStateException("随机生成点击图片失败,资源中必须包含[" + CommonConstant.IMAGE_CLICK_ICON + "]" + resourceMap); + } + if (tipResource == null) { + tipResource = clickResource; + } + // 随机获取点击图片 - ImgWrapper imgWrapper = getClickImg(imgTips.get(i),null); + ClickImageCheckDefinition.ImgWrapper imgWrapper = getClickImg(param, clickResource, null); BufferedImage image = imgWrapper.getImage(); + // 增加功能,是否需要扭曲图片 + image = obfuscateImage(image, param); int clickImgWidth = image.getWidth(); int clickImgHeight = image.getHeight(); - // 随机x - int randomX; if (i == 0) { - randomX = 1; - } else { - randomX = avg * i; + // 假设每个icon的大小都是一样的, 按照宽高进行分块 + int w = clickImgWidth + clickImgWidth / 2; + int h = clickImgHeight + clickImgHeight / 2; + int xNum = (int) Math.floor((double) bgImage.getWidth() / w); + int yNum = (int) Math.floor((double) bgImage.getHeight() / h); + for (int x = 0; x < xNum; x++) { + for (int y = 0; y < yNum; y++) { + blocks.add(new Block(x * w + clickImgWidth / 2, clickImgWidth, y * h + clickImgHeight / 2, clickImgHeight)); + } + } } - // 随机y - int randomY = randomInt(10, bgImage.getHeight() - clickImgHeight); - // 通过随机x和y 进行覆盖图片 - CaptchaImageUtils.overlayImage(bgImage, image, randomX, randomY); + Block block = blocks.remove(ThreadLocalRandom.current().nextInt(0, blocks.size())); +// // 随机x +// int randomX; +// if (i == 0) { +// randomX = 1; +// } else { +// randomX = avg * i; +// } +// // 随机y +// int randomY = randomInt(10, bgImage.getHeight() - clickImgHeight); + // 通过随机x和y 进行覆盖图片7 + CaptchaImageUtils.overlayImage(bgImage, image, block.startX, block.startY); ClickImageCheckDefinition clickImageCheckDefinition = new ClickImageCheckDefinition(); - clickImageCheckDefinition.setTip(imgWrapper.getTip()); - clickImageCheckDefinition.setX(randomX + clickImgWidth / 2); - clickImageCheckDefinition.setY(randomY + clickImgHeight / 2); + clickImageCheckDefinition.setTip(tipResource); + clickImageCheckDefinition.setTipImage(imgWrapper); + clickImageCheckDefinition.setX(block.startX + clickImgWidth / 2); + clickImageCheckDefinition.setY(block.startY + clickImgHeight / 2); clickImageCheckDefinition.setWidth(clickImgWidth); clickImageCheckDefinition.setHeight(clickImgHeight); clickImageCheckDefinition.setImageColor(imgWrapper.getImageColor()); clickImageCheckDefinitionList.add(clickImageCheckDefinition); } - List checkClickImageCheckDefinitionList = filterAndSortClickImageCheckDefinition(captchaExchange,clickImageCheckDefinitionList); + List checkClickImageCheckDefinitionList = filterAndSortClickImageCheckDefinition(captchaExchange, clickImageCheckDefinitionList); captchaExchange.setBackgroundImage(bgImage); captchaExchange.setTransferData(checkClickImageCheckDefinitionList); captchaExchange.setResourceImage(resourceImage); @@ -88,20 +118,24 @@ public abstract class AbstractClickImageCaptchaGenerator extends AbstractImageCa } + private BufferedImage obfuscateImage(BufferedImage image, GenerateParam param) { + return image; + } + /** * 过滤并排序校验的图片点选顺序 * * @param allCheckDefinitionList 总的点选图片 * @return List */ - protected abstract List filterAndSortClickImageCheckDefinition(CaptchaExchange captchaExchange,List allCheckDefinitionList); + protected abstract List filterAndSortClickImageCheckDefinition(CaptchaExchange captchaExchange, List allCheckDefinitionList); /** * 随机获取一组数据用于生成随机图 * * @return List */ - protected abstract List randomGetClickImgTips(GenerateParam param); + protected abstract List randomGetClickImgTips(GenerateParam param); /** * 随机获取点击的图片 @@ -109,22 +143,16 @@ public abstract class AbstractClickImageCaptchaGenerator extends AbstractImageCa * @param tip 提示数据,根据改数据生成图片 * @return ImgWrapper */ - public abstract ImgWrapper getClickImg(Resource tip, Color randomColor); + public abstract ClickImageCheckDefinition.ImgWrapper getClickImg(GenerateParam param, Resource tip, Color randomColor); + - /** - * @Author: 天爱有情 - * @date 2022/4/28 14:26 - * @Description 点击图片包装 - */ @Data @NoArgsConstructor @AllArgsConstructor - public static class ImgWrapper { - /** 图片. */ - private BufferedImage image; - /** 提示. */ - private Resource tip; - /** 图片颜色. */ - private Color imageColor; + private static class Block { + private int startX; + private int width; + private int startY; + private int height; } } diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/StandardWordClickImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardWordClickImageCaptchaGenerator.java index 6629b6e..5a40fab 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/StandardWordClickImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardWordClickImageCaptchaGenerator.java @@ -12,6 +12,7 @@ import cloud.tianai.captcha.interceptor.CaptchaInterceptor; import cloud.tianai.captcha.resource.FontCache; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.ResourceMap; import lombok.Getter; import lombok.Setter; @@ -77,15 +78,18 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa @Override - protected List randomGetClickImgTips(GenerateParam param) { + protected List randomGetClickImgTips(GenerateParam param) { Integer checkClickCount = param.getOrDefault(ParamKeyEnum.CLICK_CHECK_CLICK_COUNT, getCheckClickCount()); Integer interferenceCount = param.getOrDefault(ParamKeyEnum.CLICK_INTERFERENCE_COUNT, getInterferenceCount()); int tipSize = interferenceCount + checkClickCount; ThreadLocalRandom random = ThreadLocalRandom.current(); - List tipList = new ArrayList<>(tipSize); + List tipList = new ArrayList<>(tipSize); for (int i = 0; i < tipSize; i++) { String randomWord = FontUtils.getRandomChar(random); - tipList.add(new Resource(null, randomWord)); + ResourceMap resourceMap = new ResourceMap(param.getTemplateImageTag()); + resourceMap.put(CommonConstant.IMAGE_TIP_ICON, new Resource(null, randomWord)); + resourceMap.put(CommonConstant.IMAGE_CLICK_ICON, new Resource(null, randomWord)); + tipList.add(resourceMap); } // 随机文字 return tipList; @@ -101,8 +105,9 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa // resourceStore.addResource(CaptchaTypeConstant.WORD_IMAGE_CLICK, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"), DEFAULT_TAG)); } - public FontWrapper randomFont() { - Resource resource = requiredRandomGetResource(FontCache.FONT_TYPE, CommonConstant.DEFAULT_TAG); + public FontWrapper randomFont(GenerateParam param) { + String fontTag = param.getOrDefault(ParamKeyEnum.FONT_TAG, CommonConstant.DEFAULT_TAG); + Resource resource = requiredRandomGetResource(FontCache.FONT_TYPE, fontTag); Object extra = resource.getExtra(); if (extra instanceof FontWrapper) { return (FontWrapper) extra; @@ -110,8 +115,8 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa throw new ImageCaptchaException("随机获取字体失败, resource中没有读到字体包, resource=" + resource); } - public ImgWrapper genTipImage(List imageCheckDefinitions) { - FontWrapper fontWrapper = randomFont(); + public ClickImageCheckDefinition.ImgWrapper genTipImage(List imageCheckDefinitions, GenerateParam param) { + FontWrapper fontWrapper = randomFont(param); Font font = fontWrapper.getFont(); float currentFontTopCoef = fontWrapper.getCurrentFontTopCoef(); String tips = imageCheckDefinitions.stream().map(c -> c.getTip().getData()).collect(Collectors.joining()); @@ -123,7 +128,7 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa float top = 6 / 2f + font.getSize() - currentFontTopCoef; BufferedImage bufferedImage = CaptchaImageUtils.genSimpleImgCaptcha(tips, font, width, height, left, top, tipImageInterferenceLineNum, tipImageInterferencePointNum); - return new ImgWrapper(bufferedImage, new Resource(null, tips), null); + return new ClickImageCheckDefinition.ImgWrapper(bufferedImage, new Resource(null, tips), null); } // @Override @@ -136,14 +141,14 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa @Override - public ImgWrapper getClickImg(Resource tip, Color randomColor) { + public ClickImageCheckDefinition.ImgWrapper getClickImg(GenerateParam param, Resource tip, Color randomColor) { if (randomColor == null) { ThreadLocalRandom random = ThreadLocalRandom.current(); randomColor = CaptchaImageUtils.getRandomColor(random); } // 随机角度 int randomDeg = randomInt(0, 85); - FontWrapper fontWrapper = randomFont(); + FontWrapper fontWrapper = randomFont(param); Font font = fontWrapper.getFont(); float currentFontTopCoef = fontWrapper.getCurrentFontTopCoef(); BufferedImage fontImage = CaptchaImageUtils.drawWordImg(randomColor, @@ -153,11 +158,11 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa clickImgWidth, clickImgHeight, randomDeg); - return new ImgWrapper(fontImage, tip, randomColor); + return new ClickImageCheckDefinition.ImgWrapper(fontImage, tip, randomColor); } @Override - protected List filterAndSortClickImageCheckDefinition(CaptchaExchange captchaExchange,List allCheckDefinitionList) { + protected List filterAndSortClickImageCheckDefinition(CaptchaExchange captchaExchange, List allCheckDefinitionList) { GenerateParam param = captchaExchange.getParam(); Integer checkClickCount = param.getOrDefault(ParamKeyEnum.CLICK_CHECK_CLICK_COUNT, getCheckClickCount()); // 打乱 @@ -179,7 +184,7 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa Resource resourceImage = captchaExchange.getResourceImage(); CustomData data = captchaExchange.getCustomData(); // 提示图片 - BufferedImage tipImage = genTipImage(checkClickImageCheckDefinitionList).getImage(); + BufferedImage tipImage = genTipImage(checkClickImageCheckDefinitionList, param).getImage(); ImageTransformData transform = getImageTransform().transform(param, bgImage, tipImage, resourceImage, checkClickImageCheckDefinitionList, data); ImageCaptchaInfo clickImageCaptchaInfo = new ImageCaptchaInfo(); clickImageCaptchaInfo.setBackgroundImage(transform.getBackgroundImageUrl()); diff --git a/src/main/java/cloud/tianai/captcha/interceptor/impl/BasicTrackCaptchaInterceptor.java b/src/main/java/cloud/tianai/captcha/interceptor/impl/BasicTrackCaptchaInterceptor.java index 8217f4d..1eee864 100644 --- a/src/main/java/cloud/tianai/captcha/interceptor/impl/BasicTrackCaptchaInterceptor.java +++ b/src/main/java/cloud/tianai/captcha/interceptor/impl/BasicTrackCaptchaInterceptor.java @@ -35,8 +35,8 @@ public class BasicTrackCaptchaInterceptor implements CaptchaInterceptor { } ImageCaptchaTrack imageCaptchaTrack = matchData.getTrack(); // 进行行为轨迹检测 - long startSlidingTime = imageCaptchaTrack.getStartTime().getTime(); - long endSlidingTime = imageCaptchaTrack.getStopTime().getTime(); + long startSlidingTime = imageCaptchaTrack.getStartTime(); + long endSlidingTime = imageCaptchaTrack.getStopTime(); Integer bgImageWidth = imageCaptchaTrack.getBgImageWidth(); List trackList = imageCaptchaTrack.getTrackList(); // 这里只进行基本检测, 用一些简单算法进行校验,如有需要可扩展 diff --git a/src/main/java/cloud/tianai/captcha/resource/DefaultBuiltInResources.java b/src/main/java/cloud/tianai/captcha/resource/DefaultBuiltInResources.java index 1636bf9..dd38c90 100644 --- a/src/main/java/cloud/tianai/captcha/resource/DefaultBuiltInResources.java +++ b/src/main/java/cloud/tianai/captcha/resource/DefaultBuiltInResources.java @@ -69,7 +69,7 @@ public class DefaultBuiltInResources { // 字体包 defaultTemplateResource.put(FontCache.FONT_TYPE, resourceStore -> { - resourceStore.addResource(FontCache.FONT_TYPE,new Resource(type, finalPathPrefix.concat("/fontS/SIMSUN.TTC"))); + resourceStore.addResource(FontCache.FONT_TYPE,new Resource(type, finalPathPrefix.concat("/fonts/SIMSUN.TTC"))); }); } diff --git a/src/main/java/cloud/tianai/captcha/resource/FontCache.java b/src/main/java/cloud/tianai/captcha/resource/FontCache.java index 2c46512..cec77f9 100644 --- a/src/main/java/cloud/tianai/captcha/resource/FontCache.java +++ b/src/main/java/cloud/tianai/captcha/resource/FontCache.java @@ -77,4 +77,9 @@ public class FontCache implements ResourceStore { public List randomGetTemplateByTypeAndTag(String type, String tag, Integer quantity) { return resourceStore.randomGetTemplateByTypeAndTag(type, tag, quantity); } + + @Override + public ResourceStore getTarget() { + return resourceStore; + } } diff --git a/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java b/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java index 069e17a..6057a4c 100644 --- a/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java +++ b/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java @@ -29,4 +29,8 @@ public interface ResourceStore { * @return Map */ List randomGetTemplateByTypeAndTag(String type, String tag,Integer quantity); + + default ResourceStore getTarget() { + return this; + } } diff --git a/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java b/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java index e0893e7..e895883 100644 --- a/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java +++ b/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java @@ -5,7 +5,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Date; import java.util.List; /** @@ -25,9 +24,9 @@ public class ImageCaptchaTrack { /** 模板图片高度. */ private Integer templateImageHeight; /** 滑动开始时间. */ - private Date startTime; + private Long startTime; /** 滑动结束时间. */ - private Date stopTime; + private Long stopTime; private Integer left; private Integer top; /** 滑动的轨迹. */ diff --git a/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java b/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java index 8362ce1..8113b9e 100644 --- a/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java +++ b/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java @@ -42,8 +42,8 @@ public class BasicCaptchaTrackValidator extends SimpleImageCaptchaValidator { return ApiResponse.ofSuccess(); } // 进行行为轨迹检测 - long startSlidingTime = imageCaptchaTrack.getStartTime().getTime(); - long endSlidingTime = imageCaptchaTrack.getStopTime().getTime(); + long startSlidingTime = imageCaptchaTrack.getStartTime(); + long endSlidingTime = imageCaptchaTrack.getStopTime(); Integer bgImageWidth = imageCaptchaTrack.getBgImageWidth(); List trackList = imageCaptchaTrack.getTrackList(); // 这里只进行基本检测, 用一些简单算法进行校验,如有需要可扩展 diff --git a/src/main/test/java/example/readme/TACBuilderTest2.java b/src/main/test/java/example/readme/TACBuilderTest2.java index f2e7a0b..a0ae1e8 100644 --- a/src/main/test/java/example/readme/TACBuilderTest2.java +++ b/src/main/test/java/example/readme/TACBuilderTest2.java @@ -26,7 +26,7 @@ public class TACBuilderTest2 { .addResource("WORD_IMAGE_CLICK", new Resource("classpath", "META-INF/cut-image/resource/1.jpg")) .addResource("ROTATE", new Resource("classpath", "META-INF/cut-image/resource/1.jpg")) .build(); - ApiResponse response = application.generateCaptcha("WORD_IMAGE_CLICK"); + ApiResponse response = application.generateCaptcha("SLIDER"); System.out.println(response); }