LazyCaptcha v1 (на основе ImageSharp)
Введение
Продукт, имитирующий EasyCaptcha и SimpleCaptcha, представляет собой модуль графической проверки на основе .Net Standard 2.0. Может работать в среде .Net Framework >= 4.6.1, Core >= 2.0. Для использования в .Net Framework рекомендуется версия 1.1.6 или выше.
С версии 1.1.6 поддерживается .Net Standard 2.0, ранее поддерживался .Net Standard 2.1. Если вы хотите использовать продукт в .Net Framework, используйте версию 1.1.6 или более позднюю.
Слайдер-капча доступна по адресу: lazy-slide-captcha.
Адреса:
Демонстрация эффекта
CaptchaType | Шрифт | Статическая картинка | Динамическая картинка |
---|---|---|---|
DEFAULT (0) | Actionj | Изображения/DEFAULT_N.gif | Изображения/DEFAULT_G.gif |
CHINESE (1) | kaiti | Изображения/CHINESE_N.gif | Изображения/CHINESE_G.gif |
NUMBER (2) | Fresnel | Изображения/NUMBER_N.gif | Изображения/NUMBER_G.gif |
NUMBER_ZH_CN (3) | kaiti | Изображения/NUMBER_ZH_CN.gif | Изображения/NUMBER_ZH_CN_G.gif |
NUMBER_ZH_HK (4) | kaiti | Изображения/NUMBER_ZH_HK_N.gif | Изображения/NUMBER_ZH_HK_G.gif |
WORD (5) | Epilog | Изображения/WORD_N.gif | Изображения/WORD_G.gif |
WORD_LOWER (6) | Epilog | Изображения/WORD_LOWER_N.gif | Изображения/WORD_LOWER_G.gif |
WORD_UPPER (7) | Epilog | Изображения/WORD_UPPER_G.gif | Изображения/WORD_UPPER_N.gif |
WORD_NUMBER_LOWER (8) | Epilog | Изображения/WORD_NUMBER_LOWER_N.gif | Изображения/WORD_NUMBER_LOWER_G.gif |
WORD_NUMBER_UPPER (9) | Epilog | Изображения/WORD_NUMBER_UPPER_N.gif | Изображения/WORD_NUMBER_UPPER_G.gif |
ARITHMETIC (10) | Epilog | Изображения/ARITHMETIC_N.gif | Изображения/ARITHMETIC_G.gif |
ARITHMETIC_ZH (11) | kaiti | Изображения/ARITHMETIC_ZH_N.gif | Изображения/ARITHMETIC_ZH_G.gif |
| Шрифт | Картинка | Шрифт | Картинка | | --- | --- | --- | | | Actionj | Изображения/Font_Actionj.gif | Epilog | Изображения/Font_Epilog.gif | | Fresnel | Изображения/Font_Fresnel.gif | Headache | Изображения/Font_Headache.gif | | Kaiti | Изображения/Font_Kaiti.gif | Lexo | Изображения/Font_Lexo.gif | | Prefix | Изображения/Font_Prefix.gif | Progbot | Изображения/Font_Progbot.gif | | Ransom | Изображения/Font_Ransom.gif | Robot | Изображения/Font_Robot.gif | | Scandal | Изображения/Font_Scandal.gif | | |
Онлайн-демонстрация (услуга больше не предоставляется)
# В этот раз возвращается uyfx
http://wosperry.com.cn:8006/captcha?id=999
# Измените параметр на соответствующий ID и графический проверочный код uyfx, и вернёт true после успешной проверки
http://wosperry.com.cn:8006/captcha/validate?id=999&code=uyfx
Установка
Install-Package Lazy.Captcha.Core
* .NET CLI
* [https://www.nuget.org/packages/Lazy.Captcha.Core](https://www.nuget.org/packages/Lazy.Captcha.Core)
```powershell
dotnet add package Lazy.Captcha.Core
Использование
// По умолчанию используется память (AddDistributedMemoryCache)
builder.Services.AddCaptcha(builder.Configuration);
// Если используется redis для распределённого кэширования
//builder.Services.AddStackExchangeRedisCache(options =>
//{
// options.Configuration = builder.Configuration.GetConnectionString("RedisCache");
// options.InstanceName = "captcha:";
//});
{
"ConnectionStrings": {
// При использовании Redis для кэширования необходимо настроить эту опцию
// Используйте формат, рекомендованный Microsoft.Extensions.Caching.StackExchangeRedis
"RedisCache":
} **Код на C#:**
``` c#
// 全部配置
builder.Services.AddCaptcha(builder.Configuration, option =>
{
option.CaptchaType = CaptchaType.WORD; // 验证码类型
option.CodeLength = 6; // 验证码长度, 要放在CaptchaType设置后. 当类型为算术表达式时,长度代表操作的个数
option.ExpirySeconds = 30; // 验证码过期时间
option.IgnoreCase = true; // 比较时是否忽略大小写
option.StoreageKeyPrefix = ""; // 存储键前缀
option.ImageOption.Animation = true; // 是否启用动画
option.ImageOption.FrameDelay = 30; // 每帧延迟,Animation=true时有效, 默认30
option.ImageOption.Width = 150; // 验证码宽度
option.ImageOption.Height = 50; // 验证码高度
option.ImageOption.BackgroundColor = SixLabors.ImageSharp.Color.White; // 验证码背景色
option.ImageOption.BubbleCount = 2; // 气泡数量
option.ImageOption.BubbleMinRadius = 5; // 气泡最小半径
option.ImageOption.BubbleMaxRadius = 15; // 气泡最大半径
option.ImageOption.BubbleThickness = 1; // 气泡边沿厚度
option.ImageOption.InterferenceLineCount = 2; // 干扰线数量
option.ImageOption.FontSize = 36; // 字体大小
option.ImageOption.FontFamily = DefaultFontFamilys.Instance.Actionj; // 字体
/*
* 中文使用kaiti,其他字符可根据喜好设置(可能部分转字符会出现绘制不出的情况)。
* 当验证码类型为“ARITHMETIC”时,不要使用“Ransom”字体。(运算符和等号绘制不出来)
*/
});
Контроллер:
[Route("captcha")]
[ApiController]
public class CaptchaController : Controller
{
private readonly ICaptcha _captcha;
public CaptchaController(ICaptcha captcha)
{
_captcha = captcha;
}
[HttpGet]
public IActionResult Captcha(string id)
{
var info = _captcha.Generate(id);
// 有多处验证码且过期时间不一样,可传第二个参数覆盖默认配置。
//var info = _captcha.Generate(id,120);
var stream = new MemoryStream(info.Bytes);
return File(stream, "image/gif");
}
/// <summary>
/// 演示时使用HttpGet传参方便,这里仅做返回处理
/// </summary>
[HttpGet("validate")]
public bool Validate(string id, string code)
{
return _captcha.Validate(id, code);
}
/// <summary>
/// 多次校验(https://gitee.com/pojianbing/lazy-captcha/issues/I4XHGM)
/// 演示时使用HttpGet传参方便,这里仅做返回处理
/// </summary>
[HttpGet("validate2")]
public bool Validate2(string id, string code)
{
return _captcha.Validate(id, code, false);
}
}
``` **Вот перевод текста на русский язык:**
// Если содержится китайский, используется шрифт kaiti, иначе текст искажается if (options.CaptchaType.ContainsChinese()) { options.ImageOption.FontFamily = DefaultFontFamilys.Instance.Kaiti; options.ImageOption.FontSize = 24; } else { options.ImageOption.FontFamily = DefaultFontFamilys.Instance.Actionj; }
// Динамический и статический случайный выбор options.ImageOption.Animation = random.Next(2) == 0;
// Количество случайных помех options.ImageOption.InterferenceLineCount = random.Next(1, 4);
// Количество пузырей options.ImageOption.BubbleCount = random.Next(1, 4);
// Другие опции... } }
#### 2. Внедрение RandomCaptcha
```csharp
// Память хранится на основе appsettings.json конфигурации
builder.Services.AddCaptcha(builder.Configuration);
// Если включена случайная проверка кода, пожалуйста, откройте следующие комментарии.
// builder.Services.Add(ServiceDescriptor.Scoped<ICaptcha, RandomCaptcha>());
> RandomCaptcha не включён в библиотеку, только для демонстрации, вы можете настроить все значения CaptchaOptions по своему усмотрению.
### Пользовательский шрифт
#### 1. Поиск шрифта
Вы можете найти понравившийся шрифт на [fontspace](https://www.fontspace.com/new/fonts).
#### 2. Поместите шрифт в проект и установите его как встроенный ресурс.
> Конечно, можно не использовать встроенные ресурсы, а поместить их в определённую директорию, просто немного измените ResourceFontFamilysFinder.
#### 3. Определите класс поиска шрифтов, например, ResourceFontFamilysFinder
```csharp
public class ResourceFontFamilysFinder
{
private static Lazy<List<FontFamily>> _fontFamilies = new Lazy<List<FontFamily>>(() =>
{
var fontFamilies = new List<FontFamily>();
var assembly = Assembly.GetExecutingAssembly();
var names = assembly.GetManifestResourceNames();
if (names?.Length > 0 == true)
{
var fontCollection = new FontCollection();
foreach (var name in names)
{
if (!name.EndsWith("ttf")) continue;
fontFamilies.Add(fontCollection.Add(assembly.GetManifestResourceStream(name)));
}
}
return fontFamilies;
});
public static FontFamily Find(string name)
{
return _fontFamilies.Value.First(e => e.Name == name);
}
}
// Память хранится на основе appsettings.json конфигурации
builder.Services.AddCaptcha(builder.Configuration, options =>
{
// Пользовательский шрифт
options.ImageOption.FontSize = 28;
options.ImageOption.FontFamily = ResourceFontFamilysFinder.Find("KG HAPPY"); // Имя шрифта будет отображаться при открытии файла ttf.
});
Создайте новый mvc-проект, выбрав .Net Framework версии 4.6.1.
Сначала установите SixLabors.ImageSharp.Drawing 1.0.0-beta14
Затем установите Lazy.Captcha.Core 1.1.6
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
CaptchaConfig();
}
private void CaptchaConfig()
{
var captchaService = CaptchaServiceBuilder
.New()
.Width(98)
.Height(35)
.FontSize(20)
.CaptchaType(CaptchaType.ARITHMETIC)
.FontFamily(DefaultFontFamilys.Instance.Ransom)
.InterferenceLineCount(3)
.Animation(false)
.Build();
CaptchaHelper.Initialization(captchaService);
}
}
public class CaptchaController : Controller
{
[HttpGet]
public ActionResult Index()
{
var id = Guid.NewGuid().ToString().Replace("_", "").Replace("-", "");
var captchaData = CaptchaHelper.Generate(id);
var output = new CaptchaResponse
{
Id = id,
Base64 = captchaData.Base64
};
return Json(output, JsonRequestBehavior.AllowGet);
}
/// <summary>
/// Для демонстрации используется HttpGet для удобства передачи параметров, здесь только обработка возврата
/// </summary>
[HttpGet()]
public bool Validate(string id, string code)
{
return CaptchaHelper.Validate(id, code);
}
}
public class CaptchaResponse
{
public string Id { get; set; }
public string Base64 { get; set; }
}
``` **Проект Sample.MvcFramework**
### Версия истории
#### v1.1.6
- добавлена поддержка Framework.
#### v1.1.5
- исправлена ошибка, из-за которой при передаче null в код проверки интерфейса возвращалось значение true.
#### v1.1.4
- оптимизировано отображение мешающих линий, при наличии нескольких линий они соответствующим образом распределяются;
- добавлен параметр конфигурации ForegroundColors для настройки цвета переднего плана;
- проведена оптимизация части кода.
#### v1.1.3
- ImageSharp обновлён до версии 2.1.0.
#### v1.1.2
- улучшен DefaultCaptcha для удобства настройки пользовательских проверочных кодов.
#### v1.1.1
- реализована множественная проверка.
#### v1.1.0
- добавлен параметр FrameDelay для управления задержкой каждого кадра. Параметр действует, когда Animation = true.
- параметр BackgroundColor поддерживает настройку через конфигурационный файл.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )