1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/pojianbing-lazy-captcha

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

LazyCaptcha v2 (на основе SkiaSharp)

Введение

Эмуляция EasyCaptcha и SimpleCaptcha, графический модуль проверки подлинности на основе .Net Standard 2.0. v2 обозначает версию с номером >= 2.0.0, версия < 2.0.0 называется v1. v1 основан на ImageSharp, v2 — на SkiaSharp. SkiaSharp имеет лучшую производительность, но при публикации в Linux требуется установка соответствующих NativeAssets (ImageSharp не требует установки). Адрес документации v1

Сдвижная проверка подлинности: перейдите на lazy-slide-captcha.

Адрес кода Cloud Адрес GitHub

Онлайн-демонстрация

Демонстрация эффекта

CaptchaType Шрифт Статическое изображение Динамическое изображение
DEFAULT (0) Actionj Введите сюда описание изображения Введите сюда описание изображения
CHINESE (1) kaiti Введите сюда описание изображения Введите сюда описание изображения
NUMBER (2) Fresnel Введите сюда описание изображения Введите сюда описание изображения
NUMBER_ZH_CN (3) kaiti Введите сюда описание изображения Введите сюда описание изображения
NUMBER_ZH_HK (4) kait Введите сюда описание изображения Введите сюда описание изображения
WORD (5) Epilog Введите сюда описание изображения Введите сюда описание изображения
WORD_LOWER (6) Epilog Введите сюда описание изображения Введите сюда описание изображения
WORD_UPPER (7) Epilog Введите сюда описание изображения Введите сюда описание изображения
WORD_NUMBER_LOWER (8) Epilog Введите сюда описание изображения Введите сюда описание изображения
WORD_NUMBER_UPPER (9) Epilog Введите сюда описание изображения Введите сюда описание изображения
ARITHMETIC (10) Epilog Введите сюда описание изображения Введите сюда описание изображения
ARITHMETIC_ZH (11) kaiti Введите сюда описание изображения Введите сюда описание изображения
Шрифт Изображение Шрифт Изображение
Actionj Введите сюда описание изображения Epilog Введите сюда описание изображения
Fresnel Введите сюда описание изображения Headache Введите сюда описание изображения
Kaiti Введите сюда описание изображения Lexo Введите сюда описание изображения
Prefix Введите сюда описание изображения Progbot Введите сюда описание изображения
Ransom Введите сюда описание изображения Robot Введите сюда описание изображения
Scandal Введите сюда описание изображения

Установка

Install-Package Lazy.Captcha.Core
dotnet add package Lazy.Captcha.Core

В среде Linux для запуска требуется установить SkiaSharp.NativeAssets.Linux.NoDependencies, дополнительные сведения см. в официальной документации SkiaSharp.

Использование

1. Регистрация сервиса

// По умолчанию используется память (AddDistributedMemoryCache)
builder.Services.AddCaptcha(builder.Configuration);

// Если используется redis для распределённого кэширования
//builder.Services.AddStackExchangeRedisCache(options =>
//{
//    options.Configuration = builder.Configuration.GetConnectionString("RedisCache");
//    options.InstanceName = "captcha:";
//});

2. Конфигурация

appsettings.json (если конфигурация не предоставлена, используются значения по умолчанию)
{
  "ConnectionStrings": {
    // Для использования Redis требуется настройка этого параметра
    // Используйте формат, указанный в Microsoft.Extensions.Caching.StackExchangeRedis
    "RedisCache":

``` ```
localhost,password=Aa123456.  

"CaptchaOptions": {  
    "CaptchaType": 5, // 验证码类型  
    "CodeLength": 4, // 验证码长度, 要放在CaptchaType设置后  
    когда тип равен арифметическому выражению, длина представляет количество операций, например, 2  
    "ExpirySeconds": 60, // 过期秒数  
    "IgnoreCase": true, // сравнение без учета регистра  
    "StoreageKeyPrefix": "", // префикс ключа хранения  
    "ImageOption": {  
        "Animation": false, // анимация  
        "FontSize": 32, // размер шрифта  
        "Width": 100, // ширина капчи  
        "Height": 40, // высота капчи  
        "BubbleMinRadius": 5, // минимальный радиус пузыря  
        "BubbleMaxRadius": 10, // максимальный радиус пузыря  
        "BubbleCount": 3, // количество пузырей  
        "BubbleThickness": 1.0, // толщина границы пузыря  
        "InterferenceLineCount": 3, // количество линий помех  
        "FontFamily": "kaiti", // включает actionj, epilog, fresnel, headache, lexo, prefix, progbot, ransom, robot, scandal, kaiti  
        "FrameDelay": 15, // задержка каждого кадра, действует при Animation = true, по умолчанию 30  
        "BackgroundColor": "#ffffff", // формат: rgb, rgba, rrggbb или rrggbbaa для соответствия веб-синтаксису, по умолчанию #fff  
        "ForegroundColors": "", // формат цвета такой же, как у BackgroundColor, несколько цветов разделяются запятыми, выбираются случайным образом. Если не заполнено, используется значение по умолчанию  
        "Quality": 100, // качество изображения (чем выше качество, тем больше изображение, настройка gif может быть больше)  
        "TextBold": false // жирный шрифт, эта конфигурация добавлена в версии 2.0.3  
    }  
}  
// Все настройки  
builder.Services.AddCaptcha(builder.Configuration, option =>  
{  
    option.CaptchaType = CaptchaType.WORD; // тип капчи  
    option.CodeLength = 6; // длина капчи, должна быть установлена после установки типа капчи. Когда тип равен арифметическому выражению, длина представляет количество операций  
    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 = SkiaSharp.SKColors.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» (операторы и знак равенства не будут отрисовываться).  
    */  
  
     option.ImageOption.TextBold = true;// жирный шрифт, новая конфигурация в версии 2.0.3  
});  

Контроллер

[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);  
    }  
}  
``` **captchaTypes[random.Next(0, captchaTypes.Length)];**

    // 当是算数运算时,CodeLength是指运算数个数
    if (options.CaptchaType.IsArithmetic())
    {
        options.CodeLength = 2;
    }
    else
    {
        options.CodeLength = 4;
    }

    // 如果包含中文时,使用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

// 内存存储, 基于appsettings.json配置
builder.Services.AddCaptcha(builder.Configuration);
// 如果开启随机验证码,请打开下面的注释即可。
// builder.Services.Add(ServiceDescriptor.Scoped<ICaptcha, RandomCaptcha>());

RandomCaptcha不包含在类库内部,仅做自定义演示,您可以根据自己的喜好,随机所有的CaptchaOptions值.

自定义字体

1. 寻找字体

Вы можете через fontspace найти себе любимый шрифт.

2. Поместите шрифт в проект и установите его как встроенный ресурс.

Конечно, вы также можете не использовать его в качестве встроенного ресурса, а поместить в определённую директорию, просто немного измените ResourceFontFamilysFinder.

3. Определите класс поиска шрифтов, например, ResourceFontFamilysFinder

public class ResourceFontFamilysFinder
{
    private static Lazy<List<SKTypeface>> _fontFamilies = new Lazy<List<SKTypeface>>(() =>
    {
        var fontFamilies = new List<SKTypeface>();
        var assembly = Assembly.GetExecutingAssembly();
        var names = assembly.GetManifestResourceNames();

        if (names?.Length > 0 == true)
        {
            foreach (var name in names)
            {
                if (!name.EndsWith("ttf")) continue;
                fontFamilies.Add(SKTypeface.FromStream(assembly.GetManifestResourceStream(name)));
            }
        }

        return fontFamilies;
    });


    public static SKTypeface Find(string name)
    {
        return _fontFamilies.Value.First(e => e.FamilyName == name);
    }
}

4. Установите option

// 内存存储, 基于appsettings.json配置
builder.Services.AddCaptcha(builder.Configuration, options =>
{
    // 自定义字体
    options.ImageOption.FontSize = 28;
    options.ImageOption.FontFamily = ResourceFontFamilysFinder.Find("KG HAPPY"); // 字体的名字在打开ttf文件时会显示
});

.Net Framework

Создайте новый проект MVC, выберите .NET Framework 4.6.2.

1. Установка NuGet

Сначала установите SkiaSharp, затем Lazy.Captcha.Core.

2. Добавьте в Global.asax

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);
    }
}

3. Используйте в Controller

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.

### Часто задаваемые вопросы

#### 1. Как запустить на Linux?

v2.0.9 и выше включает SkiaSharp.NativeAssets.Linux.NoDependencies, поэтому нет необходимости устанавливать другие пакеты зависимостей. Для версий ниже v2.0.9 помимо установки Lazy.Captcha.Core также необходимо установить [SkiaSharp.NativeAssets.Linux.NoDependencies](https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux.NoDependencies), более подробную информацию можно найти в официальной документации [SkiaSharp](https://github.com/mono/SkiaSharp).

Если при запуске возникает ошибка, подобная следующей ([соответствующий issue](https://gitee.com/pojianbing/lazy-captcha/issues/I6CYGA)):

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeInitializationException: The type initializer for 'Lazy.Captcha.Core.DefaultFontFamilys' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SkiaSharp.SKTypeface' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies.

Можно попробовать установить fontconfig.

yum install fontconfig // centos apt-get install fontconfig // ubuntu


#### 2. Что нужно учесть при публикации в Docker?
Необходимо установить fontconfig, подробнее см. в примере проекта Sample.NetCore [Dockerfile](Sample.NetCore/Dockerfile).

#### 3. Как сгенерировать только изображение с кодом проверки без сохранения в LazyCaptcha?

var imageGenerator = new DefaultCaptchaImageGenerator(); var imageGeneratorOption = new CaptchaImageGeneratorOption() { // Обязательно установить ForegroundColors = DefaultColors.Instance.Colors }; var bytes = imageGenerator.Generate("hello", imageGeneratorOption);




### История версий

#### v2.0.9
- Обновлены пакеты зависимостей.
- Встроен SkiaSharp.NativeAssets.Linux.NoDependencies.

#### v2.0.8
- Обновлены пакеты зависимостей.
- Добавлен параметр removeIfFail в CaptchaHelper.Validate.

#### v2.0.7
- Обновлены пакеты зависимостей.
- Исправлена ошибка, когда при создании GIF добавлялись помехи.

#### v2.0.6
- Повышена безопасность математических операций.
- Оптимизирован код.

Подробнее см.: [11 Полное замещение методов цифровой обработки и две проблемы параллелизма](https://gitee.com/pojianbing/lazy-captcha/pulls/11).

#### v2.0.5
- Добавлен removeIfFail, чтобы разработчик мог решить, можно ли использовать код проверки только один раз.

#### v2.0.4
- Обрезаны файлы шрифта kaiti, размер dll уменьшен с 14M до менее 1M.

#### v2.0.3
- Добавлена опция для жирного текста. После настройки текст становится более чётким.
> TextBold= false ![输入图片说明](Images/normal.gif)
TextBold = true    ![输入图片说明](Images/bold.gif) 
- При случайном выборе цвета текста каждый символ имеет свой цвет.
- Оптимизация кода.

#### v2.0.2
- Удалена избыточная информация отладки при запуске.

#### v2.0.1
- Оптимизировано выражение арифметического вычитания, чтобы избежать отрицательных результатов (в настоящее время ограничено двумя операндами).
- Улучшено отображение кода проверки.

#### v2.0.0
- Рисование заменено на SkiaSharp.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Имитация графического проверочного кода EasyCaptcha в .NET Core. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/pojianbing-lazy-captcha.git
git@api.gitlife.ru:oschina-mirror/pojianbing-lazy-captcha.git
oschina-mirror
pojianbing-lazy-captcha
pojianbing-lazy-captcha
master